2

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 {}

どんな洞察も高く評価されます。

4

1 に答える 1