【问题标题】:Java 7 update 45 broke my Web Start SWT applicationJava 7 更新 45 破坏了我的 Web Start SWT 应用程序
【发布时间】:2013-10-24 18:50:28
【问题描述】:

我维护一个使用 WebStart 启动的 Eclipse RCP 应用程序。 Java 7 u45 进行了一些安全更改,现在我的应用程序在启动时崩溃了。

我已添加到清单中:

权限:所有权限

代码库:*

可信库:true

这从控制面板中删除了所有警告消息。但是在尝试加载我的 IApplication 实现时,我仍然遇到类加载器问题,这可能是我要加载的第一个类。这是更新 45 的新内容。

【问题讨论】:

  • 您是否尝试使用“javaws application.jnlp”从命令行启动您的应用程序。我也面临更新 45 的类似问题,如果我从命令行运行我的应用程序,它可以正常启动,但不能从浏览器启动。是的,他们都使用相同的 java 版本。
  • 我有一个类似的问题:我使用的是相当旧版本的 Equinox 启动器。在签署 JNLP (docs.oracle.com/javase/7/docs/technotes/guides/jweb/…)、添加您的清单修改并退出我的 jar (也参见blogs.oracle.com/java-platform-group/entry/what_to_do_if_your) 后,WebStartMain 读取 JAR 并找到 osgi 框架,但在 invokeFramework 中找不到 EclipseStarter 类。我想这是错误的 installLocation 。如果您找到解决方案,请在此处报告。
  • 我已经在下面发布了解决方案。您的问题与此线程类似:stackoverflow.com/questions/17230773/….
  • 我也有类似的问题,我已经用stackoverflow.com/questions/19393826/… 提供的答案删除了安全警告,但我的应用程序在启动时仍然崩溃。在 Java WS 控制台中,我将跟踪级别设置为 5,就在我的应用程序崩溃之前,我得到了以下几行:network: Cache entry not found [url: localhost:80/C:/configuration/config.ini, version: null] network: Connecting localhost:80/C:/configuration/config.ini with proxy=DIRECT network : 使用 proxy=DIRECT 连接 socket://localhost:80
  • 您在 java 调试控制台上是否看到任何错误消息?你以前的 java 版本是什么?

标签: java swt eclipse-rcp java-web-start jnlp


【解决方案1】:

当 7u25 出现时,我的应用程序会因类加载器问题而崩溃(有时,这很奇怪)。修复涉及取消我的“Components.jnlp”部署策略。我将我的库文件放在一个单独的 .jnlp 中(Components.jnlp,根据我在 2010 年在线阅读的解决方案),我的主要 .jnlp(launch.jnlp)将加载该 .jnlp。

现在,Netbeans 生成的 .jnlp 似乎就足够了,我不再需要任何单独的 .jnlp 来存储库组件。我不确定eclipse是否给你一个自动生成的.jnlp。

最后,更改launch.jnlp 让我不得不为我的客户提供一个新的安装程序,以便将新的.jnlp 加载到他们的计算机上。它很糟糕,但它起作用了。

另外,我不确定Codebase: * 应该做什么。你为什么不把你的实际代码库放在那里?

如果您没有使用该方法部署您的应用程序,那么此答案可能无济于事。可能会对某人有所帮助。

【讨论】:

    【解决方案2】:

    到目前为止,我们已经拥有多个 JNLP 文件,而且它似乎有效。

    我们在客户内部网络上安装我们的应用程序,因此我们无法设置除 * 以外的代码库,除非为每个客户退出整个 jar 集。

    【讨论】:

    • 两件事:1)您的“答案”看起来应该是我的答案下方的评论。 2)哇,你为同一个程序部署了一个单独的.jar?无论如何,我的观点是:甲骨文违反了 JNLP 类加载器的合同。请参阅此线程:stackoverflow.com/questions/17230773/…。这是一个错误,Oracle 尚未修复它。我只是说我的方法是撤消我的多 jnlp 方法并使用 Netbeans 为我生成的自然 .jnlp。
    • 我对@9​​87654322@ 的引用确实是一个附带问题。我认为您不需要为您的解决方案触及与Codebase 相关的任何内容。我认为您只需要撤消Components.jnlp 策略即可避免ClassLoader 中的NPE。
    【解决方案3】:

    我遇到了同样的问题,并通过以下方式设法解决:

    在所有清单文件中(针对 RCP 项目中的每个 JAR)添加以下属性:

    Application-Name: My App Name
    Permissions: all-permissions
    Codebase: *
    Application-Library-Allowable-Codebase: *
    Caller-Allowable-Codebase: *
    Trusted-Library: true
    

    解决方案的第二部分是通过添加 jnlp 前缀使 jnlp 属性安全。我找到了解决方案here。您需要为框架属性执行此操作(osgi、eclipse..)和您的属性例如而不是:

    <property name="eclipse.product" value="com.amdosoft.oct.ui.product"/>
    <property name="osgi.instance.area" value="@user.home/Application Data/myApp"/>
    <property name="osgi.configuration.area" value="@user.home/Application Data/myApp"/>
    <property name="my.App.property" value="someValue"/>
    

    使用

    <property name="jnlp.eclipse.product" value="com.amdosoft.oct.ui.product"/>
    <property name="jnlp.osgi.instance.area" value="@user.home/Application Data/myApp"/>
    <property name="jnlp.osgi.configuration.area" value="@user.home/Application Data/myApp"/>
    <property name="jnlp.my.App.property" value="someValue"/>
    

    here下载源代码的eclipse启动器

    在 web start 启动器中,您需要将属性名称改回旧值(不带 jnlp 前缀)。您可以通过将这部分源代码添加到 WebStartLauncher 类的 main 方法中来做到这一点。

    Properties properties = System.getProperties();
    // copy properties to avoid ConcurrentModificationException
    Properties copiedProperties = new Properties();
    copiedProperties.putAll(properties);
    Set<Object> keys = copiedProperties.keySet();
    for (Object key : keys) {
        if (key instanceof String) {
            String keyString = (String) key;
            if (keyString.startsWith("jnlp.")) {
                // re set all properties starting with the jnlp-prefix 
                // and set them without the prefix
                String property = System.getProperty(keyString);
                String replacedKeyString = keyString.replaceFirst("jnlp.", "");
    
                System.setProperty(replacedKeyString, property);
            }
        }
    }
    

    将您的新启动器导出为可运行的 JAR,并将其放在 JNLP 文件所在的同一目录中。

    编辑 JNLP 文件,添加以下行:

    <jar href="myAppLauncher.jar"/>
    

    inside 标签并像这样编辑您的 application-desc 标签:

    <application-desc main-class="org.eclipse.equinox.launcher.WebStartMain">
      </application-desc>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-09
      • 1970-01-01
      • 2018-03-31
      • 2019-08-04
      • 1970-01-01
      • 2014-12-13
      • 2013-01-03
      • 1970-01-01
      相关资源
      最近更新 更多