在 Maven 和 java 9+ 中使用 java 自动模块 cdi.api
Use java automatic module cdi.api with maven and java 9+
我想在 java 模块中使用 CDI 功能。我希望我的代码保持通用并且不依赖于特定的实现。
我使用 Java 11 和 Maven 3.6.0。
为简单起见,我的目标是在 java 文件中导入包 javax.enterprise.context
。当我在没有模块(没有 module-info.java
)的情况下这样做时,一切正常。
现在,当我添加 module-info.java
而不需要其他模块时,我收到以下错误消息:
package javax.enterprise.context is not visible (package javax.enterprise.context is declared in the unnamed module, but module javax.enterprise.context does not read it)
到目前为止一切正常。这条消息很有意义,因为我不需要 CDI 模块。
为了解决这个问题,我将 requires cdi.api;
添加到我的 module-info.java
,结果出现以下错误:
module not found: 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及更高版本中添加的模块路径。你可以的
我想在 java 模块中使用 CDI 功能。我希望我的代码保持通用并且不依赖于特定的实现。
我使用 Java 11 和 Maven 3.6.0。
为简单起见,我的目标是在 java 文件中导入包 javax.enterprise.context
。当我在没有模块(没有 module-info.java
)的情况下这样做时,一切正常。
现在,当我添加 module-info.java
而不需要其他模块时,我收到以下错误消息:
package javax.enterprise.context is not visible (package javax.enterprise.context is declared in the unnamed module, but module javax.enterprise.context does not read it)
到目前为止一切正常。这条消息很有意义,因为我不需要 CDI 模块。
为了解决这个问题,我将 requires cdi.api;
添加到我的 module-info.java
,结果出现以下错误:
module not found: 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 tocdi.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及更高版本中添加的模块路径。你可以的