2016-04-12 77 views
1

我有兩個依賴關係指向衝突版本javax.validation:validation-api。爲了解決這個問題,我在validation-api的最新版本中增加了一個dependencyManagement部分。在測試時忽略Maven依賴關係管理(在運行時工作)

雖然這會導致應用程序構建正確,並且應用程序在運行時工作,但在測試期間,構建會在引用驗證API的行中斷開(通過@Valid註釋)。

的依賴性衝突是:

<dependency> 
    <groupId>io.dropwizard</groupId> 
    <artifactId>dropwizard-core</artifactId> 
    <version>0.9.2</version> 
</dependency> 

<dependency> 
    <groupId>com.google.gwt</groupId> 
    <artifactId>gwt-user</artifactId> 
    <version>2.8.0-beta1</version> 
    <scope>provided</scope> 
</dependency> 

我已經添加了以下dependencyManagement

<dependency> 
    <groupId>javax.validation</groupId> 
    <artifactId>validation-api</artifactId> 
    <version>1.1.0.Final</version> 
</dependency> 

這個工程在運行時和編譯時間,但在我指@Valid測試失敗。

將不勝感激任何幫助,因爲這是讓我瘋了。

回答

2

可能的故障排除路徑位於爲gwt-user定義的作用域(provided)上,該域是應用上述依賴關係管理的唯一引入validation-api的庫。

運行下面的第一省略dropwizard-core

mvn dependency:tree -Dincludes=javax.validation 

輸出將是:

[INFO] +- com.google.gwt:gwt-user:jar:2.8.0-beta1:provided 
[INFO] | +- javax.validation:validation-api:jar:1.1.0.Final:compile 
[INFO] | \- javax.validation:validation-api:jar:sources:1.0.0.GA:provided 

以因此期望1.1.0.Final版本代替傳遞1.0.0的。 GA一。
(注意上面的範圍,每個依賴關係條目的最後一個標記,它們都應該在provided之上,因爲它的根,gwt-userprovided範圍內,但是validation-apicompile上因爲依賴關係管理條目)。

雖然省略gwt-user輸出將是:

[INFO] com.sample:sample2:jar:0.0.1-SNAPSHOT 
[INFO] \- io.dropwizard:dropwizard-core:jar:0.9.2:compile 
[INFO] \- io.dropwizard:dropwizard-validation:jar:0.9.2:compile 
[INFO]  \- org.hibernate:hibernate-validator:jar:5.2.2.Final:compile 
[INFO]   \- javax.validation:validation-api:jar:1.1.0.Final:compile 

因此,事實上,兩者會帶來它,但第一被定義爲provided範圍,而第二默認(compile)範圍。

此外,validation-api依賴關係管理已默認(compile)範圍界定,影響Maven的是如何通過gwt-user(如上所列將它作爲compile,即使gwt-userprovided及其所有傳遞依賴的也將在provided上,除非依賴性管理有不同的定義,就像在這種情況下一樣)。

提供的依賴,每official Maven documentation可在您編譯和測試兩個庫中一起選擇,validation-apigwt-user過程中具有編譯和測試類路徑

因此,那麼這將對

運行時不同的耦合(gwt-user預計爲,運行時容器提供)。

如果gwt-user必須在provided範圍內,我會建議採用更好的管理,並直接從gwt-user排除validation-api。因此,validation-api將從dropwizard-core帶入依賴管理所需的版本。

<dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>javax.validation</groupId> 
      <artifactId>validation-api</artifactId> 
      <version>1.1.0.Final</version> 
     </dependency> 
    </dependencies> 
</dependencyManagement> 

<dependencies> 
    <dependency> 
     <groupId>io.dropwizard</groupId> 
     <artifactId>dropwizard-core</artifactId> 
     <version>0.9.2</version> 
    </dependency> 
    <dependency> 
     <groupId>com.google.gwt</groupId> 
     <artifactId>gwt-user</artifactId> 
     <version>2.8.0-beta1</version> 
     <scope>provided</scope> 
     <exclusions> 
      <exclusion> 
       <groupId>javax.validation</groupId> 
       <artifactId>validation-api</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
</dependencies> 

更新
從下面您的意見,您還使用以下內容作爲你的依賴管理的一部分:

<dependency> 
    <groupId>com.google.gwt</groupId> 
    <artifactId>gwt</artifactId> 
    <version>2.8.0-beta1</version> 
    <type>pom</type> 
    <scope>import</scope> 
</dependency> 

,然後同時指定其依賴關係管理的以下內容:

<dependency> 
    <groupId>javax.validation</groupId> 
    <artifactId>validation-api</artifactId> 
    <version>1.0.0.GA</version> 
</dependency> 
<dependency> 
    <groupId>javax.validation</groupId> 
    <artifactId>validation-api</artifactId> 
    <version>1.0.0.GA</version> 
    <!-- Note: use classifier=sources rather than type=java-sources so they're added to the classpath --> 
    <classifier>sources</classifier> 
</dependency> 

儘管您設法覆蓋第一個, t覆蓋第二個,實際上它仍然被添加到類路徑中(檢查上面的依賴關係樹輸出,1.0.0.GA源仍被引入,在提供的範圍內。這是編譯器/測試和運行時之間的進一步區別。在運行時,您不會將其作爲類路徑的一部分。

因此,我會建議還將您的依賴關係管理添加到它的1.1.0.Final版本作爲重寫,以便它與第一個一致。

+0

感謝。我認爲你正在考慮正確的路線。但是,我已經嘗試過排除,然後再次嘗試 - 錯誤不會消失。它繼續出現在測試中,而運行時繼續工作。所以它在測試中不會消失。 –

+0

這是運行依賴關係樹的輸出:[INFO] com.myproject:jar:1.0-SNAPSHOT [INFO] \ - io.dropwizard:dropwizard-validation:jar:0.9.2:compile [INFO] \ - org.hibernate:hibernate-validator:jar:5.2.2.Final:compile [INFO] \ -javax.validation:validation-api:jar:1.1.0.Final:compile' –

+0

讓事情更加一致,你可以嘗試應用提供給dependencyManagement條目的作用域,然後刪除剛剛添加的隱式排除。然後,您可能會在運行時遇到同樣的錯誤:雖然一開始這並不好,但它可以進一步幫助您找到正確的解決方案。 –

0

你必須從一個或另一個像這樣排除依賴:

 <dependency> 
      <groupId>io.dropwizard</groupId> 
      <artifactId>dropwizard-core</artifactId> 
      <version>0.9.2</version> 
     </dependency> 

    <dependency> 
      <groupId>com.google.gwt</groupId> 
      <artifactId>gwt-user</artifactId> 
      <version>2.8.0-beta1</version> 
      <scope>provided</scope> 
      <exclusions> 
      <exclusion> 
       <groupId>javax.validation</groupId> 
       <artifactId>validation-api</artifactId> 
      </exclusion> 
      </exclusions> 
    </dependenc 
+0

同樣的問題,不起作用。在運行時工作,但測試失敗。 –