我有代码来迭代 classLoader.getResources("META-INF/MANIFEST.MF") 的结果以返回类路径上的 jar 列表。这从 1.6.0_18 一直到 1.7.0_40 都运行良好。现在 1.7.0_45 通过显示有关混合签名/未签名代码的安全警告弹出窗口打破了这一点。
小型自包含测试用例来演示问题:
package testcase;
import java.io.*;
import java.net.*;
import java.util.Enumeration;
import java.util.logging.*;
public class TestCase {
public static void main(String[] args) {
getAllJarUrls();
}
public static void getAllJarUrls() {
try {
final Enumeration<URL> mfUrls = Thread.currentThread().getContextClassLoader().getResources("META-INF/MANIFEST.MF");
while (mfUrls.hasMoreElements()) {
URL jarUrl = mfUrls.nextElement();
if (!jarUrl.getProtocol().equals("jar")) {
continue;
}
try {
System.out.println(jarUrl.toURI());
} catch (URISyntaxException ex) {
Logger.getLogger("testcase").log(Level.SEVERE, null, ex);
}
}
} catch (IOException e) {
Logger.getLogger("testcase").log(Level.SEVERE, null, e);
}
}
}
使用 jnlp(使用有效证书签名的 jar)启动它:
<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+" codebase="http://localhost/test" href="test.jnlp">
<information>
<title>test</title>
<vendor>test</vendor>
</information>
<security><all-permissions/></security>
<resources>
<jar href="testcase.jar" main="true" download="eager"/>
</resources>
<application-desc main-class="testcase.TestCase"/>
</jnlp>
运行时,让控制台可见,然后点击“5”以获得详细输出。然后单击安全提示上的“阻止”以查看异常。点击允许会让代码正常运行,但这不是可接受的用户体验。特别是因为我们的应用程序必须能够在没有用户输入的情况下启动。
1.7.0_45下的输出如下:
CacheEntry[http://localhost/test/testcase.jar]: updateAvailable=true,lastModified=Tue Oct 15 21:09:21 CDT 2013,length=6314
jar:file:/C:/jre32/1.7.0_45/lib/javaws.jar!/META-INF/MANIFEST.MF
jar:file:/C:/jre32/1.7.0_45/lib/deploy.jar!/META-INF/MANIFEST.MF
jar:file:/C:/jre32/1.7.0_45/lib/plugin.jar!/META-INF/MANIFEST.MF
jar:file:/C:/jre32/1.7.0_45/lib/deploy.jar!/META-INF/MANIFEST.MF
Trace level set to 5: all ... completed.Trace level set to 5: all ... completed.
security: resource name "META-INF/MANIFEST.MF" in http://localhost/test/testcase.jar : java.lang.SecurityException: trusted loader attempted to load sandboxed resource from http://localhost/test/testcase.jar
testcase.jar 已签名。它甚至包含所有新的清单属性:应用程序名称:测试用例权限:所有权限代码库:*
从 deploy.jar 从 7u40 到 7u45 的反编译 CPCallBackHandler 的差异显示出显着的变化。LiveConnect 的更改似乎破坏了现有功能。不,这里不涉及 LiveConnect。
有没有其他人遇到过这个?解决方法的建议?提交错误?
(注意:也发布在 OTN java 论坛上,但我希望在这里得到更快的答案:)。
谢谢,克里斯