0

I use Java 17 with Jetty 11.0.9. I started Jetty with the following command

java --add-opens=java.base/java.lang=ALL-UNNAMED -jar start.jar

Then I am facing exception followings.

2022-05-06 16:40:45.314:WARN :oejw.WebAppContext:main: Failed startup of context o.e.j.w.WebAppContext@593aaf41{vte.cx (alpha),/vtecx,file:///usr/local/jetty-home-11.0.9/webapps/vtecx/,UNAVAILABLE}{/usr/local/jetty-home-11.0.9/webapps/vtecx}
java.lang.IllegalAccessError: class jdk.internal.reflect.ConstructorAccessorImpl loaded by javassist.Loader @46292372 cannot access jdk/internal/reflect superclass jdk.internal.reflect.MagicAccessorImpl
    at java.base/java.lang.ClassLoader.defineClass1(Native Method)
    at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1012)
    at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:874)
    at javassist.Loader.findClass(Loader.java:419)
    at javassist.Loader.loadClass(Loader.java:350)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
    at java.base/java.lang.ClassLoader.defineClass1(Native Method)
    at java.base/java.lang.System$2.defineClass(System.java:2303)
    at java.base/jdk.internal.reflect.ClassDefiner.defineClass(ClassDefiner.java:66)
    at java.base/jdk.internal.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:401)
    at java.base/jdk.internal.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:395)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:318)
    at java.base/jdk.internal.reflect.MethodAccessorGenerator.generate(MethodAccessorGenerator.java:394)
    at java.base/jdk.internal.reflect.MethodAccessorGenerator.generateConstructor(MethodAccessorGenerator.java:92)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:65)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
    at java.base/java.lang.reflect.ReflectAccess.newInstance(ReflectAccess.java:128)
    at java.base/jdk.internal.reflect.ReflectionFactory.newInstance(ReflectionFactory.java:347)
    at java.base/java.lang.Class.newInstance(Class.java:645)
    at org.msgpack.template.builder.ReflectionTemplateBuilder$ReflectionClassTemplate.read(ReflectionTemplateBuilder.java:132)
    at org.msgpack.template.AbstractTemplate.read(AbstractTemplate.java:31)
    at org.msgpack.template.ListTemplate.read(ListTemplate.java:66)
    at org.msgpack.template.ListTemplate.read(ListTemplate.java:27)
    at org.msgpack.template.builder.ReflectionTemplateBuilder$FieldTemplateImpl.read(ReflectionTemplateBuilder.java:70)
    at org.msgpack.template.builder.ReflectionTemplateBuilder$ReflectionClassTemplate.read(ReflectionTemplateBuilder.java:143)
    at org.msgpack.template.AbstractTemplate.read(AbstractTemplate.java:31)
    at org.msgpack.MessagePack.read(MessagePack.java:388)
    at org.msgpack.MessagePack.read(MessagePack.java:371)
    at jp.reflexworks.atom.mapper.FeedTemplateMapper.fromMessagePack(FeedTemplateMapper.java:1014)

I have confirmed that it works fine in a non-servlet standalone. Does the --add-opens parameter work correctly in a servlet environment? Or could it be due to other causes such as javassist?

The unit test does indeed succeed. It does not fail all the way on Jetty either, it seems to be processed correctly up to the halfway point. It also looks like the error occurs when running multiple runs in a thread.

--list-config is followings.

$ java -jar start.jar --list-config

Enabled Modules:
----------------
  0) bytebufferpool            transitive provider of bytebufferpool for server
                               ini template available with --add-module=bytebufferpool
  1) resources                 transitive provider of resources for logging-jetty
  2) logging/slf4j             transitive provider of logging/slf4j for logging-jetty
                               dynamic dependency of logging-jetty
  3) logging-jetty             transitive provider of logging for threadpool
                               transitive provider of logging for server
  4) threadpool                transitive provider of threadpool for server
                               ini template available with --add-module=threadpool
  5) server                    ${jetty.base}/start.d/server.ini
  6) jndi                      transitive provider of jndi for plus
  7) security                  transitive provider of security for webapp
                               transitive provider of security for plus
  8) servlet                   transitive provider of servlet for webapp
  9) webapp                    transitive provider of webapp for plus
                               transitive provider of webapp for deploy
                               ini template available with --add-module=webapp
 10) plus                      transitive provider of plus for annotations
 11) annotations               transitive provider of annotations for websocket-jetty
 12) client                    transitive provider of client for websocket-jakarta
 13) deploy                    ${jetty.base}/start.d/deploy.ini
 14) http                      ${jetty.base}/start.d/http.ini
 15) ssl                       ${jetty.base}/start.d/ssl.ini
 16) https                     ${jetty.base}/start.d/https.ini
 17) rewrite                   ${jetty.base}/start.d/rewrite.ini
 18) websocket-jakarta         transitive provider of websocket-jakarta for websocket
 19) websocket-jetty           transitive provider of websocket-jetty for websocket
 20) websocket                 ${jetty.base}/start.d/websocket.ini

