-ClassLoaderで修行

さて、地道に修行してみました。下記のコードは読み出しターゲットとするためだけに、XercesのJARをクラスパスに入れています。

public void testMetaInfLoading() throws IOException {
  ClassLoader loader = Thread.currentThread().getContextClassLoader();
  InputStream in = loader.getResourceAsStream(
    "META-INF/services/org.xml.sax.driver");
  assertNotNull(in);
  BufferedReader reader = new BufferedReader(new InputStreamReader(in));
  String line = reader.readLine();
  assertEquals("org.apache.xerces.parsers.SAXParser", line);
}

テストとおっちゃったよ。ふと思いつきで書いたテストコードですが、びっくり。これまでJarFileやらJarEntryやらでやってたのも無意味ではないのですが、これが出来るなら話は早かった。この方法では、複数のJarをもっていたりして同じパス名でかぶる場合には先に見つかるものしか読めませんし、ファイル名を知らないときには読めませんが。。。いや、これでいい場合もあるのです。
とにかく、META-INFの下はClassLoaderで読めないものだとばっかり思いこんでました。