1. 程式人生 > >jar包衝突,是是什麼意思?jar包衝突的原因是什麼?

jar包衝突,是是什麼意思?jar包衝突的原因是什麼?

網上的解釋,我認同,是因為一個class出現在多個jar包中:

http://blog.csdn.net/fo11ower/article/details/44992667

--------例子2:

http://www.cnblogs.com/songshu120/p/6164114.html


----------總結:

jar衝突是原因,是由工程報錯(如明明匯入了包含某個class的jar包卻還提示classnotfound、nosuchmethod)得出的結論,所以要弄明白的問題是,為什麼明明引入了包含某個class的jar包卻還提示classnotfound、nosuchmethod。

1例子nosuchmethod:

有一個A.java如下:

import XX.classB

class A(){

···

classB.MethodB();

}

其中classB.class在B.jar中,classB.class的原始碼在如下:

import YY.classC//這裡import的可能是C1.jar中的classC,也可能是C2.jar中的classC。

class B(){

 classC.methodC();

}

其中classC.class在C1.jar、C2.jar中都存在,而C1.jar中的classC.class沒有methodC(),而C2.jar中的classC.class有methodC();

而執行classB.class的時候,其頭部import的可能是C1.jar中的classC,也可能是C2.jar中的classC。

如果import的可能是C1.jar中的classC,肯定就會報錯nosuchmethod,因為C1.jar中的classC沒有methodC()方法。

2例子 notclassfound

我明明引入了包含某個class的jar包,但是執行的時候確報錯,classnotfound.

例如:

import XX.classA  //classA在A.jar中

class classB{

     classA.methodA();

}

import YY.classC

class classA{

···

public methodA(){

···classC.methodC();

}

}

A.jar在MANIFEST class-path中指定了C.jar,即A.jar中的某些類如classA引用了C.jar中的classC。而classC同時存在與C.jar和C2.jar中。而工程的lib只引入了C2.jar,而沒有引入C.jar,這樣,就算classC並且methodC()都已經通過C2.jar引入了,但是工程還是會報錯:

classnotfound,因為A.jar中的MANIFEST class-path中指定的是引入C.jar,而就算C2.jar中有classC,classloader也不會將它引入(即載入到記憶體中)。