【问题标题】:Use java automatic module cdi.api with maven and java 9+在 maven 和 java 9+ 中使用 java 自动模块 cdi.api
【发布时间】:2019-05-08 10:03:49
【问题描述】:

我想在 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 {}

高度赞赏任何见解。

【问题讨论】:

  • 这是使用 Maven (mvn install) 还是 IDE(可能是 IntelliJ)?
  • 我使用命令行(更准确地说是“mvn clean install”)。

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


【解决方案1】:

当我使用 -X 指令运行 maven 时,我在我的 类路径。我相信,如果我错了,请纠正,这应该转化为 cdi.api 自动模块名称。但这仍然不起作用。

不,进入类路径的模块被翻译成the unnamed module

找不到模块: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 或更高版本支持在Java9 及更高版本中添加的模块路径,请确保maven-compiler-plugin 正在使用中。你可以做到as specified in this answer.

【讨论】:

  • 我的输出看起来像 [DEBUG] Classpath: [DEBUG] ../java11cdi/target/classes [DEBUG] ../.m2/repository/javax/enterprise/cdi-api/2.0/cdi -api-2.0.jar [调试] ../.m2/repository/javax/el/javax.el-api/3.0.0/javax.el-api-3.0.0.jar [调试] ../.m2 /repository/javax/interceptor/javax.interceptor-api/1.2/javax.interceptor-api-1.2.jar [调试] ../.m2/repository/javax/inject/javax.inject/1/javax.inject-1 .jar [DEBUG] 源根:[DEBUG] ../java11cdi/src/main/java 在我的输出中没有 Modulepath 的跟踪。这正常吗?
  • @AhmadShahwan 尝试使用完全相同的pom.xml 进行复制。我的机器上默认使用的编译器插件是org.apache.maven.plugins:maven-compiler-plugin:3.1,它当然不支持我之前指定的&lt;release&gt; 配置。这也应该为您解决问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-25
  • 1970-01-01
  • 2017-07-10
  • 2021-10-14
  • 2018-03-09
  • 2018-06-22
相关资源
最近更新 更多