什么是Java EE7和CDI 2.0的Maven依赖?

时间:2017-05-29 18:25:10

标签: java maven tomcat cdi weld

我正在使用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)?

2 个答案:

答案 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规范的一部分,这就是您需要手动添加它的原因。