2014-04-25 44 views
1

我目前正在面對Jenkins 1.532.2和Maven 3.0.3嚴重的類路徑問題。在本地,類路徑順序是正確的,所有的JUnit測試工作。在Jenkins上,類路徑按字母順序排列,不像在pom中定義的那樣。Maven&Jenkins按照字母順序排列類路徑,但不是本地的

上詹金斯(部分刪節)的 mvn dependencies:build-classpath

輸出:

axis/axis/1.4/axis-1.4.jar 
axis/axis-wsdl4j/1.5.1/axis-wsdl4j-1.5.1.jar 
com/company/ownlibrary.jar 
com/microsoft/sqljdbc4/3.0/sqljdbc4-3.0.jar 
com/oracle/ojdbc6/11.2.0.1.0/ojdbc6-11.2.0.1.0.jar 
commons-codec/commons-codec/1.5/commons-codec-1.5.jar 
commons-discovery/commons-discovery/0.2/commons-discovery-0.2.jar 
commons-lang/commons-lang/2.4/commons-lang-2.4.jar 
commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar 
junit/junit/4.11/junit-4.11.jar 
log4j/log4j/1.2.17/log4j-1.2.17.jar 
org/apache/axis/axis-jaxrpc/1.4/axis-jaxrpc-1.4.jar 
org/apache/axis/axis-saaj/1.4/axis-saaj-1.4.jar 
org/apache/poi/poi/3.8/poi-3.8.jar 
org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar 
org/mockito/mockito-core/1.9.5/mockito-core-1.9.5.jar 
org/objenesis/objenesis/1.0/objenesis-1.0.jar 
org/slf4j/slf4j-api/1.7.5/slf4j-api-1.7.5.jar 

這是mvn dependencies:build-classpath本地執行(部分刪節)輸出:

com\oracle\ojdbc6\11.2.0.1.0\ojdbc6-11.2.0.1.0.jar 
commons-logging\commons-logging\1.1.1\commons-logging-1.1.1.jar 
org\apache\poi\poi\3.8\poi-3.8.jar 
commons-codec\commons-codec\1.5\commons-codec-1.5.jar 
de\company\xyz.jar 
de\company\xyz2.jar 
com\company\own.jar 
log4j\log4j\1.2.17\log4j-1.2.17.jar 
commons-lang\commons-lang\2.4\commons-lang-2.4.jar 
com\microsoft\sqljdbc4\3.0\sqljdbc4-3.0.jar 
axis\axis\1.4\axis-1.4.jar 
org\apache\axis\axis-jaxrpc\1.4\axis-jaxrpc-1.4.jar 
org\apache\axis\axis-saaj\1.4\axis-saaj-1.4.jar 
axis\axis-wsdl4j\1.5.1\axis-wsdl4j-1.5.1.jar 
commons-discovery\commons-discovery\0.2\commons-discovery-0.2.jar 
org\slf4j\slf4j-api\1.7.5\slf4j-api-1.7.5.jar 
junit\junit\4.11\junit-4.11.jar 
org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar 
org\mockito\mockito-core\1.9.5\mockito-core-1.9.5.jar 
org\objenesis\objenesis\1.0\objenesis-1.0.jar 

我使用Maven 3.0.3所以應該使用pom定義的依賴性順序。

什麼是這個問題的根源,我該如何解決這個問題?

附加信息:你可以在classpath的項目看,我在Windows和詹金斯在當地建立在Linux操作系統上運行。

新信息:Linux上的Maven進程也無法正常工作。我試圖在Jenkins運行的機器上本地構建它,結果是一樣的。類路徑是有序的,但我試過的Maven 3.0.3和3.2.1

+0

如果你真的必須使用3.0.x版本,請至少使用'3.0.5'。 – carlspring

+0

我也在Linux上查了3.2.1。我正在用新信息更新問題 – guerda

+0

我對Maven有點新鮮,但是在兩種環境下JDK都是一樣的嗎?我不確定這是否相關,但最近有些問題因爲本地包含在我的JDK中而導致訂單被搞亂,但服務器有以前的版本,並且必須根據依賴關係拉入最新的common-lang jar等對於他們沒有被服務器JDK滿足的。 –

回答

1

將Maven更新到3.2.1可以幫助排序類路徑,但不會導致類路徑問題。 Jenkins沒有對類路徑進行排序,但是資源按錯誤順序加載。

0

恕我直言,類路徑爲了不應該的問題。如果你有問題,這意味着你正在加載同一個jar的多個版本。你不應該依賴類路徑順序。
你應該明白爲什麼會發生,如果你無法避免它,使用mvn dependency:tree弄清楚這裏的「壞」罐子是從哪裏來的,並添加這是負責IT的依賴性的排除。

我希望這會有所幫助。

+0

感謝您的意見,我很感激。不幸的是,我只能懷疑它是一個類路徑順序的事情,因爲第三方庫加載XML文件。在Linux和Windows上加載的文件是不同的,但我無法弄清楚爲什麼。 – guerda

+0

-1:我很少投票,所以這就是我爲什麼這樣做:這是可憐的建議。類路徑排序很重要。對於沒有混淆依賴項目的小型項目,您的陳述可能是真實的,除非這些依賴項也在其中包含陰影庫。類路徑依賴關係的排序是至關重要的,應該始終記住它,特別是。當處理像上面提到的第三方庫時,你幾乎不能控制它們。而且,是的,你必須檢查你的'dependency:tree'並在可能的情況下添加排除項,或者使用明確定義的項進行覆蓋。 – carlspring

+1

@carlspring,我接受你的評論,但仍然堅持你應該控制classpath的內容,而不是讓classpath控制你。訂單在服務器之間以不同的方式實施,您將依靠它承擔風險。恕我直言... –