2017-05-29 5 views
0

私はJavaEE 7を使用していますが、CDI 2.0 API(WeldとTomcat、Jerseyも使用します)を使いたいと思います。 (最初のMavenの依存性は、それを上書きしますので)その下にこれで問題が解決しない追加Java EE7とCDI 2.0のMaven依存関係は何ですか?

<dependency> 
     <groupId>javax</groupId> 
     <artifactId>javaee-api</artifactId> 
     <version>7.0</version> 
    </dependency> 

:私は、次のMavenの依存関係を持っている場合は、古いCDIのイベントのためのAPI(そうなしfireAsync)を使用しています

<dependency> 
     <groupId>javax.enterprise</groupId> 
     <artifactId>cdi-api</artifactId> 
     <version>2.0</version> 
    </dependency> 

Mavenを使用して、必要なもの(Jersey/Jax-RS、Servlets、ServerEndpoint、CDI 2.0/Weld in Tomcat 8)をどのように取得できますか?

+0

JavaEEの-APIを削除しようとすると、実装に置き換える ' org.jboss.weld.servlet 溶接サーブレット・コア 3.0.0.Final walkeros

答えて

2

今のところ(2017年5月)、EE 8はまだリリースされていませんでした。また、EE 7 APIの依存性によってCD 1.2が発生します。したがって、Mavenを使用して、矛盾する依存バージョンを解決する必要があります。私はこれに二つの方法を考えることができます:あなたはEE 7 API

上から下にあなたのpom.xml、Mavenのは、解決の依存関係のあなたの<dependencyManagement>セクションのバージョンを宣言し、例えば定義する前

1)CDIの依存関係を定義します。最初に出会ったのはバージョンを定義します。これは、最初にjavax.exterprise:cdi-api:2.0を定義すると2.0になり、EE APIに達するとCDIのバージョンは無視されることを意味します。ハッキーはこれが聞こえるように、これはdepを操作するかなり一般的な方法です。管理セクション。

古典的なものを使用している場合<dependency>分解解像度のアルゴリズムは異なり、「最も近い定義」の原理を使用します。あなたのプロジェクトがルートになっているツリーとして、依存関係をイメージ化します。ルートから指定された依存関係のバージョンまでのツリー内の最短パス(最低深さ)が常に取られます。等しい深度の場合、最初に遭遇したのは(Maven 2.0.9以降)です。

この場合、単純にバージョンとの依存関係をcdi-apiに定義してください(深さは1になりますが、EE APIの深度は2になります)。アーティファクトから

2)使用の除外(複数可)

私はこれを自分で試していないが、理論的には、EE 7 APIの依存からcdi-apiを除外することが可能なはずです。これらの線に沿って何か:

<dependency> 
    <groupId>javax</groupId> 
    <artifactId>javaee-api</artifactId> 
    <version>7.0</version> 
    <exclusions> 
     <exclusion> 
      <groupId>javax.exterprise</groupId> 
      <artifactId>cdi-api</artifactId> 
     </exclusion> 
    </exclusions> 
</dependency> 
+0

実際にあなたの最初の答えは本当に正しいわけではありません。 Mavenはnearest-wins戦略を使用します。つまり、ツリーに同じ依存関係が2回ある場合、最も近いもの(最初のものを意味しない)が取得されます。しかし、提供された依存関係(またはオプションの依存関係)ではこのように動作しないようです。 – Rouliboy

+0

提供され、オプションでは、私が推測する別の話です。しかし、そうでなければ、ここで私が何を記述しているのか、何度も遭遇しました。私はそれがある意味で「最も近い」と考えています。しかし、私は本当にこれを定義するパラグラフを見つけるためにMavenのドキュメント全体を読むような気がしません。あなたがそれを探す場所を知っていれば、分かち合ってください。 – Siliarus

+0

私はあなたに同意する、私はあなたが記述したような状況にも遭遇するが、常に(私が覚えているから)提供されたスコープ(実行時またはコンパイルスコープに問題はなかった)で常に覚えている。このドキュメントは次のとおりです:https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html、「Dependency Mediation」を参照してください。 – Rouliboy

0

javaee-apiの前にcdi-apiの依存関係を置くと問題が解決され、mavenは "良い" cdi-api依存関係を拾います。

javaee-apiバージョンでは、すべてのJava EE 7 APIを使用することができます。 CDI 2.0はJava EE 7仕様の一部ではないため、手動で追加する必要があります。

+0

これは機能しますが、間違っているか悪い考えです。本当にそれらの定義を最初にロードし、他のものを "失敗"させるだけです。 javaee-apiがロードされたjarファイルには、読み込まれたcdi 2クラスに関する問題がある可能性があります。 –

+1

これは、Java EE仕様の8.0リリースがファイナライズされるまで実行する必要があります。 –

関連する問題