URLClassLoaderに与えるJarファイルのURLの書き方
URLClassLoaderの引数として与えるJarファイルのURLの書き方としては、
- file:[Jarへのファイルパス]
- 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+"!/"」形式は避けたほうがよさそうです。