我正在开发一个目标项目,目标是从java6升级到java8,但是当我将所有jar部署到服务器时,如果客户端机器在java6中运行,它可以正常工作。但对于java8,它无法由jnlp启动,这是由
引起的#### Java Web Start Error:
#### java.lang.NoClassDefFoundError:org/springframework/context/ApplicationContext
从谷歌搜索后,我确实学习了一些关于如何使用清单文件的规则。
我尝试用
签署我的所有罐子jarsigner -keystore myKeys -storepass changeit XXXX.jar
并将myKeys导出为cerf文件然后导入到客户端计算机,然后即使不询问安全问题也可以在JRE6中成功启动。
但对于Java8,它无法启动类未找到甚至cerf导入,我发现它可能我想念我的jar的一些安全属性 然后我通过添加字段来关注这篇文章 http://www.captaincasademo.com/forum/posts/list/1988.page
attribute name="Permissions" value="all-permissions
attribute name="Codebase" value="*"
attribute name="Application-Library-Allowable-Codebase"value="*"
attribute name="Caller-Allowable-Codebase" value="*"
attribute name="Trusted-Only" value="true"
attribute name="Trusted-Library" value="true"
我的项目实际上看起来像这个结构
/lib/spring.jar
/lib/commons.jar
/lib/xxxCommon.jar
client.jnlp(herf to xxxClient.jar)
xxxClient.jar
我差不多测试那个清单文件中的所有模式,比如 带有trusted-library的xxxClient.jar /lib/spring.jar与trusted-library为true 要么 具有所有权限的xxxClient.jar /lib/spring.jar与trusted-library为true 要么 甚至我删除所有安全属性。 它确实因未找到的课程而失败。
我知道原因(来自其他帖子),因为受信任的库和不受信任的库是由不同的类加载器加载的,所以如果spring.jar是不受信任的,它将被默默忽略。
即使我用/不用trusted-library标记xxxClient.jar(我的项目jar) 或者spring.jar可信/不可信库,那些都没有找到相同的语句类。
由于我正在从事维护工作,我不能像class.forName(),Class.getResource()那样进行更改 http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/manifest.html
是否可以在没有代码更改的情况下成功从JRE6升级到JRE8?非常感谢
顺便说一句,我的jar清单属性是由ant添加的,就像上面的代码和第三方jar(spring.jar)我应用jar -ucf来更新内部清单文件。
非常感谢!!!
答案 0 :(得分:0)
最终我的清单看起来像这样
Application-Name: xxxxx-Client
Permissions: all-permissions
Codebase: *
Trusted-Only: true
但实际上我不确定它是否有效,因为主要的变化是我的jnlp文件。 我原来的jnlp文件看起来像这样
<security>
<all-permissions/>
</security>
<resources>
<j2se version="1.6+" />
<jar href="XXXX-Client.jar"/>
<nativelib href="lib/commons-io-1.4.jar"/>
<nativelib href="lib/commons-logging.jar"/>
<nativelib href="lib/commons-net-1.4.1.jar"/>
<nativelib href="lib/spring.jar"/>
......
从官方文档中,我认为nativelib或jar对我的applet很重要。 谁在乎它是否在根本运行。我把它修改为用户&#34; jar&#34;并将spring.jar推向更高的水平
<security>
<all-permissions/>
</security>
<resources>
<j2se version="1.6+" />
<jar href="XXXX-Client.jar"/>
<jar href="lib/spring.jar"/>
<jar href="lib/commons-io-1.4.jar"/>
<jar href="lib/commons-logging.jar"/>
<jar href="lib/commons-net-1.4.1.jar"/>
.....
然后什么都不会出错!!!!我无法确定它固定的原因,或哪个部分最重要。因为原始的jnlp在JRE6中正常工作而没有错误。