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