我正在使用JavaEE 7,但我想使用CDI 2.0 API(同时使用Weld和Tomcat,Jersey)。当我有以下Maven依赖项时,它使用旧的CDI API for Event(所以没有recipe
):
fireAsync
在下面添加它不能解决问题(因为第一个maven依赖项会覆盖它):
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
</dependency>
如何通过Maven获得我需要的所有东西(Jersey / Jax-RS,Servlets,ServerEndpoint,CDI 2.0 / Weld in Tomcat 8)?
答案 0 :(得分:2)
截至目前(2017年5月),EE 8仍未发布。任何EE 7 API依赖都将带来CD 1.2。因此,您需要使用Maven来解决冲突的依赖版本。我可以想到两种方法:
1)在定义EE 7 API
之前定义CDI依赖关系 在<dependencyManagement>
的{{1}} 部分声明版本时,Maven会自上而下地解析依赖关系,例如:第一次遇到定义版本。这意味着如果您首先定义pom.xml
,那么它将需要2.0,一旦您到达EE API,CDI版本将被忽略。 Hacky听起来像这样,这是操纵dep的常用方法。管理部门。
使用经典javax.exterprise:cdi-api:2.0
时,dep分辨率算法会有所不同,并使用“最近定义”的原则。将依赖项映像为树,项目为根。从根到给定依赖的版本的树中的最短路径(最低深度)始终被采用。如果深度相同,则首先遇到(因为Maven 2.0.9)。
因此,在这种情况下,只需直接定义<dependency>
与版本的依赖关系就可以了(深度为1,而EE API深度为2)。
2)使用工件中的排除
我自己没有尝试过,但从理论上讲,应该可以从EE 7 API依赖项中排除cdi-api
。这些方面的东西:
cdi-api
答案 1 :(得分:0)
如果你将cdi-api
依赖关系放在javaee-api
之前,它将解决你的问题,而且maven会选择好的&#34;好的&#34; cdi-api
依赖。
对于您的第二个问题,javaee-api
版本中的7.0
足以拥有所有Java EE 7 API。请注意,CDI 2.0不是Java EE 7规范的一部分,这就是您需要手动添加它的原因。