java jre 7u45 中断 classloader.getResources()?

标签 java java-web-start

我有代码迭代 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”以获得详细输出。然后单击安全提示上的“阻止”以查看异常(exception)情况。单击允许将使代码正常运行,但这不是可接受的用户体验。特别是因为我们的应用程序必须能够在没有用户输入的情况下启动。

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 已签名。它甚至包含所有新的 list 属性: 应用程序名称:testcase 权限:所有权限 代码库:*

从 7u40 到 7u45 的 deploy.jar 的反编译 CPCallBackHandler 的差异显示了显着的变化。看起来 LiveConnect 的更改已经使现有功能变得乏味。不,这里不涉及 LiveConnect。

还有其他人遇到过这个吗?解决方法的建议?提交错误?

(注意:也发布在 OTN java 论坛上,但我希望在这里能得到更快的答复:)。

谢谢, 克里斯

最佳答案

将此添加到 jar 的 list 中:

Trusted-Library: true

已记录 here .

关于java jre 7u45 中断 classloader.getResources()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19394570/

相关文章:

java - 使用客户信息生成唯一 ID

java - 当 flatMap 返回空 Mono 时如何调用 switchIfEmpty?

java - 如何滚动直到对象在弹出窗口中可见?

java - itext 字体 UnsupportedCharsetException

java - 可以在浏览器中启动 JWS 小程序而不是独立启动吗?

java - setenv.sh 不工作

java - 部署具有下降逆向工程保护的跨平台Java桌面应用程序?

Java SOAPConnection 调用 Https ASMX 服务

java - 我该怎么做才能使 jar /类更小?

java - Tomcat 正在提供内容类型为 "text/html"而不是 JNLP 内容类型的 JNLP 文件