web-dev-qa-db-ja.com

IntelliJの--patch-moduleでJava 9モジュールをコンパイルできませんIDEA 2017.2.1

Java 9モジュールと、それらをIntelliJで定義する方法を理解しようとしています。とりわけ、--patch-moduleコンパイラ/ JVMフラグを使用して分割パッケージの問題を解決したいのですが、IntelliJでそれを機能させる方法がわかりません。

IntelliJ IDEA2017.2.1ビルド#IC172.3544.35とJava HotSpot(TM)64ビットサーバーVM(ビルド9 + 180、混合)を使用していますモード)。

これは私のソースファイルですMyImmutableList.Java

package com.google.common.collect;

public class MyImmutableList extends RegularImmutableList {
  public MyImmutableList(Object[] array) {
    super(array);     
  }
}

それは私のモジュールcom.effjava.collectmodule-info.Javaに属しています。

module com.effjava.collect {
    // do not require module guava; instead patch this module with guava.19-0.jar via:
    // javac --patch-module com.effjava.collect=guava-19.0.jar module-info.Java com/google/common/collect/MyImmutableList.Java
    //    requires guava;        
    exports com.google.common.collect;
}

モジュールをコンパイルするために、IntelliJでSettings => --patch-module => Compiler => Build,Execution,Deplyomentを-として使用してShared build process VM optionsフラグを指定しました。 ここで説明

コンパイラがguavaライブラリからスーパークラスRegularImmutableListを見つけることができないため、コンパイルは失敗します。

IntelliJが提供するアドバイスは、guavaライブラリのrequiresディレクティブをモジュール記述子に追加することです。これはもちろん、コンパイラが分割パッケージの問題について正しく文句を言うため、機能しません。

エラー:Java:モジュールguavaはcom.effjava.collectとguavaの両方からパッケージcom.google.common.collectを読み取ります

さらに調査したところ、ビルドプロセスが--patch-moduleフラグに関連する警告を発行していることに気付きました。

エラー:ビルドプロセスの異常終了: "C:\ Program Files\Java\jdk-9\bin\Java" -Xmx700m -Djava.awt.headless = true

... たくさんのもの ...

警告:不明なモジュール:com.effjava.collectが--patch-moduleに指定されています

...その他...

ところで、コンパイラの警告を取得する方法がわかりませんでした。 IntelliJのメッセージウィンドウで非表示にしませんが、表示されません。回避策として、偽のコンパイラフラグを指定し、ビルドプロセスをクラッシュさせて、クラッシュレポートに警告が表示されるようにしました。

とにかく、ビルドプロセスは、モジュールのビルド中に、問題のモジュールが存在しないため、--patch-moduleを介してパッチを適用できないと文句を言います。コマンドラインレベルでjavacコマンドとjarコマンドを手動で入力してモジュールを正常にコンパイルおよびビルドしたため、この苦情は意味がありません。

cd %PROJECTDIR%\com.effjava.collect\src
javac --patch-module com.effjava.collect=../../guava/guava-19.0.jar -d ../../out/production/com.effjava.collect module-info.Java com/google/common/collect/MyImmutableList.Java
jar --create --file=../../out/artifacts/com_effjava_collect_jar/com.effjava.collect.jar -C ../../out/production/com.effjava.collect .

モジュールにパッチを適用することをIntelliJのビルドプロセスに伝えるにはどうすればよいですか?

22
alanger

最終的には、IntelliJの次の構成で(IDEA-169150のバージョンを修正) ) -

IntelliJ IDEA 2018.1 (Community Edition)
Build #IC-181.4203.550, built on March 27, 2018
JRE: 1.8.0_152-release-1136-b20 x86_64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
macOS 10.13.3

次のスクリーンショットのように、プロジェクトのJavaコンパイラ設定:-

Java compiler configuration

  • モジュールごとにコンパイラパラメータをオーバーライドする
  • モジュールを選択します
  • パッチにコンパイルオプションを追加します(-私は使用しましたjarの最新バージョン

    --patch-module com.effjava.collect=/Users/naman.nigam/.m2/repository/com/google/guava/guava/24.1-jre/guava-24.1-jre.jar
    

この選択を投稿してくださいビルド>ビルドプロジェクトそしてビルドは正常に完了します(まだRegularImmutableList in MyImmutableList as red)forme。

enter image description here

2
Naman