在maven和Java9中使用java自动模块cdi.api+

mzillmmw  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(503)

我想在java模块中使用cdi功能。我希望我的代码保持通用性,不依赖于特定的实现。
我使用Java11和Maven3.6.0。
为了简单起见,我的目标是导入包 javax.enterprise.context 在java文件中。当我这样做没有模块(没有 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文件名启发的自动模块名。当我和maven一起跑步的时候 -X 我明白了 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 {}

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

eoigrqb6

eoigrqb61#

当我用-x指令运行maven时,我看到 cdi-api-2.0.jar 在我的课堂上。我相信,如果我错了,这应该翻译成 cdi.api 自动模块名称。但还是不行。
不,生成类路径的模块被转换为未命名的模块。
未找到模块: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及更高版本中添加的modulepath。你可以按这个答案的规定做。

相关问题