繁体   English   中英

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

[英]java jre 7u45 breaks classloader.getResources()?

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

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

有没有其他人遇到这个? 建议解决方法? 提交错误?

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

谢谢,克里斯

将其添加到jar的清单中:

Trusted-Library: true

记录在这里

关于可信位置的警告 - 来自链接文档 -

Trusted-Library属性用于旨在允许不受信任的组件的应用程序和applet。 不显示警告对话框,应用程序或applet可以加载包含不受信任的类或资源的JAR文件

因此,如果您想允许不受信任的资源,请使用此方法(这是我阅读本文的方式)。

问题的根源是清单迭代包括与web-start本身相关的未签名资源(javaws.jar,deploy.jar)。

我通过使用-JARDesc [] jars = JNLPClassLoader.getLaunchDesc()解决了我的问题.getResources()。getEagerOrAllJarDescs(true);

我们开始遇到带有7u45的classloader.getResourceAsStream()的问题。 我们一直在签署JAR但没有嵌入JNLP-INF/{APPLICATION.JNLP,APPLICATION_TEMPLATE.JNLP} (因为我们需要两个未签名的application.jnlp变体,具有不同的堆设置)。

无论如何,我们通过嵌入JNLP-INF/APPLICATION_TEMPLATE.JNLP解决这个问题。 只是发布以防其他人有这个特殊问题。

我们在基于Netbeans RCP的应用程序中遇到此问题。 Netbeans加载每个Manifest-File来读取它自己的entrys。 这导致应用程序中包含的每个JAR都出现Security-Exception。 在我们看来,Java认为Manifest-File本身是一个不受信任的资源。 不知道这是故意还是错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM