Hi Christopher,

unfortunately that didn't change the observable behavior - exact same
error message as when the JARs were in the application's lib folder.

 so long ... Nicolai



On 26.07.2018 17:37, Christopher Schultz wrote:
> Nicolai,
> 
> On 7/26/18 6:41 AM, Nicolai Parlog wrote:
>> Hi!
> 
>> TL;DR: On Java 10.0.1, a web app in Tomcat 9.0.8.0 has no access
>> to JAXB even though its reference implementation is present on
>> the class path.
> 
>> (This looks like a bug to me, but "Before you report a bug"
>> urged me to ask here first. :) )
> 
>> NOTE: I already asked [on 
>> StackOverflow](https://stackoverflow.com/q/51518781/2525313),
>> where the question is a little more readable.
> 
>> On to the details...
> 
>> # The Situation
> 
>> We have a web app that runs on Tomcat and depends on JAXB.
>> During our migration to Java 9 we opted for adding [the JAXB
>> reference implementation as a regular 
>> dependency](https://stackoverflow.com/a/48204154/2525313).
> 
>> Everything worked when launching the app from the IDE [with 
>> embedded 
>> Tomcat](https://tomcat.apache.org/tomcat-9.0-doc/api/org/apache/catali
>
>> 
na/startup/Tomcat.html),
> 
> 
> but when running it on a real Tomcat instance, I get this error:
> 
>> Caused by: java.lang.RuntimeException: 
>> javax.xml.bind.JAXBException: Implementation of JAXB-API has not 
>> been found on module path or classpath. - with linked exception:
>>  [java.lang.ClassNotFoundException: 
>> com.sun.xml.internal.bind.v2.ContextFactory] at [... our-code
>> ...] Caused by: javax.xml.bind.JAXBException: Implementation of
>> JAXB-API has not been found on module path or classpath. at 
>> javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:278)
>>  ~[jaxb-api-2.3.0.jar:2.3.0] at 
>> javax.xml.bind.ContextFinder.find(ContextFinder.java:421) 
>> ~[jaxb-api-2.3.0.jar:2.3.0] at 
>> javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:721) 
>> ~[jaxb-api-2.3.0.jar:2.3.0] at 
>> javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:662) 
>> ~[jaxb-api-2.3.0.jar:2.3.0] at [... our-code ...] Caused by: 
>> java.lang.ClassNotFoundException: 
>> com.sun.xml.internal.bind.v2.ContextFactory at 
>> jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.ja
>
>> 
va:582)
> 
> 
> ~[?:?]
>> at 
>> jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders
>
>> 
.java:190)
> 
> 
> ~[?:?]
>> at java.lang.ClassLoader.loadClass(ClassLoader.java:499) ~[?:?]
>> at 
>> javax.xml.bind.ServiceLoaderUtil.nullSafeLoadClass(ServiceLoaderUtil.j
>
>> 
ava:122)
> 
> 
> ~[jaxb-api-2.3.0.jar:2.3.0]
>> at 
>> javax.xml.bind.ServiceLoaderUtil.safeLoadClass(ServiceLoaderUtil.java:
>
>> 
155)
> 
> 
> ~[jaxb-api-2.3.0.jar:2.3.0]
>> at 
>> javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:276)
>>  ~[jaxb-api-2.3.0.jar:2.3.0] at 
>> javax.xml.bind.ContextFinder.find(ContextFinder.java:421) 
>> ~[jaxb-api-2.3.0.jar:2.3.0] at 
>> javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:721) 
>> ~[jaxb-api-2.3.0.jar:2.3.0] at 
>> javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:662) 
>> ~[jaxb-api-2.3.0.jar:2.3.0] at [... our-code ...]
> 
>> Note:
> 
>>> Implementation of JAXB-API has not been found on module path
>>> or classpath.
> 
>> These are the relevant files in `webapps/$app/WEB-INF/lib`:
> 
>> jaxb-api-2.3.0.jar jaxb-core-2.3.0.jar jaxb-impl-2.3.0.jar
> 
>> What is going on here?
> 
>> # What I tried
> 
>> ## Adding JARs
> 
>> Maybe it helps to add the JARs to Tomcat's class path in 
>> `setenv.sh`?
> 
>> CLASSPATH= .../webapps/$app/WEB-INF/lib/jaxb-api-2.3.0.jar: 
>> .../webapps/$app/WEB-INF/lib/jaxb-impl-2.3.0.jar: 
>> .../webapps/$app/WEB-INF/lib/jaxb-core-2.3.0.jar: 
>> .../webapps/$app/WEB-INF/lib/javax.activation-1.2.0.jar
> 
>> Nope:
> 
>> Caused by: javax.xml.bind.JAXBException: ClassCastException: 
>> attempting to cast 
>> jar:file:.../webapps/$app/WEB-INF/lib/jaxb-api-2.3.0.jar!/javax/xml/bi
>
>> 
nd/JAXBContext.class
>> to 
>> jar:file:.../webapps/$app/WEB-INF/lib/jaxb-api-2.3.0.jar!/javax/xml/bi
>
>> 
nd/JAXBContext.class.
> 
> 
> Please make sure that you are specifying the proper ClassLoader.
>> at 
>> javax.xml.bind.ContextFinder.handleClassCastException(ContextFinder.ja
>
>> 
va:157)
> 
> 
> ~[jaxb-api-2.3.0.jar:2.3.0]
>> at 
>> javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:300)
>>  ~[jaxb-api-2.3.0.jar:2.3.0] at 
>> javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:286)
>>  ~[jaxb-api-2.3.0.jar:2.3.0] at 
>> javax.xml.bind.ContextFinder.find(ContextFinder.java:409) 
>> ~[jaxb-api-2.3.0.jar:2.3.0] at 
>> javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:721) 
>> ~[jaxb-api-2.3.0.jar:2.3.0] at 
>> javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:662) 
>> ~[jaxb-api-2.3.0.jar:2.3.0] at 
>> de.disy.gis.webmapserver.factory.DefaultWmsRequestFactory.initializeCo
>
>> 
mmandExtractor(DefaultWmsRequestFactory.java:103)
> 
> 
> ~[cadenza-gis-webmapserver-7.7-SNAPSHOT.jar:7.6]
>> at 
>> de.disy.gis.webmapserver.factory.DefaultWmsRequestFactory.lambda$new$0
>
>> 
(DefaultWmsRequestFactory.java:87)
> 
> 
> ~[cadenza-gis-webmapserver-7.7-SNAPSHOT.jar:7.6]
> 
>> That's clearly the same class, so apparently it has been loaded
>> by two class loaders. I suspect [the system class loader and the
>> app's class 
>> loader](https://tomcat.apache.org/tomcat-9.0-doc/class-loader-howto.ht
>
>> 
ml#Class_Loader_Definitions),
> 
> 
> but why would loading `JAXBContext` be delegated to the system
> class
>> loader once but not always? It almost looks as if the delegation
>>  behavior of the app's class loader changes while the program
>> runs.
> 
>> ## Adding the module
> 
>> I don't really want to add _java.xml.bind_, but I tried it
>> anyways by adding this to `catalina.sh`:
> 
>> JDK_JAVA_OPTIONS="$JDK_JAVA_OPTIONS --add-modules=java.xml.bind"
> 
>> Doesn't work either, though:
> 
>> Caused by: java.lang.ClassCastException: 
>> java.xml.bind/com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl
>>  cannot be cast to com.sun.xml.bind.v2.runtime.JAXBContextImpl
>> at [... our-code ...]
> 
>> Apart from the different class and stack trace, this is in line 
>> with what happened earlier: The class `JAXBContextImpl` was
>> loaded twice, once from _java.xml.bind_ (must have been the
>> system class loader) and one other time (I assume by the app's
>> loader from the JAR).
> 
>> ## Searching for bugs
> 
>> [Searching Tomcat's bug 
>> database](https://bz.apache.org/bugzilla/query.cgi) I found 
>> [#62559](https://bz.apache.org/bugzilla/show_bug.cgi?id=62559). 
>> Could that be the same error?
> 
> You will likely need to include these classes in Tomcat's 
> CATALINA_BASE/lib directory; it appears that placing them into
> your application is causing some confusion.
> 
> You should not put any JAR files that are bundled into your 
> application into Tomcat's CLASSPATH. Better to simply move the
> JARs from your application's WEB-INF/lib directory to Tomcat's 
> CATALINA_BASE/lib directory and make no changes to the CLASSPATH.
> 
> -chris
> 
> ---------------------------------------------------------------------
>
> 
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
> For additional commands, e-mail: users-h...@tomcat.apache.org
> 

-- 

PGP Key:
    http://keys.gnupg.net/pks/lookup?op=vindex&search=0xCA3BAD2E9CCCD509

Web:
    http://blog.codefx.org
        a blog about software development
    https://courses.codefx.org
        high-quality Java courses

Social:
    https://twitter.com/nipafx
    http://youtube.com/c/codefx

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org

Reply via email to