【问题标题】:java.lang.IncompatibleClassChangeError: Implementing classjava.lang.IncompatibleClassChangeError:实现类
【发布时间】:2017-08-25 17:28:48
【问题描述】:

我正在尝试实现一个调度程序来安排 3 个作业,但在第一个作业实现时,我只收到了不兼容的类更改错误。..

错误在线,

JobDetail jobA = JobBuilder.newJob(JobA.class)
                     .withIdentity(jobKeyA).build();

有什么帮助吗??

完整代码如下..

import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class Scheduler1 {
    public static void main( String[] args ) throws Exception
    {

    JobKey jobKeyA = new JobKey("jobA", "group1");
        JobDetail jobA = JobBuilder.newJob(JobA.class)
        .withIdentity(jobKeyA).build();

        JobKey jobKeyB = new JobKey("jobB", "group1");
        JobDetail jobB = JobBuilder.newJob(JobB.class)
        .withIdentity(jobKeyB).build();

        JobKey jobKeyC = new JobKey("jobC", "group1");
        JobDetail jobC = JobBuilder.newJob(JobC.class)
        .withIdentity(jobKeyC).build();


        Trigger trigger1 = TriggerBuilder
        .newTrigger()
        .withIdentity("dummyTriggerName1", "group1")
        .withSchedule(
            CronScheduleBuilder.cronSchedule("0/5 * * * * ?"))
        .build();

        Trigger trigger2 = TriggerBuilder
        .newTrigger()
        .withIdentity("dummyTriggerName2", "group1")
        .withSchedule(
            CronScheduleBuilder.cronSchedule("0/5 * * * * ?"))
        .build();

        Trigger trigger3 = TriggerBuilder
        .newTrigger()
        .withIdentity("dummyTriggerName3", "group1")
        .withSchedule(
            CronScheduleBuilder.cronSchedule("0/5 * * * * ?"))
        .build();

        Scheduler scheduler = new StdSchedulerFactory().getScheduler();

        scheduler.start();
        scheduler.scheduleJob(jobA, trigger1);
        scheduler.scheduleJob(jobB, trigger2);
        scheduler.scheduleJob(jobC, trigger3);

    }
}

我有三个类jobA,jobB,jobC,但是当我将它们添加到上面的调度程序时,我得到如下错误,

线程“主”java.lang.IncompatibleClassChangeError 中的异常:实现类 在 java.lang.ClassLoader.defineClass1(本机方法) 在 java.lang.ClassLoader.defineClass(ClassLoader.java:788) 在 java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 在 java.net.URLClassLoader.defineClass(URLClassLoader.java:447) 在 java.net.URLClassLoader.access$100(URLClassLoader.java:71) 在 java.net.URLClassLoader$1.run(URLClassLoader.java:361) 在 java.net.URLClassLoader$1.run(URLClassLoader.java:355) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.net.URLClassLoader.findClass(URLClassLoader.java:354) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:424) 在 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:357) 在 Scheduler1.main(Scheduler1.java:15)

【问题讨论】:

  • 分享你的一些代码
  • ...以及更多细节
  • 编辑后的代码如上..

标签: java


【解决方案1】:

我也遇到过这个问题。在挖掘了一堆核心 Java 代码之后,我们发现这个简单的应用程序每次都会产生问题:

public static void main(String[] args) {
    System.out.println(AssertionBuilderRegistry.class);
    System.out.println(AssertionBuilderRegistryImpl.class);
}

通过在调试器中放置一个异常断点并在调用堆栈中向上遍历直到我们得到一些命名的嫌疑人,这些类被确定为违规者。

mvn dependency:tree

产生这个sn-p:

\- org.apache.cxf:cxf-bundle-minimal:jar:2.4.10:compile
[INFO] |  |     +- org.apache.ws.xmlschema:xmlschema-core:jar:2.0.3:compile
[INFO] |  |     +- org.apache.geronimo.specs:geronimo-stax-api_1.0_spec:jar:1.0.1:compile
[INFO] |  |     +- org.apache.geronimo.specs:geronimo-annotation_1.0_spec:jar:1.1.1:compile
[INFO] |  |     +- javax.xml.bind:jaxb-api:jar:2.1:compile
[INFO] |  |     +- org.apache.neethi:neethi:jar:2.0.4:compile

