将Java自动模块cdi.api与Maven和Java 9+结合使用

时间:2018-12-06 16:41:29

标签: java maven java-module jigsaw module-info

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

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

1 个答案:

答案 0 :(得分:2)

  

当我使用-X指令运行maven时,我看到cdi-api-2.0.jar   类路径。我相信,如果我错了,那应该转化为   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

如果maven-compiler-plugin或更高版本,请确保使用3.6.0以支持Java9及更高版本中添加的模块路径。您可以做到as specified in this answer.