在Eclipse中使用Jetty时触发IllegalArgumentException/RuntimeException求助
问题分析与解决方案
看起来你遇到的是Jetty扫描类文件时的ASM版本不兼容问题,我之前处理过好几个类似的场景,核心原因是字节码版本和ASM库不匹配,具体来说:
Jetty的注解解析器依赖ASM库来读取Java类文件的字节码,如果你用较高版本的JDK(比如JDK11+)编译了Test类,但你的Jetty版本自带的ASM库只支持较低版本的字节码(比如JDK8及以下),就会抛出这个IllegalArgumentException。
下面是具体的排查和解决步骤:
核对JDK编译级别与Jetty版本兼容性
先确认你的Jetty版本支持的JDK范围:Jetty 9.x最高支持JDK8,Jetty 10+开始支持JDK11及以上。在Eclipse中右键项目→Properties→Java Compiler,把编译级别调整到Jetty支持的版本,比如用Jetty9的话就选1.8。更新ASM依赖版本(如果用构建工具)
如果你是用Maven或Gradle管理项目,直接在依赖中指定匹配JDK版本的ASM库:- JDK8:ASM 6.x版本
- JDK11:ASM 7.x及以上版本
比如Maven依赖可以这么加:
<dependency> <groupId>org.ow2.asm</groupId> <artifactId>asm</artifactId> <version>7.3.1</version> </dependency>清理并重新构建项目
旧的编译产物可能残留不兼容的字节码,先执行Eclipse的Project→Clean清理项目,然后重新编译,再启动Jetty试试。确认类文件的存放位置
确保你的Test.class是放在src/main/java目录下编译生成的,不要把类文件放到资源目录或者Jetty会扫描的其他非源码目录里,避免不必要的扫描错误。
附上你提供的异常信息,方便后续参考:
java.lang.RuntimeException: Error scanning file C:\Users\****\eclipse-workspace\donationFinder\target\classes\com\testingClass\Test.class at org.eclipse.jetty.annotations.AnnotationParser.parseDir(AnnotationParser.java:783) at org.eclipse.jetty.annotations.AnnotationParser.parse(AnnotationParser.java:876) at org.eclipse.jetty.annotations.AnnotationConfiguration$ParserTask.call(AnnotationConfiguration.java:165) at org.eclipse.jetty.annotations.AnnotationConfiguration$1.run(AnnotationConfiguration.java:552) at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:671) at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:589) at java.base/java.lang.Thread.run(Thread.java:835) Caused by: java.lang.IllegalArgumentException at org.objectweb.asm.ClassReader.<init>(Unknown Source) at org.objectweb.asm.ClassReader.<init>(Unknown Source) at org.objectweb.asm.ClassReader.<init>(Unknown Source) at org.eclipse.jetty.annotations.AnnotationParser.scanClass(AnnotationParser.java:986) at org.eclipse.jetty.annotations.AnnotationParser.parseDir(AnnotationParser.java:777) ... 5 more
内容的提问来源于stack exchange,提问作者sabraship
相关产品推荐
相关产品推荐

