包沖突是開發過程中很常見的問題:
其表現有:
1.明明在eclipse中能夠索引到某個類,運作時卻報出找不到類。
2.明明在eclipse中能夠索引到某個類的方法,運作時卻報出找不到方法。
3.類及方法都有,以正确編譯成了.class檔案,在本機跑的好好的,發到測試或者正式環境就
抛如下異常:
java.lang.NoClassDefFoundError: Could not initialize class
java.lang.VerifyError: ********* Incompatible argument to function
這一類的話八成是包沖突。
此時你在eclipse中用ctrl+shift+T 類名,一般可以看到會有不止一個的這個類,并且位于不同的jar中。
這個時候就要考慮把那些幹擾的沖突的包排除。
如果使用maven,則直接如下排除即可。
<dependency>
<groupId>com.XXX.udc</groupId>
<artifactId>udc-client</artifactId>
<version>1.0.4</version>
<exclusions>
<exclusion>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</exclusion>
</exclusions>
</dependency>
如果沒用maven,可能要動手删除一些lib中的jar包了。
2013年3月13日排錯記錄:
測試環境好好的,預發環境一直報java.lang.NoClassDefFoundError,java.lang.VerifyError。
步驟是:
在eclipse裡面通過ctrl+shift+T可以發現。
import org.codehaus.jackson.JsonFactory;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.map.ObjectMapper;
同時存在于兩組jar中
jackson-core-asl-1.8.8.jar
jackson-mapper-asl-1.8.8.jar
與
jackson-core-lgpl-1.1.0.jar
jackson-mapper-lgpl-1.4.0.jar
第二組jar是我在pom中顯示引用的,是我想要的。第一組jar是udc間接依賴的,于是我就把第一組的execution了。
馬上就好了。
[b]也就是說,一個工程中所依賴的包如果存在包名、類名的相同的類,在不同的環境下很可能引發加載的不一緻問題,[/b]
産生沖突,這是一個風險。
還發現一個問題是,在我沖突解決之前,多次重新開機了預發環境機器,對于同一段代碼,下面兩個異常會随記出現,似乎
[b]在有潛在包沖突的情況下,即使相同的環境,不同的時刻jvm的加載執行曆程都不同:[/b]
java.lang.NoClassDefFoundError: Could not initialize class com.taobao.lifemarketweb.util.JackSonUtil
與
java.lang.VerifyError: (class: org/codehaus/jackson/map/ObjectMapper, method: writeValueAsBytes signature:
(Ljava/lang/Object;)[B) Incompatible argument to function
at com.taobao.lifemarketweb.util.JackSonUtil.<clinit>(JackSonUtil.java:20)
排除如下: