Classpath resources(クラスパスからリソースを読み込むあれこれ。jarの中とか。)

Webではあまり気にしたことのなかったリソースの配置場所なのですが、
スタンドアロンで配布する場合どこに置いてどう読み込むのかと。
(jarに全部固める場合とか、絶対パス指定できないとか)


propertiesファイルをjarの中に入れてしまいたいのです。


で、そういえばSeasarさんは何個かdiconファイルがjarの中にあったなーと思い、色々のぞいてみて
「おぉ、クラスローダーを使うのか」となりました。(ResourceUtilらへんを参照させてもらいました)。


その流れで
http://www.javaworld.com/javaworld/javaqa/2003-08/01-qa-0808-property.html
のステキな表にたどり着いたのでコピっておきます。

Behavioral differences

Method Parameter format Lookup failure behavior Usage example
ClassLoader.getResourceAsStream() "/"-separated names; no leading "/" (all names are absolute) Silent (returns null) this.getClass().getClassLoader().getResourceAsStream("some/pkg/resource.properties")
Class.getResourceAsStream() "/"-separated names; leading "/" indicates absolute names; all other names are relative to the class's package Silent (returns null) this.getClass().getResourceAsStream("resource.properties")
ResourceBundle.getBundle() "."-separated names; all names are absolute; .properties suffix is implied Throws unchecked java.util.MissingResourceException ResourceBundle.getBundle("some.pkg.resource")
  • ClassLoader.getResourceAsStream()
    • クラスパスの頭から。
    • 区切りは「/」で。
    • 頭に「/」は入れない。
  • Class.getResourceAsStream()
    • クラスのある場所から。
    • 区切りは「/」で。
    • 先頭に「/」を入れたら、クラスパスの頭から。
  • ResourceBundle.getBundle()
    • クラスパスの頭から。
    • 区切りは「.」で。