Java Environment:
-----------------
 java.home = /Library/Java/JavaVirtualMachines/jdk-17.0.3.jdk/Contents/Home
 java.vm.vendor = Oracle Corporation
 java.vm.version = 17.0.3+8-LTS-111
 java.vm.name = Java HotSpot(TM) 64-Bit Server VM
 java.vm.info = mixed mode, sharing
 java.runtime.name = Java(TM) SE Runtime Environment
 java.runtime.version = 17.0.3+8-LTS-111
 java.io.tmpdir = /var/folders/jd/sclp7v4j4fxgmx00hw47q1vm0000gn/T/
 user.dir = /usr/local/jetty-home-11.0.9
 user.language = ja
 user.country = JP

Jetty Environment:
------------------
 jetty.version = 11.0.9
 jetty.tag.version = jetty-11.0.9
 jetty.build = 243a48a658a183130a8c8de353178d154ca04f04
 jetty.home = /usr/local/jetty-home-11.0.9
 jetty.base = /usr/local/jetty-home-11.0.9

Config Search Order:
--------------------
 <command-line>
 ${jetty.base} -> /usr/local/jetty-home-11.0.9
 ${jetty.home} -> /usr/local/jetty-home-11.0.9

System Properties:
------------------
 (no system properties specified)

Properties:
-----------
 java.version = 17.0.3
 java.version.major = 17
 java.version.micro = 3
 java.version.minor = 0
 java.version.platform = 17
 jetty.base = /usr/local/jetty-home-11.0.9
 jetty.base.uri = file:///usr/local/jetty-home-11.0.9
 jetty.home = /usr/local/jetty-home-11.0.9
 jetty.home.uri = file:///usr/local/jetty-home-11.0.9
 jetty.sslContext.keyStorePassword = OBF:xxxxxxxxxx
 jetty.webapp.addServerClasses = org.eclipse.jetty.logging.,${jetty.home.uri}/lib/logging/,org.slf4j.
 runtime.feature.alpn = true
 slf4j.version = 2.0.0-alpha6

Jetty Server Classpath:
-----------------------
Version Information on 36 entries in the classpath.
Note: order presented here is how they would appear on the classpath.
      changes to the --module=name command line options will be reflected here.
 0:                    (dir) | ${jetty.base}/resources
 1:             2.0.0-alpha6 | ${jetty.base}/lib/logging/slf4j-api-2.0.0-alpha6.jar
 2:                   11.0.9 | ${jetty.base}/lib/logging/jetty-slf4j-impl-11.0.9.jar
 3:                    5.0.2 | ${jetty.base}/lib/jetty-jakarta-servlet-api-5.0.2.jar
 4:                   11.0.9 | ${jetty.base}/lib/jetty-http-11.0.9.jar
 5:                   11.0.9 | ${jetty.base}/lib/jetty-server-11.0.9.jar
 6:                   11.0.9 | ${jetty.base}/lib/jetty-xml-11.0.9.jar
 7:                   11.0.9 | ${jetty.base}/lib/jetty-util-11.0.9.jar
 8:                   11.0.9 | ${jetty.base}/lib/jetty-io-11.0.9.jar
 9:                   11.0.9 | ${jetty.base}/lib/jetty-jndi-11.0.9.jar
