java.lang.IncompatibleClassChangeError:实现类

时间:2013-11-22 04:56:50

标签: java

我正在尝试实施一个调度程序来安排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但是当我将它们添加到上面的调度程序时我得到如下错误,

线程“main”中的异常java.lang.IncompatibleClassChangeError:实现类     at java.lang.ClassLoader.defineClass1(Native Method)     at java.lang.ClassLoader.defineClass(ClassLoader.java:788)     at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)     at 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)     at java.security.AccessController.doPrivileged(Native Method)     在java.net.URLClassLoader.findClass(URLClassLoader.java:354)     at java.lang.ClassLoader.loadClass(ClassLoader.java:424)     at sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java:308)     at java.lang.ClassLoader.loadClass(ClassLoader.java:357)     在Scheduler1.main(Scheduler1.java:15)

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

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

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

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

mvn dependency:tree

生成此代码段:

\- 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

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

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 minimal取决于它与?!

不兼容的东西

让我们来看看cxf-minimal(片段)的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。最新版本的maven(3.2.1)也是如此。

答案 2 :(得分:0)

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

我在跟踪中有相同的java.lang.IncompatibleClassChangeError,并且当 cxf-bundle-2.4.0.jar neethi-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 ,因为这也会显示冲突。 这些更改后应用程序正常运行,但需要进行详细测试才能确认。像这样的变化很棘手,因为可能存在其他运行时问题。我希望重写旧代码以使用最新的库,但没有时间这样做。