Именно там, в пакете, он должен индексироваться. Тем не менее, когда я звоню
JAXBContext jc = JAXBContext.newInstance("my.package.name");
Я получаю исключение JAXBException, говорящее, что
"my.package.name" не содержит ObjectFactory.class или jaxb.index
хотя он содержит оба.
Что работает, но не совсем то, что я хочу,
JAXBContext jc = JAXBContext.newInstance(my.package.name.SomeClass.class);
Этот вопрос от других людей появляется в некоторых списках рассылки и форумах, но, похоже, не получает ответов.
Я запускаю это на OpenJDK 6, поэтому я получил исходные пакеты и отступил от своего отладчика в библиотеке. Он начинается с поиска jaxb.properties, затем ищет системные свойства и не находит их, он пытается создать контекст по умолчанию, используя com.sun.internal.xml.bind.v2.ContextFactory. Там исключается Исключение (внутри ContextFactor.createContext(String ClassLoader, Map)
), но я не вижу, что происходит, потому что источника здесь нет.
ETA
Судя по исходному коду ContentFactory, я нашел здесь, это, вероятно, часть кода, которая не работает должным образом:
/**
* Look for jaxb.index file in the specified package and load it contents
*
* @param pkg package name to search in
* @param classLoader ClassLoader to search in
* @return a List of Class objects to load, null if there weren't any
* @throws IOException if there is an error reading the index file
* @throws JAXBException if there are any errors in the index file
*/
private static List<Class> loadIndexedClasses(String pkg, ClassLoader classLoader) throws IOException, JAXBException {
final String resource = pkg.replace('.', '/') + "/jaxb.index";
final InputStream resourceAsStream = classLoader.getResourceAsStream(resource);
if (resourceAsStream == null) {
return null;
}
Из моего предыдущего опыта, я предполагаю, что это связано с механизмами загрузки классов из контейнера OSGi, в котором он работает. К сожалению, я все еще немного не в своей глубине.