web-dev-qa-db-ja.com

Java 9でクラスとリソースをロードする

私は読んでいた InfoQのこの記事 Reinholdを引用:

開発者は、Java 9でJava 9のJavaランタイムを使用してクラスおよびリソースファイルを検索できます。 Java 9のモジュールでは、開発者はクラスパスを必要としなくなりました。

だから今私の質問は次のとおりです:適切なJava 9上記のタスクを実行する9つの方法?動的にロードする方法(たとえば、相対パスをいじるの短い)?

さらに興味深いことに、クラスが使用可能かどうかを動的に確認し、動的に決定を下すにはどうすればよいでしょうか(たとえば、ジャクソンが使用可能かどうかを確認し、使用可能な場合はJSONシリアル化に使用し、他の何かを使用しない場合)?

この記事では、Spring BootがすでにサポートしているJava 9であり、Spring Bootは多くの動的ロードを確実に行う。だから誰かがSpringのコードの大部分を知っているかもしれない。

39
kaqqao

[編集:この回答は、マークの正式な回答の前に書かれました。 GitHubで で利用できる簡単な例を提供するために、私のものを修正しました。]

このビデオ ごとに、Java 9のクラスローディングは変更されません。

例として、次のものがあるとしましょう:

  • パッケージ内の画像を含むexample.jarnet.codetojoy.example.resources
  • jarを強化するために、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の場合

4
Michael Easter