Java モジュールで CDI 機能を使用したいと考えています。コードを汎用的なままにして、特定の実装に依存しないようにしたいと考えています。
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 ファイルの名前に触発された自動モジュール名を使用する必要があります。-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 {}
どんな洞察も高く評価されます。