当前位置: 首页 > 知识库问答 >
问题:

与maven和Java9+一起使用java自动模块CDI.API

李招
2023-03-14

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

我使用Java11和Maven3.6.0。

为了简单起见,我的目标被简化为在java文件中导入包javax.enterprise.context。当我在没有module(没有module-info.java)的情况下这样做时,每件事都能正常工作。

我的理解是,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;
}
package com.acme;

import javax.enterprise.context.*;

class Main {}

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

共有1个答案

杜俊风
2023-03-14

当我使用-x指令运行maven时,我在类路径中看到cdi-api-2.0.jar。我相信,如果我错了,请更正,这应该转换为cdi.api自动模块名称。但这还是不起作用。

否,生成类路径的模块被转换为未命名的模块。

找不到模块:CDI.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
 类似资料:
  • 我有一个明确的模块化项目,它依赖于一个自动模块;e、 g.关于java。激活。仍然可以使用jlink吗? 查看此模块信息。爪哇: 然后jlink不能添加模块: 根据我的理解,一个自动模块无论如何都会包含整个类路径。所以我想用jlink创建运行时映像没有任何好处? 另请参阅:什么是自动模块? 有没有可能绕过这个问题?也许为这些依赖生成module-info.java?

  • =>如何正确地将log4j作为Java9的一个模块依赖项包含进来? (我对以下依赖项有相同的问题:需要Hibernate.core;需要Hibernate.jpa.2.1.api;需要JCommander;需要JUnit;需要Reflections;) 到目前为止我所做的: 更新了pom.xml文件中的log4j版本,因为log4j 1.2似乎不能与Java9一起工作(请参阅https://blo

  • 食氧;视窗7;JDK 9决赛从9日开始,21日结束;JUnit4.12和现有的应用程序。作为起点,可以编译、执行应用程序,并且所有JUnit测试都显示为绿色。现在我们使用eclipse生成文件模块信息。JAVA结果是: 但有一个错误:junit无法解析为模块。问题是:如何告诉文件junit没有定义任何模块,应该在兼容模式下运行?

  • 我试图使用Maven将Hibernate添加为我的OSGi包的依赖项。在我的POM文件中,我有: 但是,当我运行时,我得到了一个错误: 组织。奥斯基。框架BundleException:捆绑组织中未解决的约束。冬眠核心[8]:无法解决8.0:缺少要求[8.0]osgi。装电线。包裹( 所以我为javax添加了另一个依赖项。企业背景: 解决了之前的错误,但导致了另一个错误: 自动属性安装:file:

  • 问题内容: 我试图将Python 3程序反向移植到2.7,但遇到了一个奇怪的问题: 根据文档,返回Unicode文本的内存流。当我尝试手动输入Unicode字符串时,它可以正常工作。为什么即使所有写入的字符串都是Unicode字符串,它也无法与模块结合使用?在什么地方来,它使得异常? (我知道我可以代替使用,但是我想知道在这种情况下怎么了) 问题答案: Python 2.7模块不支持Unicode