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: [email protected]
Reporter: [email protected]
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: [email protected]
For additional commands, e-mail: [email protected]