2017-05-29 63 views
0

我正在使用JavaEE 7,但我想使用CDI 2.0 API(Weld和Tomcat,Jersey也是)。當我有以下Maven的依賴,它使用事件老CDI API(所以沒有fireAsync):什麼是Java EE7和CDI 2.0的Maven依賴關係?

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

添加此下方不能解決問題(因爲第一個Maven依賴覆蓋它):

<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 焊接servlet的核心 3.0.0.Final更換 ' – walkeros

回答

2

截至目前(2017年5月),EE 8仍未發佈。任何EE 7 API依賴項都將引入CD 1.2。因此,您需要利用Maven來解決衝突的依賴版本。我能想到的兩種方法是:

1)定義CDI依賴你定義EE 7 API

當宣佈在pom.xml,Maven的解決依賴你的<dependencyManagement>部分版本從上到下,例如前第一次遇到定義版本。這意味着如果你第一次定義javax.exterprise:cdi-api:2.0,那麼它將花費2.0,一旦你達到EE API,CDI版本將被忽略。這聽起來像Hacky,這是操縱dep的常用方式。管理部分。

當使用經典的<dependency> dep分辨率的算法不同,並使用「最接近定義」的原則。將依賴關係映像爲以項目爲根的樹。始終採用從根到給定依賴關係版本的樹中最短路徑(最低深度)。在相同深度的情況下,首先遇到(自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使用最近贏的策略,這意味着如果你的樹中有兩次相同的依賴關係,最近的那個(不是第一個)就被拾取。然而,它看起來不像這樣提供依賴關係(或可選依賴關係)。 – Rouliboy

+0

嗯提供和可選是我猜不同的故事。但除此之外,我遇到了我在這裏描述的幾次以上 - 使用了最頂級的dep。我想這在某種意義上是「最接近」的。但我並不想真正閱讀整個Maven文檔來找到定義它的段落。如果你知道在哪裏尋找它,請分享。 – Siliarus

+0

我同意你的觀點,我也遇到過像你描述的情況,但總是(從我記憶中)提供的或測試範圍(從未遇到運行時或編譯範圍的問題)。這裏是文檔:https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html,請參閱「依賴調解」。 – Rouliboy

0

如果你把cdi-api依賴關係放在javaee-api之前,它會解決你的問題,maven會拿起「良好」cdi-api依賴關係。

對於第二個問題,javaee-api中的7.0版本就足以擁有所有的Java EE 7 API。請注意,CDI 2.0不是Java EE 7規範的一部分,因此您需要手動添加它。

+0

這確實有效,但它似乎是錯誤或壞主意。它只是首先加載這些定義並讓其他人「失敗」。但加載javaee-api的罐子可能與加載的cdi 2類有關。 –

+1

這是在Java EE規範的8.0版完成之前需要執行的操作。 –