【问题标题】:Jnlp Java Web Start Error: java.lang.NoClassDefFoundError:Jnlp Java Web 启动错误:java.lang.NoClassDefFoundError:
【发布时间】: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


    【解决方案1】:

    最后我的清单看起来像这样

    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 对我的小程序无关紧要。 谁在乎它是否以root身份运行。我将它修改为用户“jar”并将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 中可以正常工作,没有错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多