Используйте java автоматический модуль cdi.api с maven и java 9+ - PullRequest
0 голосов
/ 06 декабря 2018

Я хочу использовать функциональность 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 {}

Любые идеи высоко ценятся.

1 Ответ

0 голосов
/ 06 декабря 2018

Когда я запускаю maven с директивой -X, я вижу cdi-api-2.0.jar в моем пути к классам.Полагаю, поправьте, если я ошибаюсь, это должно привести к cdi.api автоматическому названию модуля.Но все равно это не работает.

Нет, модули, полученные в classpath, переводятся в безымянный модуль .

модуль не найден: 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 и выше.Вы можете сделать это , как указано в этом ответе.

...