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

Reply via email to