https://bz.apache.org/bugzilla/show_bug.cgi?id=69528

            Bug ID: 69528
           Summary: archiveIndexStrategy=bloom causes class from
                    multi-release jar to not be found
           Product: Tomcat 9
           Version: 9.0.x
          Hardware: All
                OS: All
            Status: NEW
          Severity: normal
          Priority: P2
         Component: Catalina
          Assignee: dev@tomcat.apache.org
          Reporter: midnjack...@gmail.com
  Target Milestone: -----

Created attachment 39965
  --> https://bz.apache.org/bugzilla/attachment.cgi?id=39965&action=edit
simple app to help reproduce the issue

To reproduce this you need to set the archiveIndexStrategy to bloom in the
Resources component of the context.xml file. 
https://tomcat.apache.org/tomcat-9.0-doc/config/resources.html

Then you need to have your servlet app run some java code which depends on a
multi-release jar in the /WEB-INF/lib folder. I assume you also need to be
compiling / running on the newer version of java so that the class loader tries
to find the newer version of the class from the multi-release jar. 


I attached a simple app (based on the sample app) that calls opentelementry
code (which use Multi-Release jars) from Hello.java. I compiled with java 11 so
you may need to run your tomcat server with that too. 

Steps to Reproduce:
1. Download the attached hello.war file
2. Run tomcat with java 11.
3. Use the manager to deploy the war file
4. Go to http://localhost:8080/hello/hello
5. The page loads meaning the opentelementry code was successfully loaded.
6. in the main tomcat directory, edit the conf/context.xml file To include 
  <Resources archiveIndexStrategy="bloom"/>
7. go back to the manager and redeploy the hello app. (idk if this is really
needed)
8. Reload http://localhost:8080/hello/hello
Now the page will break with the errors I included below. 


Expected behavior: the class loader should be able to find the
Java9VersionSpecific class within the io.opentelemetry.sdk.jar file


javax.servlet.ServletException: Servlet execution threw an exception
        org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
Root Cause

java.lang.NoClassDefFoundError:
io/opentelemetry/sdk/internal/Java9VersionSpecific
       
io.opentelemetry.sdk.internal.JavaVersionSpecific.<clinit>(JavaVersionSpecific.java:43)
        io.opentelemetry.sdk.common.SystemClock.now(SystemClock.java:30)
       
io.opentelemetry.sdk.metrics.SdkMeterProvider.<init>(SdkMeterProvider.java:61)
       
io.opentelemetry.sdk.metrics.SdkMeterProviderBuilder.build(SdkMeterProviderBuilder.java:115)
        mypackage.Hello.doGet(Hello.java:19)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:529)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:623)
        org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
Root Cause

java.lang.ClassNotFoundException:
io.opentelemetry.sdk.internal.Java9VersionSpecific
       
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1308)
       
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1120)
       
io.opentelemetry.sdk.internal.JavaVersionSpecific.<clinit>(JavaVersionSpecific.java:43)
        io.opentelemetry.sdk.common.SystemClock.now(SystemClock.java:30)
       
io.opentelemetry.sdk.metrics.SdkMeterProvider.<init>(SdkMeterProvider.java:61)
       
io.opentelemetry.sdk.metrics.SdkMeterProviderBuilder.build(SdkMeterProviderBuilder.java:115)
        mypackage.Hello.doGet(Hello.java:19)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:529)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:623)
        org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)



Iv'e reproduced this on Linux (Rhel 8) and Mac OS, and with java 11 and 17. 
I reproduced on apache-tomcat-9.0.96


opentelemetry-sdk-common-1.22.0.jar file contents

~/git/tomcat/apache-tomcat-9.0.96/webapps/hello/WEB-INF/lib
❯ jar -t -f opentelemetry-sdk-common-1.22.0.jar
META-INF/
META-INF/MANIFEST.MF
io/
io/opentelemetry/
io/opentelemetry/sdk/
io/opentelemetry/sdk/internal/
...
io/opentelemetry/sdk/internal/JavaVersionSpecific.class
io/opentelemetry/sdk/internal/DaemonThreadFactory.class
io/opentelemetry/sdk/internal/ComponentRegistry.class
io/opentelemetry/sdk/internal/CurrentJavaVersionSpecific.class
...
META-INF/versions/
META-INF/versions/9/
META-INF/versions/9/io/
META-INF/versions/9/io/opentelemetry/
META-INF/versions/9/io/opentelemetry/sdk/
META-INF/versions/9/io/opentelemetry/sdk/internal/
META-INF/versions/9/io/opentelemetry/sdk/internal/Java9VersionSpecific.class
META-INF/versions/9/io/opentelemetry/sdk/internal/CurrentJavaVersionSpecific.class






Other findings:

I also found this tomcat bug where jar resources wouldn't be found if the bloom
filter was enabled. So I suspect that something similar might be happening with
class loading but I have not dug into it yet. 

https://bz.apache.org/bugzilla/show_bug.cgi?id=65586
https://github.com/apache/tomcat/commit/84f13f968f2a07017b73a5f7ef976af49a1b97da


Some background on multi-release jars.
https://openjdk.org/jeps/238
https://www.baeldung.com/java-multi-release-jar

I also found someone else ran into this same Error when using spring, which I
believe uses Tomcat under the hood. They say they worked around this by just
expanding the jar. That may be one way to workaround the issue... but I don't
think its viable for my use case. 

https://github.com/open-telemetry/opentelemetry-java/issues/4033

-- 
You are receiving this mail because:
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to