10:                   11.0.9 | ${jetty.base}/lib/jetty-security-11.0.9.jar
11:                   11.0.9 | ${jetty.base}/lib/jetty-servlet-11.0.9.jar
12:                   11.0.9 | ${jetty.base}/lib/jetty-webapp-11.0.9.jar
13:                   11.0.9 | ${jetty.base}/lib/jetty-plus-11.0.9.jar
14:                    2.0.0 | ${jetty.base}/lib/jakarta.transaction-api-2.0.0.jar
15:                   11.0.9 | ${jetty.base}/lib/jetty-annotations-11.0.9.jar
16:                      9.2 | ${jetty.base}/lib/annotations/asm-9.2.jar
17:                      9.2 | ${jetty.base}/lib/annotations/asm-analysis-9.2.jar
18:                      9.2 | ${jetty.base}/lib/annotations/asm-commons-9.2.jar
19:                      9.2 | ${jetty.base}/lib/annotations/asm-tree-9.2.jar
20:                    2.0.0 | ${jetty.base}/lib/annotations/jakarta.annotation-api-2.0.0.jar
21:                   11.0.9 | ${jetty.base}/lib/jetty-client-11.0.9.jar
22:                   11.0.9 | ${jetty.base}/lib/jetty-alpn-client-11.0.9.jar
23:                   11.0.9 | ${jetty.base}/lib/jetty-deploy-11.0.9.jar
24:                   11.0.9 | ${jetty.base}/lib/jetty-rewrite-11.0.9.jar
25:                   11.0.9 | ${jetty.base}/lib/websocket/websocket-core-common-11.0.9.jar
26:                   11.0.9 | ${jetty.base}/lib/websocket/websocket-core-client-11.0.9.jar
27:                   11.0.9 | ${jetty.base}/lib/websocket/websocket-core-server-11.0.9.jar
28:                   11.0.9 | ${jetty.base}/lib/websocket/websocket-servlet-11.0.9.jar
29:                    2.0.0 | ${jetty.base}/lib/websocket/jetty-jakarta-websocket-api-2.0.0.jar
30:                   11.0.9 | ${jetty.base}/lib/websocket/websocket-jakarta-client-11.0.9.jar
31:                   11.0.9 | ${jetty.base}/lib/websocket/websocket-jakarta-common-11.0.9.jar
32:                   11.0.9 | ${jetty.base}/lib/websocket/websocket-jakarta-server-11.0.9.jar
33:                   11.0.9 | ${jetty.base}/lib/websocket/websocket-jetty-api-11.0.9.jar
34:                   11.0.9 | ${jetty.base}/lib/websocket/websocket-jetty-common-11.0.9.jar
35:                   11.0.9 | ${jetty.base}/lib/websocket/websocket-jetty-server-11.0.9.jar

Jetty Active XMLs:
------------------
 ${jetty.base}/etc/jetty-bytebufferpool.xml
 ${jetty.base}/etc/jetty-threadpool.xml
 ${jetty.base}/etc/jetty.xml
 ${jetty.base}/etc/jetty-webapp.xml
 ${jetty.base}/etc/jetty-deploy.xml
 ${jetty.base}/etc/jetty-http.xml
 ${jetty.base}/etc/jetty-ssl.xml
 ${jetty.base}/etc/jetty-ssl-context.xml
 ${jetty.base}/etc/jetty-https.xml
 ${jetty.base}/etc/jetty-rewrite.xml
 ${jetty.base}/etc/rewrite-rules.xml

takezaki
  • 21
  • 1
  • 4
  • Edit your question and include the output of `java -jar start.jar --list-config`, this will tell us your configuration. – Joakim Erdfelt May 06 '22 at 14:14
  • This is far more likely to be a javassist or msgpack issue, not a jetty issue. – Joakim Erdfelt May 06 '22 at 14:14
  • If you are using powermock as well, consider https://stackoverflow.com/questions/50456726/mockclassloader-cannot-access-jdk-internal-reflect-superclass-jdk-internal-refle – Joakim Erdfelt May 06 '22 at 14:15
  • I'm not using powermock. At least it works fine standalone and the error only occurs through Jetty. – takezaki May 06 '22 at 14:55
  • Your `start.jar --list-config` might reveal something useful – Joakim Erdfelt May 06 '22 at 15:23
  • I've added ``start.jar --list-config`` – takezaki May 09 '22 at 07:42
  • 1
    So your javassist lives in your webapp's `WEB-INF/lib`? And it's attempting to wrap the Jetty `WebAppClassLoader` which is the servlet isolation layer between webapps. But how confident are you that this javassist classloader is doing the right thing for both Java 11 with JPMS and the Servlet inverted classloader requirements? – Joakim Erdfelt May 09 '22 at 12:28
  • Yes. There are javassist(3.18.0-GA) and msgpack(0.6.12) libs in WEB-INF/lib. As pointed out in the Answer, javassist is INCOMPATIBLE, so I will suspect that. – takezaki May 09 '22 at 13:41

1 Answers1

1

Your version of javassist is incompatible with the Servlet classloader requirements when running on Java 11+.

You need to wait for javassist 3.29 release (which doesn't exist yet), which fixes the javassist.Loader to ignore the jdk.internal.* classes.

See: https://github.com/jboss-javassist/javassist/commit/b9a24bf129ef8b3295f99fdd43131301c1da8132

You need a release with the above commit.

Joakim Erdfelt
  • 46,896
  • 7
  • 86
  • 136