Ideally I would like to avoid overloading too much from the vanilla karaf to avoid too much dependencies to ease the future karaf version upgrades, but since I'm blocked at the moment I can give it a try. The best for me would be to find a nasty workaround with the classloader just to make it work. Which classloader can I set on the current thread to make this work?
Thanks a lot Guillaume for your help! Cheers, Nicolas On Tue, Mar 27, 2018 at 8:09 PM, Guillaume Nodet <gno...@apache.org> wrote: > You're right, I think the current setup on 4.1 is not optimal and a bit > too sensitive to the thread context class loader. > Can you simply remove the xalan and xerces jars from the lib/endorsed > folder and the corresponding export packages in etc/config.properties ? > If you want to use xalan and xerces, deploy them as bundles instead. > > Also, please raise a JIRA so that we can fix that. > > 2018-03-27 18:35 GMT+02:00 Nicolas Brasey <nicolas.bra...@gmail.com>: > >> Yes that was also my understanding and this is what I'm doing. Like I >> said before, it works well from the karaf command but not when the call is >> initiated from somewhere else. >> >> >> >> On Tue, Mar 27, 2018 at 6:21 PM, Guillaume Nodet <gno...@apache.org> >> wrote: >> >>> In Karaf, we ensure that you can use DocumentBuilderFactory#newInst >>> ance(). >>> That's the standard java api to create a Parser and it works well in >>> Karaf. >>> >>> 2018-03-27 18:11 GMT+02:00 Nicolas Brasey <nicolas.bra...@gmail.com>: >>> >>>> Hi Guillaume, >>>> >>>> Thanks for those infos. I'm running Karaf 4.1.2. So I tried to lookup >>>> a DocumentBuilderFactory service but no one are availably in standard in >>>> this karaf version. >>>> >>>> What do you exactly mean by "it should already work" ? If it can help, >>>> I actually based my implementation on the example I found in Karaf, in the >>>> Kar service implementation, the class FeatureDetector. It is parsing an XML >>>> feature file, which is exactly what I'm trying to do as well. My >>>> implementation is 1 to 1. >>>> >>>> So the code seems perfectly working when a karaf command is calling it, >>>> but badly failing when coming from a jetty thread (REST endpoint). >>>> >>>> I would be happy to get away with a nasty workaround, I'm not looking >>>> by a by-the-book implementation :-) >>>> >>>> Thanks again! >>>> Nicolas >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> On Tue, Mar 27, 2018 at 5:02 PM, Guillaume Nodet <gno...@apache.org> >>>> wrote: >>>> >>>>> Here's the way to solve the problem for Karaf 4.2, hopefully I can >>>>> merge it before the release is done: >>>>> https://github.com/apache/karaf/pull/481 >>>>> >>>>> For 4.1, the distribution should already work. >>>>> >>>>> The OSGi 133 (Service Loader) and 702 (XML Parser) are clearly not >>>>> sufficient when working with libraries that have not been built solely for >>>>> OSGi and which use the standard way to use the XML apis. >>>>> >>>>> Fwiw, the openjdk code contains code specific to glassfish osgi >>>>> environment, in a similar way than the above PR. >>>>> >>>>> >>>>> 2018-03-27 16:57 GMT+02:00 Nicolas Brasey <nicolas.bra...@gmail.com>: >>>>> >>>>>> Hi Kerry, >>>>>> >>>>>> Yes it executes in another thread (jetty http executor thread pool), >>>>>> so the context is different. >>>>>> >>>>>> The code actually fails quite deep in the abyss of the java service >>>>>> loader: >>>>>> >>>>>> >>>>>> Caused by: java.util.ServiceConfigurationError: >>>>>> javax.xml.parsers.DocumentBuilderFactory: Provider >>>>>> org.apache.xerces.jaxp.DocumentBuilderFactoryImpl not found >>>>>> at java.util.ServiceLoader.fail(ServiceLoader.java:239) ~[?:?] >>>>>> >>>>>> >>>>>> I should switch the current thread classloader to use the classloader >>>>>> of the class java.util.ServiceLoader? >>>>>> >>>>>> Thanks!! >>>>>> Nicolas >>>>>> >>>>>> >>>>>> >>>>>> On Tue, Mar 27, 2018 at 3:38 PM, Kerry <karaf-user@avionicengineers.c >>>>>> om> wrote: >>>>>> >>>>>>> Hazarding a guess at this but when it fails when called by the camel >>>>>>> route it will be executing on a different thread when then when >>>>>>> executed by >>>>>>> karaf command. You could try and confirm this by surrounding the code >>>>>>> that >>>>>>> is failing with a thread context switch so that it switches to the >>>>>>> context >>>>>>> of the class that has the failing code. >>>>>>> >>>>>>> Kerry >>>>>>> >>>>>>> Sent from BlueMail <http://www.bluemail.me/r?b=12512> >>>>>>> On 27 Mar 2018, at 14:17, Nicolas Brasey <nicolas.bra...@gmail.com> >>>>>>> wrote: >>>>>>>> >>>>>>>> Hi, >>>>>>>> >>>>>>>> I'm feeling frustrated because like everytime I'm adventuring with >>>>>>>> XML in an OSGi context, I end up with classloading issues, and this >>>>>>>> time is >>>>>>>> no exception :-) So I would like to know what/how you guys are doing >>>>>>>> it... >>>>>>>> >>>>>>>> My use case is extremely simple, yet I can't figure out what I'm >>>>>>>> doing wrong. I need to use an XML parser to get a Document object from >>>>>>>> an >>>>>>>> XML file. This XML parsing code is embedded inside a service (DS). The >>>>>>>> weird thing is that If I invoke this service with a karaf command, >>>>>>>> then it >>>>>>>> works fine. If the same code is invoked through a REST endpoint >>>>>>>> (another >>>>>>>> bundle), then I get the following class not found: >>>>>>>> >>>>>>>> Caused by: java.util.ServiceConfigurationError: >>>>>>>> javax.xml.parsers.DocumentBuilderFactory: Provider >>>>>>>> org.apache.xerces.jaxp.DocumentBuilderFactoryImpl not found >>>>>>>> at java.util.ServiceLoader.fail(ServiceLoader.java:239) ~[?:?] >>>>>>>> at java.util.ServiceLoader.access$300(ServiceLoader.java:185) >>>>>>>> ~[?:?] >>>>>>>> at >>>>>>>> java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:372) >>>>>>>> ~[?:?] >>>>>>>> >>>>>>>> >>>>>>>> AFAIK, Karaf is pulling the servicemix implementation of Xerces, >>>>>>>> and I doubled check that the package is available in karaf: >>>>>>>> >>>>>>>> >>>>>>>> dms@root>exports | grep org.apache.xerces.jaxp >>>>>>>> org.apache.xerces.jaxp.datatype >>>>>>>> │ 2.11.0 >>>>>>>> │ >>>>>>>> 348 │ org.apache.servicemix.bundles.xerces >>>>>>>> org.apache.xerces.jaxp.validation >>>>>>>> │ 2.11.0 >>>>>>>> │ >>>>>>>> 348 │ org.apache.servicemix.bundles.xerces >>>>>>>> org.apache.xerces.jaxp >>>>>>>> │ 2.11.0 >>>>>>>> │ >>>>>>>> 348 │ org.apache.servicemix.bundles.xerces >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> So, I don't know what I'm doing wrong here. >>>>>>>> >>>>>>>> Any clue ? >>>>>>>> >>>>>>>> >>>>>>>> Thanks, >>>>>>>> Nicolas >>>>>>>> >>>>>>>> >>>>>> >>>>> >>>>> >>>>> -- >>>>> ------------------------ >>>>> Guillaume Nodet >>>>> >>>>> >>>> >>> >>> >>> -- >>> ------------------------ >>> Guillaume Nodet >>> >>> >> > > > -- > ------------------------ > Guillaume Nodet > >