Por que o JAXB não pode encontrar o meu jaxb.index ao rodar dentro do Apache Felix?
Está bem aí, no pacote que deveria estar indexando. Ainda assim, quando eu chamo
<code>JAXBContext jc = JAXBContext.newInstance("my.package.name"); </code>
Eu recebo um JAXBException dizendo que
"my.package.name" não contém ObjectFactory.class ou jaxb.index
embora contenha ambos.
O que funciona, mas não é bem o que eu quero, é
<code>JAXBContext jc = JAXBContext.newInstance(my.package.name.SomeClass.class); </code>
Esta pergunta de várias outras pessoas aparece em algumas listas de discussão e fóruns, mas aparentemente não obtém respostas.
Estou executando isso no OpenJDK 6, então peguei os pacotes de código-fonte e coloquei meu depurador na biblioteca. Ele inicia procurando por jaxb.properties e, em seguida, procura por propriedades do sistema e falha ao localizar um dos dois, ele tenta criar o contexto padrão usando com.sun.internal.xml.bind.v2.ContextFactory. Lá, a exceção é jogada (dentroContextFactor.createContext(String ClassLoader, Map)
), mas não consigo ver o que está acontecendo porque a fonte não está aqui.
ETA:
A julgar pelo código fonte do ContentFactory, encontreiAqui, esta é provavelmente a parte do código que não funciona como pretendido:
<code>/** * 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; } </code>
Do meuanterior experiência, Eu estou supondo que isso tem a ver com os mecanismos de carregamento de classe do contêiner OSGi que isso está sendo executado. Infelizmente, ainda estou um pouco fora da minha profundidade aqui.