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