2017-10-06 12 views
3

Java 9では、いわゆる分割パッケージ、つまり同じパッケージが2つの異なるモジュールで定義されているようには見えません。これは私の移行プロセスで問題が発生します(Gradleの)プロジェクトは、このような構造で、bootstrap.jarと呼ばれるJarファイルが含まれていますJavaの分割パッケージとブートストラップJar 9

bootstrap.jar 
- com 
    - example 
    - Foo.class 
    - Bar.class 
    - Baz.class 

srcディレクトリには、同様にFooに依存クラスcom.example.Barが含まれていますcom.exampleのモジュール定義です。 bootstrap.jarファイルには、Java 9より前にコンパイルされたモジュール情報が含まれていないため、bootstrapという自動モジュールが使用されます。問題は、現在パッケージcom.exampleが両方のモジュールで定義されていることです。com.examplebootstrapです。次のように開始するには、このbootstrap.jarファイルがある

理由は、次のとおりです。

src/com/exampleフォルダが実際にBar.javaBaz.javaと別のファイル、Foo.dyvilが含まれています。後者は、JVMベースのプログラミング言語で書かれています。だから、依存チェーンは次のようになります。

Bar.java -> Foo.dyvil -> Baz.java 

ビルドプロセスの間に、それは後でbootstrap.jarに取って代わる新しいJARファイルに置かれますFoo.classにコンパイルされます。これらのファイルがすべて配置される理由は、JavaコンパイラとDyvilコンパイラが他の言語ファイルを処理できないため、前のビルドからコンパイルされたクラスにいくらかアクセスする必要があるためです。だからこそ、bootstrap.jarがあるのです。

現実問題:分割されたパッケージはJava 9では使用できませんので、私のプロジェクトで説明した「ブートストラップ」jarファイルを使用して「分割ビルド」を達成する方法はありますか?それとも他の方法がありますか?

答えて

4

これに対する長期的な解決策は、そのようなパッケージが単一のモジュールに存在することを解決してからコードをモジュール化することです。

一時的な解決策として

、このオプションを利用することができます: -

--patch-module com.example=bootstrap.jar 

あなたの場合のように

--patch-module <module>=<file>(<pathsep><file>)* 

--patch-moduleオプションのみを対象とし、しかし心の中でを維持してくださいテストとデバッグ。プロダクション環境での使用はお勧めしません。

+1

私は 'bootstrap.jar'のみのビルドに使用されているので、そのすべての後にパッケージがもはや – Clashsoft

+1

を分割している私はGradleの中に、コンパイラの引数として、これらのオプションを追加する必要が負うものではありませんが、どのように私はそれはOKだと思いますIntelliJでこれを利用しますか? – Clashsoft

+0

編集実行コンフィギュレーションのgradleオプションとVMオプションは、intelliJで使用できる場所です。 – nullpointer

関連する問題