In Karaf, we ensure that you can use DocumentBuilderFactory#newInstance(). 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-u...@avionicengineers.com> >>> 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