Jetty 9.4 给出 ArrayIndexOutOfBoundsException

pyt*_*ict 3 annotations jetty java-8

我正在尝试在 jetty 9.4 上部署我的 war 文件(分别使用 asm 5.1 和 6 尝试了 9.4.0 和 9.4.8)。我遇到以下错误。我使用java 1.8进行开发

\n\n
java.lang.RuntimeException: Error scanning entry org/aspectj/org/eclipse/jdt/internal/compiler/parser/UpdateParserFiles.class from jar file:///tmp/jetty-0.0.0.0-8080-xxxxx-service-8.0.0.0000-SNAPSHOT.war-_xxxx-8.0.0.0000-SNAPSHOT-any-4304648590162252598.dir/webapp/WEB-INF/lib/aspectjtools-1.8.13.jar\nat org.eclipse.jetty.annotations.AnnotationParser.lambda$parseJar$0(AnnotationParser.java:883)\nat java.util.TreeMap$ValueSpliterator.forEachRemaining(TreeMap.java:2893)\nat java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580)\nat org.eclipse.jetty.annotations.AnnotationParser.parseJar(AnnotationParser.java:875)\nat org.eclipse.jetty.annotations.AnnotationParser.parse(AnnotationParser.java:839)\nat org.eclipse.jetty.annotations.AnnotationConfiguration$ParserTask.call(AnnotationConfiguration.java:161)\nat org.eclipse.jetty.annotations.AnnotationConfiguration$1.run(AnnotationConfiguration.java:468)\nat org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:708)\nat org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:626)\nat java.lang.Thread.run(Thread.java:745)\nCaused by: \njava.lang.ArrayIndexOutOfBoundsException: 3379\nat org.objectweb.asm.ClassReader.<init>(ClassReader.java:171)\nat org.objectweb.asm.ClassReader.<init>(ClassReader.java:143)\nat org.objectweb.asm.ClassReader.<init>(ClassReader.java:418)\nat org.eclipse.jetty.annotations.AnnotationParser.scanClass(AnnotationParser.java:933)\nat org.eclipse.jetty.annotations.AnnotationParser.parseJarEntry(AnnotationParser.java:918)\nat org.eclipse.jetty.annotations.AnnotationParser.lambda$parseJar$0(AnnotationParser.java:879)\nat java.util.TreeMap$ValueSpliterator.forEachRemaining(TreeMap.java:2893)\nat java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580)\nat org.eclipse.jetty.annotations.AnnotationParser.parseJar(AnnotationParser.java:875)\nat org.eclipse.jetty.annotations.AnnotationParser.parse(AnnotationParser.java:839)\nat org.eclipse.jetty.annotations.AnnotationConfiguration$ParserTask.call(AnnotationConfiguration.java:161)\nat org.eclipse.jetty.annotations.AnnotationConfiguration$1.run(AnnotationConfiguration.java:468)\nat org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:708)\nat org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:626)\nat java.lang.Thread.run(Thread.java:745)\xe2\x80\x8b\n
Run Code Online (Sandbox Code Playgroud)\n

Joa*_*elt 5

该错误的原因可能是服务器端类路径上的 ASM jar 太旧。

我知道您说过您已经尝试过较新的版本,但是您是否检查了服务器类路径上的所有 jar 来查找 ASM 类的所有可能实例?

如果您使用的是,请注意您的服务器类路径,100%确定您的多个jar中没有这些ASM类!

中的某些配置下,web应用程序自己的WEB-INF/lib/*.jar可以用于扫描该web应用程序中的类。这意味着不兼容WEB-INF/lib/asm*.jar可能会给您带来问题。

  • 对于 Java 1.8 字节码和运行时,请使用 ASM 5.1+
  • 对于 Java 9 字节码和运行时,请使用 ASM 6+

另一个问题是,您可能在该 jar 中包含WEB-INF/lib/aspectjtools-1.8.13.jar用于字节码的类,该字节码的字节码高于运行时 JVM(或 ASM)可以处理的字节码。

如果您正在使用 JEP 238(多版本 JAR 规范)jar,那么这更常见,但我不认为是aspectjtools-1.8.13.jar其中之一(注意:实际上还没有下载该 jar 并研究它)

  • 有关 JEP 238 的更多信息,请参阅 Eclipse Jetty Issue #1797