我们在克服 Java webstart 的混合代码错误时遇到了困难。总之,我们有我们的主 JNLP 文件,我们已经签署了它直接加载的所有代码。我们已将所有权限选项添加到主 JNLP。它加载的主类也来自一个签名的 jar。
当主类开始一点点开始时,它会触发一些需要加载从 JNLP B 中提取的一些未签名资源的事情。JNLP B 的所有资源都没有签名,它们不需要任何特殊权限。
所有已签名的代码均已根据 Oracle 的混合代码文档进行设置,并且在签名之前已使用“Trusted-Library: true”清单设置 jar 文件。
当签名代码尝试加载未签名代码时,我们会收到一个找不到类的错误,如下所示:
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.sun.javaws.Launcher.executeApplication(Unknown Source)
at com.sun.javaws.Launcher.executeMainClass(Unknown Source)
at com.sun.javaws.Launcher.doLaunchApp(Unknown Source)
at com.sun.javaws.Launcher.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NoClassDefFoundError: org/some/external/package/that/is/not/signed
at org.our.signed.package.main(Main.java:87)
... 9 more
Caused by: java.lang.ClassNotFoundException: org.some.external.package.that.is.not.signed
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at com.sun.jnlp.JNLPClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 10 more
这是 JNLP 中的场景:
JNLP A:(总结)
<jnlp spec="1.5+" codebase="...." href="......">
<information>
...etc
</information>
<security>
<all-permissions/>
</security>
<resources>
<j2se version="1.6+" initial-heap-size="80m" max-heap-size="256m" href="http://java.sun.com/products/autodl/j2se"/>
<jar href="signedJar_1.jar" download="eager" main="true"/>
<jar href="signedJar_2.jar" download="eager" main="false"/>
<extension name="unsigned_ext" href="unsigned.jnlp"/>
</resources>
<application-desc main-class="(FROM SIGNED CLASS in signedJar_1.jar)"/>
</jnlp>
JNLP B(unsigned.jnlp 加载器)
<jnlp spec="1.5+" codebase="....." href="......">
<information>
...etc
</information>
<resources>
<jar href="unsigned.jar"/>
</resources>
<component-desc/>
</jnlp>
我们注意到安全异常工作正常,因为如果我们将未签名的 jar 移动到具有所有权限并已签名 jar 的 JNLP 中,我们会得到预期的安全异常,Java 不会让我们将签名代码与可信库:没有清单属性的真实且未签名的代码。
想法?类加载器是否有原因无法从未签名的代码中找到 java 文件?我们是否缺少一些特殊的东西来允许签名的代码运行未签名的代码?我只见过人们在获取未签名代码来运行签名代码时遇到问题的情况,我可以理解。