import java.io.*;
import java.net.*;
import java.util.*;
公共类try it {
publicstaticvoidmain (字符串[ ] args ) throws Exception { )。
URL[] urls={
(newfile(a.jar ) ).getAbsoluteFile ) ).toURI ).toURL )、
(newfile(b.jar ) ).getAbsoluteFile ) ).toURI ).toURL ) )。
(;
urlclassloadercl=URL class loader.new instance (URLs;
String[] res={ 'foo '、' foo/'、' foo/arb '、' foo/bar '、' foo/cab' };
for(stringr:RES ) {
system.out.println(''r'': );
for (urlu : collections.list (cl.get resources (r ) )
system.out.println(''u;
}
}
}
准备此程序中提到的JAR文件。
mkdir a/foo b/foo
toucha/foo/Arba/foo/barb/foo/barb/foo/cab
echo 'Class-Path: b.jar' mf
jar cfm a.jar mf -C a foo
jar cf b.jar -C b foo
运行java TryIt时,将获得与以下示例类似的输出:
' foo':
jar:file:…/a.jar! /foo
jar:file:…/b.jar! /foo
' foo/':
jar:file:…/a.jar! /foo/
jar:file:…/b.jar! /foo/
' foo/arb':
jar:file:…/a.jar! /foo/arb
' foo/bar':
jar:file:…/a.jar! /foo/bar
jar:file:…/b.jar! /foo/bar
' foo/cab':
jar:file:…/b.jar! /foo/cab
但是,如果运行jar -i a.jar创建索引,则会打印上面的命令。
' foo':
jar:file:…/a.jar! /foo
' foo/':
jar:file:…/a.jar! /foo/
' foo/arb':
jar:file:…/a.jar! /foo/arb
' foo/bar':
jar:file:…/a.jar! /foo/bar
' foo/cab':
jar:file:…/b.jar! /foo/cab
索引本身如下:
JarIndex-Version: 1.0
a.jar
福奥
b.jar
福奥
getResources合同是否意味着返回与指定名称匹配的所有可用资源?
findsalltheresourceswiththegivenname。
normallyonepackagenameismappedtoonejarfile,butifaparticularpackagespansmorethanonejarfile,themappedvalueofthispackagewewile
有规范表明我观察到的确实是正确的(或至少是许可的)行为吗?
虽然有索引,但是有没有解决方案可以获取所有命名资源?
最好的答案似乎是错误的
我向甲骨文报告了那个。 那是现在在他们的错误数据库中
错误8150615。
我在OpenJDK源代码中进行了一些挖掘,在那里发现了这一行为的共鸣。