Está justo allí, en el paquete que debería indexar. Aún así, cuando llamo¿Por qué JAXB no puede encontrar mi jaxb.index cuando se ejecuta dentro de Apache Felix?
JAXBContext jc = JAXBContext.newInstance("my.package.name");
me siento un JAXBException diciendo que
"my.package.name" doesnt contiene ObjectFactory.class o jaxb.index
aunque contiene ambos.
Lo que funciona, pero no es exactamente lo que quiero, es
JAXBContext jc = JAXBContext.newInstance(my.package.name.SomeClass.class);
Esta pregunta de varias otras personas aparece en bastantes listas de correo y foros, pero aparentemente no obtener respuestas.
Estoy ejecutando esto en OpenJDK 6, así que obtuve los paquetes fuente y puse mi depurador en la biblioteca. Comienza buscando jaxb.properties, luego busca las propiedades del sistema y, si no puede encontrarlas, intenta crear el contexto predeterminado utilizando com.sun.internal.xml.bind.v2.ContextFactory. Allí, se lanza la excepción (dentro de ContextFactor.createContext(String ClassLoader, Map)
), pero no puedo ver qué está sucediendo porque la fuente no está aquí.
ETA:
A juzgar por el código fuente de contentfactory, he encontrado here, esta es probablemente la pieza de código que no funciona según lo previsto:
/**
* 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;
}
Desde mi previousexperience, Supongo que esto tiene que ver con los mecanismos de carga de clases del contenedor OSGi en el que se está ejecutando. Desafortunadamente, todavía estoy un poco fuera de mi alcance aquí.
Quise decir por favor, publique el seguimiento de la pila de excepción. – akarnokd
La publicación ya se está haciendo un poco larga, pero ya he rastreado el origen de la excepción, acabo de publicar esto arriba. –