23

私のプロジェクトは Netty Epoll トランスポートに依存しています。依存関係は次のとおりです。

<dependency>
    <groupId>io.netty</groupId>
    <artifactId>netty-transport-native-epoll</artifactId>
    <version>${netty.version}</version>
    <classifier>${epoll.os}</classifier>
</dependency>

この依存関係の自動生成されたモジュール名は次のとおりです。

netty.transport.native.epoll

またnative、Java 9 ではキーワードが予約されているため、このモジュールを依存関係としてプロジェクトに追加することはできません。

module core {
    requires netty.transport.native.epoll;
}

のため:

module not found: netty.transport.<error>

さらに、jar ツール--describe-moduleは次のように報告します。

次のモジュール記述子を取得できません: netty-transport-native-epoll-4.1.17.Final-SNAPSHOT-linux-x86‌_64.jar netty.transport.native.epoll: 無効なモジュール名: 'native' は Java 識別子ではありません

回避策はありますか? (もちろん、「正しいnettyアーティファクトをリリースする」を除く)。

編集

メンテナー向けの簡単な修正として、次の行をビルドに追加できます。

<manifestEntries>
   <Automatic-Module-Name>netty.transport.epoll</Automatic-Module-Name>
</manifestEntries>
4

2 に答える 2

1

今後は、この小さな Maven プラグインを使用して、ローカル Maven リポジトリの Scala jar 内のマニフェスト ファイルを自動的に変更することもできます: https://github.com/makingthematrix/scala-suffix

リンクの下に、問題全体の概要と追加する必要があるものがありますがpom.xml、ここでも説明するように求められたので、ここに記載します。

すでに述べたように、Java は_2.13バージョン番号などのモジュール名の接尾辞を認識せず、それらをモジュール名の不可欠な部分として扱います。そのため、プロジェクトが Scala の依存関係からクラスを使用しようとすると、your.scala.dependency.2.13your.scala.dependency だけでなく、それを行うのに失敗し、クラッシュします。

あなたの側でこれを修正するには(つまり、ライブラリの作成者からのアクションなしで)、これをあなたの<plugins>セクションに追加してくださいpom.xml

<plugin>
  <groupId>io.github.makingthematrix</groupId>
  <artifactId>scala-suffix-maven-plugin</artifactId>
  <version>0.1.0</version>
  <configuration>
    <libraries>
      <param>your-scala-dependency</param>
    </libraries>
  </configuration>
  <executions>
    <execution>
      <goals>
        <goal>suffix</goal>
      </goals>
    </execution>
  </executions>
</plugin>

ここで、バージョン サフィックスを除いた Scala 依存関係の名前です (複数ある場合は、タグyour-scala-dependencyを追加してください)。これは、セクション<param>と同じである必要があります。artifactId<dependency>

プラグインは、ローカルの Maven リポジトリにある依存関係の JAR ファイルを変更します。jar を開き、次META-INF/MANIFEST.MFの行を読み取り、追加します。

Automatic-Module-Name: your-scala-dependency

プロパティAutomatic-Module-Nameが既に存在する場合、プラグインは何もしません。その場合、依存関係は既に機能していると想定されます。これにより、プラグインが同じ JAR ファイルを複数回変更するのを防ぎます。

于 2021-05-05T08:10:20.280 に答える