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.collect
とmodule-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のビルドプロセスに伝えるにはどうすればよいですか?
最終的には、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コンパイラ設定:-
パッチにコンパイルオプションを追加します(注-私は使用しました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。