1. ホーム
  2. java

[解決済み] Class.getResource()とClassLoader.getResource()の違いは何ですか?

2022-02-07 22:09:15

質問

とはどう違うのでしょうか? Class.getResource()ClassLoader.getResource() ?

edit: 特に知りたいのは、ファイルやディレクトリのレベルでキャッシュが行われているかどうかです。クラスバージョンではディレクトリのリストはキャッシュされるのでしょうか?

AFAIK 以下は本質的に同じことをするはずですが、そうではありません。

getClass().getResource() 
getClass().getClassLoader().getResource()

に新しいファイルを作成するレポート生成コードをいじっているときに、このことを発見しました。 WEB-INF/classes/ そのディレクトリにある既存のファイルから クラスからのメソッドを使用すると、デプロイ時にあったファイルを getClass().getResource() しかし、新しく作成されたファイルを取得しようとすると、null オブジェクトが返されました。ディレクトリをブラウズすると、新しいファイルがあることは明らかです。ファイル名は "/myFile.txt" のようにフォワードスラッシュが先頭に付いていました。

ClassLoader のバージョンです。 getResource() 一方、生成されたファイルは見つかりました。この経験から、ディレクトリ一覧のキャッシュが行われているようです。もしそうなら、このことはどこで文書化されているのでしょうか?

から API ドキュメント について Class.getResource()

リソースの検索 を指定します。のルールは に関連するリソースを検索します。 与えられたクラスが実装されています。 そのクラスのクラスローダーを定義する。 このメソッドは、このオブジェクトの クラスローダーがあります。このオブジェクトが ブートストラップクラスローダによってロードされます。 に委譲されます。 ClassLoader.getSystemResource(java.lang.String)。

私には、これは "Class.getResource は実際には自身のクラスローダーの getResource()" を呼び出している、と読めます。これは getClass().getClassLoader().getResource() . しかし、明らかに違うのです。どなたか、この件に関して何かヒントを与えていただけないでしょうか?

解決方法は?

キャッシュが行われているかどうかの質問にお答えします。

この点について、getResourceAsStream ClassLoaderメソッドを使ってディスクからファイルを連続的に読み込むスタンドアロンJavaアプリケーションを実行してさらに調査してみました。ファイルを編集すると、その変更はすぐに反映されました。つまり、ファイルはキャッシュされずにディスクから再読み込みされました。

しかし 私は、いくつかのmavenモジュールとWebプロジェクトが互いに依存し合っているプロジェクトに取り組んでいます。私は、Webプロジェクトをコンパイルして実行するために、IDEとしてIntelliJを使用しています。

私は、上記のことはもう成り立たないようだと気づきました。理由は、私が読み込まれていたファイルがjarに焼かれて、依存するウェブプロジェクトにデプロイされるようになったからです。このことに気づいたのは、ターゲットフォルダ内のファイルを変更しようとした後だったのですが、無駄でした。このため、キャッシュが行われているように見えました。