web-dev-qa-db-ja.com

Java 9を使用してmodule-info.Javaを配置する場所?

私はOSGIアプリケーションを持っており、約30のバンドル(jarファイル)を持っています。今日、私はそれがどのように機能するか/それがJava 9で機能するかどうかを確認することにしました。

だから私は自分のアプリケーションを開始し、

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.Apache.felix.framework.util.SecureAction (file:/home/.../jar/org.Apache.felix.framework-5.4.0.jar) to method Java.net.URLClassLoader.addURL(Java.net.URL)
WARNING: Please consider reporting this to the maintainers of org.Apache.felix.framework.util.SecureAction
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release

読んだ後、コマンドラインオプションを追加しました

--add-exports Java.base/Java.net=org.Apache.felix.framework 

次の内容のファイルmodule-info.Javaを作成しました。

module org.Apache.felix.framework { }

そして、2つの質問があります。 jvmに読み取らせるには、このmodule-info.Javaをどこに配置すればよいですか?このmodule-infoをorg.Apache.felix.framework-5.4.0.jar file/bundle/jarにバインドするにはどうすればよいですか?

私がすべて間違ったことをしてください、この問題を解決するための正しい方向を教えてください。

10
Pavel_K

一般的なヒント:

特定の質問に答えるには:

モジュール宣言module-info.Java)は、ソースルートディレクトリ(例:src/main/Java)に移動する必要があります。次に、コンパイルするファイルのリストに含まれている必要があるため、モジュール記述子module-info.class)に変換されます。最後のステップは、JARにパッケージ化されているクラスファイルのリストにそれを含めることです。 (JARにモジュール記述子があると、それはモジュラーJARに変わります。モジュールパスに配置されている場合、JPMSはそれをモジュールに変えます。)

結局モジュールを作成せず、名前のないモジュールでコードを実行したい場合は、プレースホルダーALL-UNNAMEDを使用して内部APIへのアクセスを許可できます-警告が必要な場合はopenそのパッケージをリフレクションに:

--add-opens Java.base/Java.net=ALL-UNNAMED

ただし、より良い解決策は、内部APIの使用を停止することです。 ????これはコードではなく依存関係であるため、内部APIのアクセスを削除するように求めるApacheFelixの問題を探すか開く必要があります。

11
Nicolai

さて ジグソークイックスタート は、Java-9でプロジェクトを開始する場合に開始するのに最適な方法です。

Jvmに読み取らせるには、このmodule-info.Javaをどこに配置すればよいですか?

宣言module org.Apache.felix.framework { }からモード名を推測するには、module-info.Javaファイルをプロジェクトディレクトリの次の場所に配置する必要があります。

src/org.Apache.felix.framework/module-info.Java 

このmodule-infoをorg.Apache.felix.framework-5.4.0.jarfile/bundle/jarにバインドするにはどうすればよいですか?

さらに、モジュールをコンパイルしてパッケージ化する(モジュラーjarの最上位ディレクトリにmodule-info.classをバインドする)には、javacおよびjarコマンドを使用できます。

上記のサンプルコマンドは次のようになります。

$ javac --module-path mods -d mods/org.Apache.felix.framework \
    src/org.Apache.felix.framework/module-info.Java src/org.Apache.felix.framework/com/Apache/felix/framework/Application.Java


$ jar --create --file=mlib/org.Apache.felix.framework.jar \
    --main-class=com.Apache.felix.framework.Application -C mods/com.Apache.felix.framework

さらに、以下を使用してモジュールを実行できます。

$ Java -p mlib -m com.Apache.felix.framework

また、State Module SystemとQuick-Startドキュメントとは別に、既存のプロジェクトをJava-9に移行する場合は、適応に必要な明確な段階的移行を示す JDK9移行ガイド に従うことをお勧めします。 Java9へ。

2
Naman

不正アクセスを行っているorg.Apache.felix.framework-5.4.0.jarのコードであり、修正する必要があるため、ApacheFelixにバグを送信する必要があります。新しいバージョン5.6.8と--illegal-access=debugで簡単なテストを行いましたが、Felixには注意が必要な問題がいくつかあるようです。はい、Java.netパッケージを「ALL-UNNAMED」で開くことにより、上記の特定の警告を一時的に取り除くことができますが、それは1つまたは多くの問題にすぎません。

2
Alan Bateman