2012-02-20 96 views
1

我遇到類似於Maven 2 - different dependency versions in test and compile的問題,但指定的答案不起作用。Maven - 測試中的不同依賴版本

在我的項目中,我需要依賴Hadoop的Cloudera發行版和JUnit測試的'vanilla'版本,因爲前者僅適用於* nix。

當我嘗試執行我的應用程序時,我得到Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/conf/Configuration。當我從Maven或Eclipse運行JUnit測試時,一切正常。如果我註釋掉test依賴項,應用程序將成功運行。

爲什麼compile依賴關係在取消註釋test依賴項時被忽略?

<dependency> 
     <groupId>org.apache.hadoop</groupId> 
     <artifactId>hadoop-core</artifactId> 
     <version>0.20.2-cdh3u2</version> 
     <scope>compile</scope> 
    </dependency> 

    <dependency> 
     <groupId>org.apache.hadoop</groupId> 
     <artifactId>hadoop-core</artifactId> 
     <version>1.0.0</version> 
     <scope>test</scope> 
    </dependency> 

    <dependency> 
     <groupId>org.apache.hadoop</groupId> 
     <artifactId>hadoop-test</artifactId> 
     <version>1.0.0</version> 
     <scope>test</scope> 
    </dependency> 

mvn dependency:list顯示以下,其中不顯示compile範圍的版本都:

[INFO] The following files have been resolved: 
[INFO] ant:ant:jar:1.6.5:test 
[INFO] aopalliance:aopalliance:jar:1.0:compile 
[INFO] asm:asm:jar:3.3.1:compile 
[INFO] cglib:cglib:jar:2.2.2:compile 
[INFO] ch.qos.logback:logback-classic:jar:1.0.0:compile 
[INFO] ch.qos.logback:logback-core:jar:1.0.0:compile 
[INFO] com.google.guava:guava:jar:r08:compile 
[INFO] com.h2database:h2:jar:1.3.164:test 
[INFO] com.jolbox:bonecp:jar:0.7.1.RELEASE:compile 
[INFO] com.sun.jersey:jersey-core:jar:1.11:test 
[INFO] commons-beanutils:commons-beanutils:jar:1.7.0:test 
[INFO] commons-beanutils:commons-beanutils-core:jar:1.8.0:test 
[INFO] commons-cli:commons-cli:jar:1.2:test 
[INFO] commons-codec:commons-codec:jar:1.4:test 
[INFO] commons-collections:commons-collections:jar:3.2.1:test 
[INFO] commons-configuration:commons-configuration:jar:1.6:test 
[INFO] commons-digester:commons-digester:jar:1.8:test 
[INFO] commons-el:commons-el:jar:1.0:test 
[INFO] commons-httpclient:commons-httpclient:jar:3.0.1:test 
[INFO] commons-lang:commons-lang:jar:2.4:test 
[INFO] commons-logging:commons-logging:jar:1.1.1:compile 
[INFO] commons-net:commons-net:jar:1.4.1:test 
[INFO] hsqldb:hsqldb:jar:1.8.0.10:test 
[INFO] junit:junit:jar:4.10:test 
[INFO] mysql:mysql-connector-java:jar:5.1.18:compile 
[INFO] net.java.dev.jets3t:jets3t:jar:0.7.1:test 
[INFO] net.sf.kosmosfs:kfs:jar:0.3:test 
[INFO] org.apache.commons:commons-math:jar:2.1:test 
[INFO] org.apache.ftpserver:ftplet-api:jar:1.0.0:test 
[INFO] org.apache.ftpserver:ftpserver-core:jar:1.0.0:test 
[INFO] org.apache.ftpserver:ftpserver-deprecated:jar:1.0.0-M2:test 
[INFO] org.apache.hadoop:hadoop-core:jar:1.0.0:test 
[INFO] org.apache.hadoop:hadoop-test:jar:1.0.0:test 
[INFO] org.apache.mina:mina-core:jar:2.0.0-M5:test 
[INFO] org.codehaus.jackson:jackson-core-asl:jar:1.0.1:test 
[INFO] org.codehaus.jackson:jackson-mapper-asl:jar:1.0.1:test 
[INFO] org.eclipse.jdt:core:jar:3.1.1:test 
[INFO] org.hamcrest:hamcrest-core:jar:1.1:test 
[INFO] org.liquibase:liquibase-core:jar:2.0.3:test 
[INFO] org.liquibase.ext:liquibase-slf4j:jar:0.0.1:test 
[INFO] org.mortbay.jetty:jetty:jar:6.1.26:test 
[INFO] org.mortbay.jetty:jetty-util:jar:6.1.26:test 
[INFO] org.mortbay.jetty:jsp-2.1:jar:6.1.14:test 
[INFO] org.mortbay.jetty:jsp-api-2.1:jar:6.1.14:test 
[INFO] org.mortbay.jetty:servlet-api:jar:2.5-20081211:test 
[INFO] org.mortbay.jetty:servlet-api-2.5:jar:6.1.14:test 
[INFO] org.slf4j:jcl-over-slf4j:jar:1.6.4:compile 
[INFO] org.slf4j:log4j-over-slf4j:jar:1.6.4:compile 
[INFO] org.slf4j:slf4j-api:jar:1.6.4:compile 
[INFO] org.springframework:spring-aop:jar:3.1.1.RELEASE:compile 
[INFO] org.springframework:spring-asm:jar:3.1.1.RELEASE:compile 
[INFO] org.springframework:spring-beans:jar:3.1.1.RELEASE:compile 
[INFO] org.springframework:spring-context:jar:3.1.1.RELEASE:compile 
[INFO] org.springframework:spring-context-support:jar:3.1.1.RELEASE:compile 
[INFO] org.springframework:spring-core:jar:3.1.1.RELEASE:compile 
[INFO] org.springframework:spring-expression:jar:3.1.1.RELEASE:compile 
[INFO] org.springframework:spring-jdbc:jar:3.1.1.RELEASE:compile 
[INFO] org.springframework:spring-test:jar:3.1.1.RELEASE:test 
[INFO] org.springframework:spring-tx:jar:3.1.1.RELEASE:compile 
[INFO] org.springframework.data:spring-data-hadoop:jar:1.0.0.BUILD-SNAPSHOT:c 
ompile 
[INFO] oro:oro:jar:2.0.8:test 
[INFO] tomcat:jasper-compiler:jar:5.5.12:test 
[INFO] tomcat:jasper-runtime:jar:5.5.12:test 
[INFO] xmlenc:xmlenc:jar:0.52:test 
+0

