web-dev-qa-db-ja.com

Mavenシェードプラグインがmodule-info.classを削除するのはなぜですか?

モジュラーjarにmaven-shade-pluginを使用しようとします。

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.1.1</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <minimizeJar>true</minimizeJar>
        <artifactSet>
            <includes>
                <include>javax.xml.bind:jaxb-api</include>
                <include>com.Sun.xml.bind:jaxb-impl</include>
            </includes>
        </artifactSet>
        <relocations>
            <relocation>
                <pattern>javax.xml.bind</pattern>
                <shadedPattern>org.update4j.javax.xml.bind</shadedPattern>
            </relocation>
            <relocation>
                <pattern>com.Sun.xml.bind</pattern>
                <shadedPattern>org.update4j.com.Sun.xml.bind</shadedPattern>
            </relocation>
        </relocations>
    </configuration>
</plugin>

ただし、Mavenは警告付きでmodule-info.classを色付きのjarファイルから削除します。

[WARNING] Discovered module-info.class. Shading will break its strong encapsulation.

それを残すように構成するにはどうすればよいですか?

編集:警告は実際には、私自身ではなく、影付きのjarのモジュール記述子を削除すると発生します。

7
Mordechai

JPMSの世界ではmodule-infoがモジュールの公開を指示しているため、アイテムをシェーディングすると、「パッケージが2つの異なるモジュールから読み取られました」というエラーが発生する場合があります。

私はそれを次の方法で解決しました

  • すべてのモジュールにわたるmodule-infoのシェーディング、フィルタリング
  • 次にmodule-infoを追加します(これは有効な場合と無効な場合があります。MODに感謝します。これがどれほど役立つかわかりません)。
  <plugin>
        <groupId>org.Apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <configuration>
                     <excludes>
                        <exclude>module-info.Java</exclude>
                    </excludes>
        </configuration>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
          </execution>
        </executions>
      </plugin>

      <plugin>
        <groupId>org.moditect</groupId>
        <artifactId>moditect-maven-plugin</artifactId>
        <executions>
          <execution>
            <id>add-module-infos</id>
            <phase>package</phase>
            <goals>
              <goal>add-module-info</goal>
            </goals>
            <configuration>
              <overwriteExistingFiles>true</overwriteExistingFiles>
              <module>
                <moduleInfoFile>
                  src/main/Java/module-info.Java
                </moduleInfoFile>
              </module>
            </configuration>
          </execution>
        </executions>
      </plugin>

これは本当に迷惑なことであり、私が読んだすべてのものから、それを削除したり、バイパスするためのフラグを追加したりする意図はありません。

1
Marc Magon