It's right there, in the package that it should be indexing. Still, when I call
JAXBContext jc = JAXBContext.newInstance("my.package.name");
I get a JAXBException saying that
"my.package.name" doesnt contain ObjectFactory.class or jaxb.index
although it does contain both.
What does work, but isn't quite what I want, is
JAXBContext jc = JAXBContext.newInstance(my.package.name.SomeClass.class);
This question from various other people appears on quite some mailing lists and forums but seemingly doesn't get answers.
I'm running this on OpenJDK 6, so I got the source packages and stepped my debugger into the library. It starts by looking for jaxb.properties, then looks for system properties and failing to find either, it tries to create the default context using com.sun.internal.xml.bind.v2.ContextFactory. In there, the Exception gets thrown (inside ContextFactor.createContext(String ClassLoader, Map)
), but I can't see what's going on because the source isn't here.
ETA:
Judging from the source code for ContentFactory, I found here, this is probably the piece of code that fails to work as intended:
/**
* Look for jaxb.index file in the specified package and load it's 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;
}
From my previous experience, I'm guessing that this has to do with the class loading mechanisms of the OSGi container that this is running in. Unfortunately, I am still a little out of my depth here.
See Question&Answers more detail:
os