'mvn dependency:list'顯示爲'hadoop-core'? – Raghuram 2012-02-20 16:39:09

+0

@Raghuram我編輯了這個問題來展示這個。謝謝! – 2012-02-20 17:20:28

回答

1

看起來像一個Maven的錯誤 - 如果還是不行,這東西夠我不相信有鬼如果有任何文件的話。

在你的情況,我可能會:

  1. 升級Maven和看問題是否已固定在最新的M3
  2. 嘗試重新打包的Hadoop版本,另一產物ID或組名之一。 maven-shade-plugin,不用麻煩改變包名,但是隻介紹一些maven不會知道的與org.apache.hadoop沒什麼兩樣:hadoop-core
  3. 嘗試將測試移到下游的單獨項目
  4. 開始調試Maven和明白髮生了什麼事情究竟(然後退到1或2 ...)
+0

感謝您的幫助!我嘗試了選項2,但奇怪的是它仍然表現出相同的行爲。我想知道是否在導致問題的.jar中有一些東西? – 2012-02-21 09:15:32

+0

嘗試2時,請確保完全着色 - 如果您仍然在傳遞上依賴於原始工件,則無法工作。 – ptyx 2012-02-21 17:38:17

4

你的願望是什麼,不再有效對Maven 3(這曾經對Maven 2是有效的)。 Maven 3將嘗試獲取最近的依賴關係,從而有效地確保編譯或測試作用域依賴關係中只有一個用於編譯和測試階段。

在你的情況下,org.apache.hadoop:hadoop-core:1.0.0:test覆蓋org.apache.hadoop:hadoop-core:0.20.2-cdh3u2:compile,因此成爲最接近的依賴。您可能會看到運行mvn dependency:list目標時的Maven顯示以下警告,這暗示了這是一個問題,在您的項目模型:

[警告]「dependencies.dependency(的groupId:的artifactId:類型:分級)。 「必須是唯一 :org.apache.hadoop:Hadoop的核心:罐子 - >版本0.20.2-cdh3u2 VS 1.0.0 @線XYZ,XYZ欄

爲 '修復' 這一點,這將是最好將測試分解爲一個單獨的項目,其項目模型可以定義一組單獨的測試依賴項。