将java自动模块cdi.api与maven和java 9+;

将java自动模块cdi.api与maven和java 9+;,java,maven,java-module,java-platform-module-system,module-info,Java,Maven,Java Module,Java Platform Module System,Module Info,我想在java模块中使用CDI功能。我希望我的代码保持通用性,不依赖于特定的实现 我使用Java11和Maven 3.6.0 为了简单起见,我的目标是在java文件中导入包javax.enterprise.context。当我在没有模块(没有module info.java)的情况下这样做时,一切都很好 现在,当我添加一个模块info.java而不需要其他模块时,我会收到以下错误消息: 包javax.enterprise.context不可见(包javax.enterprise.context

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

我使用Java11和Maven 3.6.0

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

现在,当我添加一个
模块info.java
而不需要其他模块时,我会收到以下错误消息:

包javax.enterprise.context不可见(包javax.enterprise.context在未命名模块中声明,但模块javax.enterprise.context不读取它)

直到现在一切都很好。由于我不需要CDI模块,因此此消息很有意义

为了解决这个问题,我添加了
需要cdi.api
到my
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/com/acme/main.java

package com.acme;

import javax.enterprise.context.*;

class Main {}
任何见解都将受到高度赞赏

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

否,生成类路径的模块被转换为

未找到模块:cdi.api

表示在modulepath上找不到
cdp.api
模块


我尝试复制相同的代码,但是相同的可复制代码对我来说很好,但是请注意我的日志如下:


如果
3.6.0
或更高版本支持在Java9或更高版本中添加的modulepath,只需确保
maven编译器插件
正在使用。您可以使用Maven(
mvn install
)或IDE(IntelliJ)来完成它吗?我使用命令行(“mvn clean install”更准确地说)。我的输出类似于[DEBUG]类路径:[DEBUG]../java11cdi/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/javax.inject/1.jar[DEBUG]源根:[调试]../java11cdi/src/main/java无模块路径的跟踪。这正常吗?@AhmadShahwan试图用完全相同的
pom.xml
进行复制。在我的机器上默认使用的编译器插件是
org.apache.maven.plugins:maven compiler plugin:3.1
,它当然不支持前面指定的
配置。这也会帮你解决的。
package com.acme;

import javax.enterprise.context.*;

class Main {}
[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