LoginSignup
8
8

More than 5 years have passed since last update.

参考メモ/Javaでclasspath上のリソースに再帰的にアクセスするにはCodeSourceを使う

Posted at

きっかけと疑問:

  • Class.getResource()ClassLoader.getResourceAsStream() はピンポイントでリソースのフルパスを指定する。
  • → ファイルシステムのディレクトリのように、リソースを再帰的に読みだすのはどうすればよいか?

結論から書くと、CodeSourceを使ってclasspathのファイル・システムまたはjarファイルにアクセスすることで実現できるので、参考までにメモ。

java.security.CodeSource

サンプルコード

Linuxでの実行結果:

===> execute testpkg.Main from filesystem
Main : file
Main : /home/msakamoto/github/msakamoto-sf/java-codesource-sample/main/
(...)
Foo : file:/home/msakamoto/github/msakamoto-sf/java-codesource-sample/libfoo/
(...)
Bar : file:/home/msakamoto/github/msakamoto-sf/java-codesource-sample/libbar/

===> execute testpkg.Main from jar
Main : file
Main : /home/msakamoto/github/msakamoto-sf/java-codesource-sample/main.jar
(...)
Foo : file:/home/msakamoto/github/msakamoto-sf/java-codesource-sample/libfoo.jar
(...)
Bar : file:/home/msakamoto/github/msakamoto-sf/java-codesource-sample/libbar.jar

Windowsでの実行結果:

"===> execute testpkg.Main from filesystem"
Main : file
Main : /C:/work/SVNWORK/github/msakamoto-sf/java-codesource-sample/main/
(...)
Foo : file:/C:/work/SVNWORK/github/msakamoto-sf/java-codesource-sample/libfoo/
(...)
Bar : file:/C:/work/SVNWORK/github/msakamoto-sf/java-codesource-sample/libbar/
(...)

"===> execute testpkg.Main from jar"
Main : file
Main : /C:/work/SVNWORK/github/msakamoto-sf/java-codesource-sample/main.jar
(...)
Foo : file:/C:/work/SVNWORK/github/msakamoto-sf/java-codesource-sample/libfoo.jar
(...)
Bar : file:/C:/work/SVNWORK/github/msakamoto-sf/java-codesource-sample/libbar.jar
(...)

サンプルコードでの実験結果サマリ:

  • ファイルシステム上のmain, libfoo, libbarディレクトリをクラスパスに指定した時は、CodeSource.getLocation() がそれぞれのディレクトリを返した。
  • jarファイルをクラスパスに指定した時は、CodeSource.getLocation() がそれぞれのファイルシステム上のjarファイル名を返した。
  • いずれの場合も、Java標準のAPIを使ってファイルシステム/jarファイル内のコンテンツ一覧にアクセスできた。

参考URL

感想:

  • 普段サーバサイドのJavaを扱うことが多いため気づかないことが多いが、Java自体はクライアント・アプリケーションとしての歴史の方が長い。
  • そのため、サーバサイドでは普段意識しないようなセキュリティ系の機能が、意外とキー要素になっていたりする。
  • デプロイ機能やWebStartなど、サーバサイドでは普段使わないようなJavaの機能に、意外とお宝が眠ってるかもしれない。
8
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8