Jnlp Java Web Start错误:java.lang.NoClassDefFoundError:

时间:2015-06-05 13:40:37

标签: java ant jar manifest jnlp

我正在开发一个目标项目,目标是从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来更新内部清单文件。

非常感谢!!!

1 个答案:

答案 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中正常工作而没有错误。