Hi ! Indeed, it's a classloading problem, thanks.
I've investigated a bit more on OSGi classloading and I've a question about the choice of putting *xercesImpl* lib in the *<SMX_HOME>/lib/endorsed* folder. If I understood correctly, if a lib is contained in *endorsed *folder and its packages are exported / delegated (thanks to *<SMX_HOME>/etc/config.properties*), then its classes will be loaded with the Bootstrap / Primordial classloader. This is the case for *XercesImpl*. But, since : - Bootstrap / Primordial classloader has no parent (-> see schema below) - Classloaders can reach classes loaded by their parents but the opposite is not true (e.g. Extension classloader can't reach classes loaded by System / Application classloader) - XmlResolver has its own classloader (because it's loaded as a bundle and its packages aren't exported/delegated) - *XercesImpl *uses *XmlResolver* shouldn't *XmlResolver *be also added in *endorsed* folder and has its classes exported/delegated (as you said Jb) *by default* ? Is it the only solution if we want to use *xmlResolver *from *Xerces* ? Then, every bundles used by *Xerces *should be in *endorsed *? Why having put *xercesImpl *in *endorsed *folder ? Why not set *xercesImpl *as a bundle at the same level of *xmlResolver *? (there is a good reason but I can't determine which one). It's always easier to understand with a schema, so here is the OSGi classloading hierarchy (even if I'm sure you know it ;) ) Bootstrap / Primordial classloader (classes from <JRE_HOME>/lib : rt.jar, i18n.jar, ... and also in our case from <SMX_HOME>/lib/endorsed : xercesImpl-2.11.0.jar, ...) | | v Extension classloader (classes from <JRE_HOME>/lib/ext/ and <SMX_HOME>/lib/ext) | | v System / Application classloader (classes from classpath) | | v OSGi environment (URLClassloader) (classes in osgi-core.jar, felix-framework.jar, ... and classes from <SMX_HOME>/lib) | | | | v v Bundle A classloader xmlResolver classloader (org.apache.servicemix.bundles.xmlresolver-1.2_5.jar) Thanks, Jean-Baptiste Martin Le mar. 26 avr. 2016 à 07:08, Jean-Baptiste Onofré <[email protected]> a écrit : > Hi, > > your problem is that xerces comes from different classloader. > > Your bundle should not export these package: just import or private. > > As the resolver uses xerces, they should go in the same classloader (so > from lib/endorsed). > > Let me double check your use case. > > Regards > JB > > On 04/21/2016 12:03 PM, Jean-Baptiste MARTIN wrote: > > Hello, > > > > I've built a simple bundle which instanciate a > > "org.apache.xerces.util.XMLCatalogResolver" object. > > In my pom, I've had these dependencies and plugin : > > > > <build> > > <plugins> > > <!-- Plugin to create bundle --> > > <plugin> > > <groupId>org.apache.felix</groupId> > > <artifactId>maven-bundle-plugin</artifactId> > > <version>2.5.4</version> > > <extensions>true</extensions> > > <configuration> > > <instructions> > > <Import-Package>*</Import-Package> > > <Export-Package>myXMLResolver</Export-Package> > > </instructions> > > </configuration> > > </plugin> > > </plugins> > > </build> > > <dependencies> > > <dependency> > > <groupId>org.apache.camel</groupId> > > <artifactId>camel-core</artifactId> > > <version>2.16.1</version> > > <type>bundle</type> > > <scope>provided</scope> > > </dependency> > > <!-- xerces is provided in /lib/endorsed/ folder of ServiceMix > --> > > <dependency> > > <groupId>xerces</groupId> > > <artifactId>xercesImpl</artifactId> > > <version>2.11.0</version> > > <scope>provided</scope> > > </dependency> > > <dependency> > > <groupId>org.apache.servicemix.bundles</groupId> > > > > <artifactId>org.apache.servicemix.bundles.xmlresolver</artifactId> > > <version>1.2_5</version> > > <type>bundle</type> > > <scope>compile</scope> > > </dependency> > > </dependencies> > > </build> > > > > > > Testing the bundle "locally" (within the IDE) is working fine. > > Deploying it into the /deploy folder is also fine (its status is > "Active"). > > When running it (through Camel route), I get this stacktrace : > > > > Caused by: java.lang.NoClassDefFoundError: > > org/apache/xml/resolver/CatalogManager > > at org.apache.xerces.util.XMLCatalogResolver.init(Unknown Source)[:] > > at org.apache.xerces.util.XMLCatalogResolver.<init>(Unknown > Source)[:] > > at org.apache.xerces.util.XMLCatalogResolver.<init>(Unknown > Source)[:] > > at > > > myXMLResolver.MainBean.run(MainBean.java:17)[241:test.myXMLResolver:0.0.1.SNAPSHOT] > > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native > > Method)[:1.7.0_95] > > at > > > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)[:1.7.0_95] > > at > > > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)[:1.7.0_95] > > at java.lang.reflect.Method.invoke(Method.java:606)[:1.7.0_95] > > at > > > org.apache.camel.component.bean.MethodInfo.invoke(MethodInfo.java:408)[199:org.apache.camel.camel-core:2.16.1] > > at > > > org.apache.camel.component.bean.MethodInfo$1.doProceed(MethodInfo.java:279)[199:org.apache.camel.camel-core:2.16.1] > > at > > > org.apache.camel.component.bean.MethodInfo$1.proceed(MethodInfo.java:252)[199:org.apache.camel.camel-core:2.16.1] > > ... 19 more > > > > > > Ok, the class "CatalogManager" from package "org.apache.xml.resolver" > > existed in compile-time but not in run-time. So I deploy > > "org.apache.servicemix.bundles.xmlresolver" dependency into /deploy > folder. > > When executing in Karaf console the command "bundle:headers > > <xmlresolver_bundle_id>", I get : > > Export-Package = > > ... > > > org.apache.xml.resolver;uses:="org.apache.xml.resolver.helpers,javax.xml.parsers,org.apache.xml.resolver.readers";version=1.2, > > ... > > > > Nevertheless, same stacktrace appears. > > > > Even if I add the package "org.apache.xml.resolver" in the > <Import-Package> > > I get the same error... > > Any idea of what's going on ? > > > > > > I'm using ServiceMix 6.1.0 (w/ Karaf 3.0.5), running on Java 7. > > > > > > Thanks, > > Jean-Baptiste Martin > > > > -- > Jean-Baptiste Onofré > [email protected] > http://blog.nanthrax.net > Talend - http://www.talend.com >