所以,基本上,

AssertionBuilderRegistryImpl

必须实现/扩展

AssertionBuilderRegistry

那么,我们来看看 CXF 版本的 AssertionBuilderRegistryImpl

public class AssertionBuilderRegistryImpl extends AssertionBuilderFactoryImpl implements
AssertionBuilderRegistry, BusExtension {

现在是 AssertionBuilderRegistry

public interface AssertionBuilderRegistry extends AssertionBuilderFactory { // intellij highlights red here on the extends 

那么,让我们看看 AssertionBuilderFactory

public class AssertionBuilderFactory

好吧,我们有一个类实现和接口,而该接口扩展了一个类?!

但是等等,这是 maven 指出的正确版本。所以,cxf minimum 取决于它不兼容的东西?!

我们来看看 cxf-minimal (sn-p) 的 pom:

<dependency>
  <groupId>org.apache.neethi</groupId>
  <artifactId>neethi</artifactId>
  <version>3.0.2</version>
  <scope>compile</scope>
</dependency>

好吧,WTF?! maven 依赖说它需要 2.0.4(这显然是不兼容的)并且这个工件的 pom 说它需要 3.0.2

所以,解决方案:

    <dependency>
        <groupId>org.apache.neethi</groupId>
        <artifactId>neethi</artifactId>
        <version>3.0.2</version>
        <scope>compile</scope>
    </dependency>

在我们的主项目 POM 中显式声明依赖项。

错误。在马文。最新版本的 maven (3.2.1) 也是如此。

【讨论】:

  • 很好地解释了IncompatibleClassChangeError: Implementing class的错误和原因!
  • 伟大的解决方案克里斯蒂安。我在使用 Apache CXF v3.1.10 时遇到了同样的错误。我正在使用带有 Maven v3.3.9 插件的 Intellij 2018.1 社区版。 Maven 项目显示我仅将 Apache Neethi v3.0.3 作为依赖项包含在内,但不幸的是,WAR 与 Neethi v2.0.5 和 Neethi v3.0.3 工件一起打包。在我的 POM 文件中将 Neethi 从 Apache Axiom 和 Apache Rampart 中排除后,仅打包了较新版本的 Neethi。你得到了我对这个答案的支持。谢谢!
【解决方案2】:

在你的类路径中包含合适的 cglib 版本。例如

<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2.2</version>
</dependency>

【讨论】:

  • 我有 web.xml 但我的项目中没有 pom.xml..我在哪里可以找到 pom.xml?
  • 我有依赖库和 jars 但没有 pom.xml
  • ok.so 看来你没有使用 maven ..在这种情况下从 cglib.sourceforge.net 下载 cglib.jar 就可以了
  • 添加了 cglib.2.2 jar 来配置 buildpath 外部 jars 但没有变化..同样的错误仍然存​​在..
【解决方案3】:

我假设这个问题已经得到解答,但提供了我自己的经验的更多细节。

我在跟踪中有相同的java.lang.IncompatibleClassChangeError,当 cxf-bundle-2.4.0.jarneethi-2.x.jar 一起使用时被抛出,它已经存在于类路径中。正如 Christian Bongiorno 的回答中提到的,我发现 cxf-bundle-2.40.jar 需要 neethi-3.x.jar (我想对答案投赞成票) ,但没有足够的积分来支持或评论)。

查看this链接了解更多详情。

我使用 Brian 对 this 问题的回答中提到的 -verbose 参数启动了 VM。这有助于查看 catalina.out 中的类加载器日志,并且可以理解问题在于何时加载 org.apache.cxf.ws.policy.PolicyEngine/Impl 类,它依赖于 neethi 库中的类。

除了 neethi,我还必须将 XmlSchema-1.3.2.jar 替换为 xmlschema-core-2.0.jar,因为这也显示了冲突。 在进行这些更改后,应用程序运行良好,但需要进行详细测试才能确认。像这样的更改很棘手,因为可能存在其他运行时问题。我希望重写旧代码以使用最新的库,但没有时间这样做。

【讨论】:

    猜你喜欢
    • 2012-05-15
    • 2016-01-26
    • 1970-01-01
    • 2018-03-04
    • 2016-05-20
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    相关资源
    最近更新 更多