不兼容 Class 更改错误 - Web 项目 org.eclipse.jetty.annotations.AnnotationParser

Incompatible Class Change Error - org.eclipse.jetty.annotations.AnnotationParser for Web Project

我正在 intellij 中创建一个 Soap Web 项目,当我尝试在 Jetty Runner 插件中运行以下项目Project Code时,出现以下异常

java.lang.IncompatibleClassChangeError: class org.eclipse.jetty.annotations.AnnotationParser$MyClassVisitor has interface org.objectweb.asm.ClassVisitor as super class
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
    at java.net.URLClassLoader.access0(URLClassLoader.java:73)
    at java.net.URLClassLoader.run(URLClassLoader.java:368)
    at java.net.URLClassLoader.run(URLClassLoader.java:362)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at org.eclipse.jetty.annotations.AnnotationParser.scanClass(AnnotationParser.java:935)
    at org.eclipse.jetty.annotations.AnnotationParser.parseJarEntry(AnnotationParser.java:919)
    at org.eclipse.jetty.annotations.AnnotationParser.lambda$parseJar[=12=](AnnotationParser.java:878)
    at java.util.TreeMap$ValueSpliterator.forEachRemaining(TreeMap.java:2897)
    at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580)
    at org.eclipse.jetty.annotations.AnnotationParser.parseJar(AnnotationParser.java:874)
    at org.eclipse.jetty.annotations.AnnotationParser.parse(AnnotationParser.java:838)
    at org.eclipse.jetty.annotations.AnnotationConfiguration$ParserTask.call(AnnotationConfiguration.java:163)
    at org.eclipse.jetty.annotations.AnnotationConfiguration.run(AnnotationConfiguration.java:471)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:765)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.run(QueuedThreadPool.java:683)
    at java.lang.Thread.run(Thread.java:745)

这通常是类路径上相同依赖项的两个略有不同版本的结果。

要解决这些问题,请尝试以 -verbose 作为参数启动 VM,并查看异常发生时正在加载的 类。你应该看到一些信息可以帮助你。例如,拥有您意想不到的相同依赖项和版本的多个副本。

使用 Maven 解决重复的 jar 最好结合 maven-dependency-plugin and maven-enforcer-plugin under Maven or SBT's Dependency Graph Plugin

正如 @Volkan Albayrak 所写,这是不同 ASM 版本的问题。

使用 mvn dependency:tree 检查项目依赖关系表明依赖关系 org.apache.cxf:cxf-rt-bindings-http:jar:2.5.9 引入了 ASM 编译时依赖关系。

[INFO] \- org.apache.cxf:cxf-rt-bindings-http:jar:2.5.9:compile
[INFO]    +- org.codehaus.jra:jra:jar:1.0-alpha-4:compile
[INFO]    +- org.apache.cxf:cxf-rt-bindings-xml:jar:2.5.9:compile
[INFO]    +- org.apache.cxf:cxf-rt-transports-http:jar:2.5.9:compile
[INFO]    |  +- org.apache.cxf:cxf-rt-transports-common:jar:2.5.9:compile
[INFO]    |  \- org.springframework:spring-web:jar:3.0.6.RELEASE:compile
[INFO]    \- org.apache.cxf:cxf-rt-frontend-jaxws:jar:2.5.9:compile
[INFO]       +- xml-resolver:xml-resolver:jar:1.2:compile
[INFO]       +- asm:asm:jar:3.3.1:compile <-- this one is the problem
[INFO]       \- org.apache.cxf:cxf-rt-ws-addr:jar:2.5.9:compile

IntelliJ 插件 IDEA Jetty Runner(版本 1.3.1)本身依赖于 Eclipse jetty runner。这个 jetty-runner-9.4.14.v20181114.jar 包含 ASM 7.0.

您需要从 Maven 项目中排除依赖项 asm:asm:jar:3.3.1

pom.xml修改

<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-bindings-http</artifactId>
    <version>2.5.9</version>
    <exclusions>
        <exclusion>
            <artifactId>asm</artifactId>
            <groupId>asm</groupId>
        </exclusion>
        ...