2013-11-22 44 views
1

我试着去实现一个调度安排3个项目,但对第一份工作仅实现即时得到不兼容的类变化错误..java.lang.IncompatibleClassChangeError:实现类

的误差就行,

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); 

    } 
} 

我有三个类职吧,JOBB,jobC但是当IM将它们添加到上述调度IM中的线程得到错误如下,

异常“主” java.lang.IncompatibleClassChangeError:在java.lang.ClassLoader.defineClass1(本机方法) 在需要java.lang.ClassLoader.defineClass(ClassLoader.java:788) 在java.security.SecureClassLoader.defineClass(SecureClassLoader的实施 类.java:142)(URLClassLoader.java:361)在java.net.URLClassLoader.access处使用 (URLClassLoader.java:71) at java.net.URLClassLoader $ 1.run(URLClassLoader.java:361)在java.net.URLClassLoader.defineClass(URLClassLoader.java:447) 在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) at sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java:308) at Scheduler1上的java.lang.ClassLoader.loadClass(ClassLoader.java:357) 。 main(Scheduler1.java:15)

+0

分享你的一些代码 –

+0

...和一些更多的细节 –

+0

编辑的代码是如上.. – user2793926

回答

3

在您的班级路径中包含合适的cglib版本。例如,

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

如何去呢? – user2793926

+0

在您的pom.xml中包含正确的cglib版本依赖关系 –

+0

我有web.xml,但在我的项目中没有pom.xml ..我在哪里可以找到pom.xml? – user2793926

1

我一直有这个问题。通过核心的Java代码的碗挖掘后,我们discovred,这个简单的应用程序所产生的问题,每次:

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

这些类被确定为通过把一个异常断点在调试器和步行调用堆栈罪犯直到我们找到了一些有名的嫌疑犯。

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取决于它与不兼容的东西?!

让我们来看看的POM,CXF,最小的(片段):

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

OK,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)也是这样。

+0

关于'IncompatibleClassChangeError:实现类'的错误和原因的很好的解释! – JavaJigs

+0

我可以得到upvote :) –

0

我假设这个问题已经回答了,但是从我自己的经验中提供了一些更多的细节。

我在跟踪了相同的java.lang.IncompatibleClassChangeErrorCXF束-2.4.0.jarneethi-2.x.jar,这是已经在类路径中存在的使用被抛出。正如基督教Bongiorno的回答中提到的,我可以发现neethi-3.x.jar是必需的cxf-bundle-2.40.jar(我想投票答复,但没有足够的积分upvote或评论)。

请参阅this链接了解更多详情。

我推出了虚拟机-verbose在Brian的回答this问题中提到的论点。这有助于查看catalina.out中的类加载器日志,并且可以理解问题是何时加载了org.apache.cxf.ws.policy.PolicyEngine/Impl类,这些类依赖于neethi库中的类。

除了neethi,我必须更换XmlSchema-1.3.2。罐xmlschema-core-2.0.jar因为这也显示了冲突。 这些更改后,应用程序正常工作,但需要进行详细的测试以确认。像这样的变化很棘手,因为可能会有其他运行时问题。我想重写旧代码以使用最新的库,但没有时间这样做。

相关问题