java - 使用 java 自动模块 cdi.api 与 maven 和 java 9+

标签 java maven java-module java-platform-module-system module-info

我想在 java 模块中使用 CDI 功能。我希望我的代码保持通用并且不依赖于特定的实现。

我使用 Java 11 和 Maven 3.6.0。

为了简单起见,我的目标简化为在 java 文件中导入包 javax.enterprise.context 。当我在没有模块(没有 module-info.java)的情况下这样做时,一切都运行良好。

现在,当我添加 module-info.java 而不需要其他模块时,我收到以下错误消息:
包 javax.enterprise.context 不可见(包 javax.enterprise.context 在未命名模块中声明,但模块 javax.enterprise.context 不读取它)

到目前为止一切都还好。该消息很有意义,因为我不需要 CDI 模块。

为了解决这个问题,我将 requires cdi.api; 添加到我的 module-info.java 中,结果出现以下错误:
找不到模块:cdi.api

我的理解是,CDI 库应该采用受 jar 文件名称启发的自动模块名称。当我使用 -X 指令运行 Maven 时,我在类路径中看到 cdi-api-2.0.jar 。我相信,如果我错了,请纠正,这应该转换为 cdi.api 自动模块名称。但这仍然行不通。

这是我的最小示例:

pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.acme</groupId>
  <artifactId>test.java.cdi</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
           <groupId>javax.enterprise</groupId>
           <artifactId>cdi-api</artifactId>
           <version>2.0</version>
           <scope>provided</scope>
        </dependency>
    </dependencies>

</project>

src/main/java/module-info.java:

module com.acme.test.cid {
    requires cdi.api;
}

src/main/java/com/acme/Main.java

package com.acme;

import javax.enterprise.context.*;

class Main {}

任何见解都将受到高度赞赏。

最佳答案

When I run maven with -X directive I see cdi-api-2.0.jar in my classpath. I believe, correct if I'm wrong, this should translate to cdi.api automatic module name. But still this doesn't work.

不,生成类路径的模块将被转换为 the unnamed module .

module not found: cdi.api

表示在模块路径上未找到 cdp.api 模块。


我尝试复制相同的代码,但相同的可复制代码对我来说效果很好,但请注意我的日志读取:

[DEBUG] Classpath:
[DEBUG] Modulepath:
[DEBUG]  .../Desktop/cdipi/target/classes
[DEBUG]  .../.m2/repository/javax/enterprise/cdi-api/2.0/cdi-api-2.0.jar
[DEBUG]  .../.m2/repository/javax/el/javax.el-api/3.0.0/javax.el-api-3.0.0.jar
[DEBUG]  .../.m2/repository/javax/interceptor/javax.interceptor-api/1.2/javax.interceptor-api-1.2.jar
[DEBUG]  .../.m2/repository/javax/inject/javax.inject/1/javax.inject-1.jar
[DEBUG] Source roots:
[DEBUG]  .../Desktop/cdipi/src/main/java
[DEBUG]  .../Desktop/cdipi/target/generated-sources/annotations

只要确保 3.6.0 或更高版本使用的 maven-compiler-plugin 即可支持 Java9 及更高版本中添加的模块路径。你可以的as specified in this answer.

关于java - 使用 java 自动模块 cdi.api 与 maven 和 java 9+,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53655965/

相关文章:

java - 将 AWT 图形代码移植到 Android

java - 添加超过10帧时动态壁纸动画强行关闭?

spring - 用于编写 Spring AOP 程序的 Maven 依赖项?

java - maven,修复编译顺序模块

java - Spring JPA 的最低要求是什么

java - 模块化项目使用 jOpenDocument 引发 InvalidModuleDescriptorException

java - 哈希表中的并发性和故障安全行为

java - 正则表达式或字符串操作从字符串派生自动模块名称

java - 为什么 Maven shade 插件会删除 module-info.class?

java - 使用 Selenium 和 Java 9 执行自动化测试时发生非法反射访问操作