天天看點

包沖突問題的解決方法

包沖突是開發過程中很常見的問題:

其表現有:

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)

排除如下:

繼續閱讀