2013-11-22 74 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因爲這也顯示了衝突。 這些更改後,應用程序正常工作,但需要進行詳細的測試以確認。像這樣的變化很棘手,因爲可能會有其他運行時問題。我想重寫舊代碼以使用最新的庫,但沒有時間這樣做。

相關問題