Я хочу использовать функциональность CDI в Java-модуле.Мне бы хотелось, чтобы мой код оставался универсальным и не зависел от конкретной реализации.
Я использую Java 11 и Maven 3.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
в моем classpath.Полагаю, поправьте, если я ошибаюсь, это должно привести к 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 {}
Любые идеи высоко ценятся.