2016-04-12 26 views
1

javax.validation:validation-apiという競合するバージョンを指す2つの依存関係があります。これを解決するため、dependencyManagementセクションにvalidation-apiの最新バージョンを追加しました。テスト時にMaven依存関係管理が無視される(実行時に動作する)

これにより、アプリケーションが正しくビルドされ、実行時にアプリケーションが動作しますが、テスト中に、検証APIが参照されている行でビルドが中断します(@Validアノテーション経由)。

競合依存関係は、以下のとおりです。私はdependencyManagement次追加した

<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> 

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

これは、実行時に動作し、コンパイル時間が、私は@Validを参照してくださいテストに失敗しました。

これは私にナットをもたらしてくれているので、どんな助けでも大いに感謝します。

答えて

2

可能性のあるトラブルシューティングのパスは、上記の依存関係管理を適用するvalidation-apiをインポートする唯一のライブラリであるgwt-userのスコープ(provided)にあります。

以下最初省略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.0.0のではなく、したがって、所望の1.1.0.Finalバージョンを取ります。 GAです。
(上記のスコープ、依存関係エントリごとの最後のトークンは、ルートがprovidedスコープにあるため、すべてprovidedになるはずです。ただし、validation-apiは、依存管理エントリのためにcompileです)。

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 

したがって、実際に、両方がそれをもたらすだろうが、最初は、一方、第2デフォルトとして(compile)範囲provided範囲として定義しました。また、validation-apiの依存関係管理のMavenはgwt-userprovidedであり、その推移的依存関係の全てはまた、希望にもかかわらず、compileとして、上記(gwt-userを介してそれをもたらしている方法影響、(compile)範囲デフォルト定義されている

この場合のように依存関係管理によって異なる定義がなされていない限り、providedになります)。official Maven documentationあたりの依存関係を、提供

コンパイルとテストクラスパス上で利用できる

したがって、あなたが持っていると思われる、接続詞でコンパイルとテストの2つのライブラリ中に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> 

最初の設定を無効にすることはできましたが、 2番目のクラスをオーバーライドし、実際にはまだクラスパスに追加されています(上記の依存関係ツリーの出力を確認し、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:コンパイル [INFO] \ - org.hibernate:hibernate-validator:jar:5.2.2.Final:コンパイル [INFO] \ - javax.validation:validation-api:jar:1.1.0.Final:コンパイルすると ' –

+0

がより一貫性を持たせることができます。 dependencyManagementエントリに指定されたスコープを適用してから、追加したばかりの除外除外を削除してください。実行時に同じエラーが発生する可能性があります。これは最初はうまくいきませんが、正しい解決策に向かってさらに役立ちます。 –

0

あなたはこのように1または別の依存関係を除外する必要があります。

 <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

同じ問題は、動作しません。実行時に動作しますが、テストは失敗します。 –

関連する問題