私は読んでいた InfoQのこの記事 Reinholdを引用:
開発者は、Java 9でJava 9のJavaランタイムを使用してクラスおよびリソースファイルを検索できます。 Java 9のモジュールでは、開発者はクラスパスを必要としなくなりました。
だから今私の質問は次のとおりです:適切なJava 9上記のタスクを実行する9つの方法?動的にロードする方法(たとえば、相対パスをいじるの短い)?
さらに興味深いことに、クラスが使用可能かどうかを動的に確認し、動的に決定を下すにはどうすればよいでしょうか(たとえば、ジャクソンが使用可能かどうかを確認し、使用可能な場合はJSONシリアル化に使用し、他の何かを使用しない場合)?
この記事では、Spring BootがすでにサポートしているJava 9であり、Spring Bootは多くの動的ロードを確実に行う。だから誰かがSpringのコードの大部分を知っているかもしれない。
[編集:この回答は、マークの正式な回答の前に書かれました。 GitHubで で利用できる簡単な例を提供するために、私のものを修正しました。]
このビデオ ごとに、Java 9のクラスローディングは変更されません。
例として、次のものがあるとしましょう:
example.jar
net.codetojoy.example.resources
net.codetojoy.example.Composer
は公開されています(必要に応じてエクスポートされます)example.jar
をライブラリとして使用し、そこから画像をロードしようとする単純なApp
クラスApp
の関連コード:
static InputStream getResourceAsStream(String resource)
throws Exception {
// Load net/codetojoy/example/resource/image.jpg
// Assume net.codetojoy.example.Composer is public/exported
// resource is 'resource/image.jpg'
InputStream result = Composer.class.getResourceAsStream(resource);
return result;
}
JDK 9のexample.jar
のいくつかのケースを次に示します。
昔ながらの非モジュラージャー
example.jar
がモジュールでない場合、コードは機能します。クラスの読み込みは変更されていません。
オープンパッケージのモジュラージャー
この場合、これはmodule-info.Java
ファイルです:
module net.codetojoy.example {
// export the Composer class
exports net.codetojoy.example;
// image is available
opens net.codetojoy.example.resources;
}
この場合、パッケージが開いているため、クライアントがイメージをロードできます。
オープンパッケージのないモジュラージャー
この場合、module-info.Java
は次のとおりです。
module net.codetojoy.example {
// export the Composer class
exports net.codetojoy.example;
// package not opened: image not available
// opens net.codetojoy.example.resources;
}
この場合、強力なカプセル化のためにイメージをロードできません。モジュールはパッケージを開かないことでイメージを保護しています。
完全なソース GitHubの場合 。