Warum findet JAXB meinen jaxb.index nicht, wenn er in Apache Felix ausgeführt wird?

Es ist genau dort, in dem Paket, dass es indiziert werden soll. Trotzdem, wenn ich anrufe

<code>JAXBContext jc = JAXBContext.newInstance("my.package.name");
</code>

Ich bekomme eine JAXBException, die das sagt

"my.package.name" enthält weder ObjectFactory.class noch jaxb.index

obwohl es beides enthält.

Was funktioniert, aber nicht ganz das ist, was ich will

<code>JAXBContext jc = JAXBContext.newInstance(my.package.name.SomeClass.class);
</code>

Diese Frage von verschiedenen anderen Leuten taucht in einigen Mailinglisten und Foren auf, wird aber anscheinend nicht beantwortet.

Ich führe dies unter OpenJDK 6 aus, also habe ich die Quellpakete erhalten und meinen Debugger in die Bibliothek gestellt. Zunächst wird nach jaxb.properties gesucht, dann werden Systemeigenschaften gesucht. Andernfalls wird versucht, den Standardkontext mithilfe von com.sun.internal.xml.bind.v2.ContextFactory zu erstellen. Dort wird die Exception geworfen (insideContextFactor.createContext(String ClassLoader, Map)), aber ich kann nicht sehen, was los ist, weil die Quelle nicht hier ist.

ETA:

Nach dem Quellcode für ContentFactory zu urteilen, habe ich gefundenHierDies ist wahrscheinlich der Code, der nicht wie beabsichtigt funktioniert:

<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>

Von meinemBisherige ErfahrungIch vermute, dass dies mit den Klassenlademechanismen des OSGi-Containers zu tun hat, in dem dies ausgeführt wird. Leider bin ich hier immer noch ein wenig überfordert.

Antworten auf die Frage(10)

Ihre Antwort auf die Frage