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

What is the Maven dependency for Java EE7 and CDI 2.0?

我正在使用 JavaEE 7,但我想使用 CDI 2.0 API(还有 Weld 和 Tomcat,Jersey)。当我有以下 Maven 依赖项时,它使用旧的 CDI API 作为事件(所以没有 fireAsync):

    <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、Servlet、ServerEndpoint、CDI 2.0/Weld in Tomcat 8)?

如果你把 cdi-api 依赖放在 javaee-api 之前,它会解决你的问题,maven 会选择 "good" cdi-api 依赖。

关于你的第二个问题,7.0 版本中的 javaee-api 足以拥有所有 Java EE 7 API。请注意,CDI 2.0 不是 Java EE 7 规范的一部分,因此您需要手动添加它。

截至目前(2017 年 5 月),EE 8 仍未发布。并且任何 EE 7 API 依赖项都会引入 CD 1.2。因此,您需要使用 Maven 来解决冲突的依赖版本。我可以想到两种方法:

1) 在定义 EE 7 之前先定义 CDI 依赖关系 API

当在 pom.xml<dependencyManagement> 部分声明版本时,Maven 从上到下解析依赖关系,例如第一次遇到定义版本。这意味着如果您首先定义 javax.exterprise:cdi-api:2.0,那么它将采用 2.0,一旦达到 EE API,CDI 版本将被忽略。这听起来很骇人听闻,但这是一种很常见的操作 dep 的方式。管理科.

当使用经典的<dependency>时,dep resolution的算法不同,使用了'nearest definition'的原理。将依赖关系想象成一棵树,您的项目是根。始终采用树中从根到给定依赖项版本的最短路径(最低深度)。在深度相等的情况下,首先遇到(自 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>