Java 7更新45破坏了我的Web Start SWT应用程序

时间:2013-10-16 15:10:52

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

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

我已添加到清单中:

  

权限:所有权限

     

代码库:*

     

Trusted-Library:true

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

3 个答案:

答案 0 :(得分: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启动器

在网络启动启动器中,您需要将属性名称更改为旧值(不含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);
        }
    }
}

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

通过添加以下行

编辑JNLP文件

<jar href="myAppLauncher.jar"/>

在标签内部并编辑你的application-desc标签,如下所示:

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

答案 1 :(得分:0)

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

现在,似乎Netbeans生成的.jnlp已足够,我不再需要任何单独的.jnlp用于库组件。我不确定eclipse是否会为您提供自动生成的.jnlp。

最后,更改launch.jnlp涉及到我必须为我的客户端提供一个新的安装程序,将新的.jnlp加载到他们的计算机上。它很糟糕但很有效。

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

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

答案 2 :(得分:0)

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

我们在客户内部网络上安装我们的应用程序,因此我们无法设置除*之外的代码库,而无需为每位客户重新设置整套jar。