URLClassLoaderに与えるJarファイルのURLの書き方

URLClassLoaderの引数として与えるJarファイルのURLの書き方としては、

  1. file:[Jarへのファイルパス]
  2. jar:file:[Jarへのファイルパス]!/

の2通りが可能ですが、実は挙動が異なります。

クラスのロードやリソースの取得では同じ挙動をするのですが、ディレクトリリソースを取得してみると、
1の場合は取得できるのに対し、2では取得できません。

例えば

ClassLoader cl = new URLClassLoader(new URL[]{ new URL("file:/C:/s2-framework-2.4.20.jar") });
URL url = cl.getResource("org/seasar/framework");

とすると、urlは「jar:file:/C:/s2-framework-2.4.20.jar!/org/seasar/framework」となりますが、

ClassLoader cl = new URLClassLoader(new URL[]{ new URL("jar:file:/C:/s2-framework-2.4.20.jar!/") });
URL url = cl.getResource("org/seasar/framework");

とすると、urlはnullになります。

調べてみたところ、この挙動はSun JDK1.4、1.5、1.6で同様でした。

というわけで、JarファイルのURLを指定するときには「"jar:"+ファイルリソースのURL+"!/"」形式は避けたほうがよさそうです。