私は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にバインドするにはどうすればよいですか?
私がすべて間違ったことをしてください、この問題を解決するための正しい方向を教えてください。
一般的なヒント:
特定の質問に答えるには:
モジュール宣言(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の問題を探すか開く必要があります。
さて ジグソークイックスタート は、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へ。
不正アクセスを行っているorg.Apache.felix.framework-5.4.0.jarのコードであり、修正する必要があるため、ApacheFelixにバグを送信する必要があります。新しいバージョン5.6.8と--illegal-access=debug
で簡単なテストを行いましたが、Felixには注意が必要な問題がいくつかあるようです。はい、Java.netパッケージを「ALL-UNNAMED」で開くことにより、上記の特定の警告を一時的に取り除くことができますが、それは1つまたは多くの問題にすぎません。