包冲突问题的解决方法

包冲突是开发过程中很常见的问题:
其表现有:
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了。
马上就好了。

也就是说,一个工程中所依赖的包如果存在包名、类名的相同的类,在不同的环境下很可能引发加载的不一致问题,
产生冲突,这是一个风险。

还发现一个问题是,在我冲突解决之前,多次重启了预发环境机器,对于同一段代码,下面两个异常会随记出现,似乎
在有潜在包冲突的情况下,即使相同的环境,不同的时刻jvm的加载执行历程都不同:
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)

排除如下:
<dependency>
			<groupId>com.taobao.udc</groupId>
			<artifactId>udc-client</artifactId>
			<version>1.0.4</version>
			<exclusions>
				    <exclusion>
				       <groupId>ch.qos.logback</groupId>
				       <artifactId>logback-classic</artifactId>
				    </exclusion>
				     <exclusion>
				       <groupId>org.codehaus.jackson</groupId>
                       <artifactId>jackson-core-asl</artifactId>
				    </exclusion>
				     <exclusion>
				       <groupId>org.codehaus.jackson</groupId>
                       <artifactId>jackson-mapper-asl</artifactId>
				    </exclusion>
			</exclusions>
		</dependency>

你可能感兴趣的:(eclipse,maven,exclusions,包冲突)