【发布时间】:2015-08-20 11:50:42
【问题描述】:
我正在开发一个从 java6 升级到 java8 的现有项目,但是当我将所有 jar 部署到服务器时,如果客户端机器在 java6 中运行,它就可以正常工作。但是对于java8,它无法由jnlp启动,这是由
引起的#### Java Web Start Error:
#### java.lang.NoClassDefFoundError:org/springframework/context/ApplicationContext
通过google搜索,我确实了解了manifest文件的一些使用规则。
我尝试用
为我所有的 jar 签名jarsigner -keystore myKeys -storepass changeit XXXX.jar
并将 myKeys 导出为 cerf 文件,然后导入到客户端机器,即使不询问安全问题,它也可以在 JRE6 中成功启动。
但是对于Java8,即使导入了cerf,它也无法使用class Not found,而且我发现它可能错过了我的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
我几乎测试了该清单文件中的所有模式,例如 xxxClient.jar 与可信库 true /lib/spring.jar 与可信库 true 要么 具有所有权限的 xxxClient.jar /lib/spring.jar 与可信库 true 要么 即使我删除了所有安全属性。 它确实因找不到类而失败。
我知道原因(来自其他帖子)因为受信任的库和不受信任的库是由不同的类加载器加载的,所以如果 spring.jar 是不受信任的,它将被忽略。
即使我将 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 来更新内部清单文件。
非常感谢!!!
【问题讨论】:
标签: java ant jar manifest jnlp