25

我们从附加的 JNLP 运行应用程序。在 Java 控制台上,我们使用 D 输出了系统属性。我们的 JNLP 文件中的属性不再设置。这是我们遇到此类问题的第一个 Java 版本。在 7 Update 40 之前一切正常。

我们已经对所有 jars 进行了签名,但它们的清单中没有安全属性。

<?xml version="1.0" encoding="UTF-8"?>

<jnlp spec="1.0+" codebase="http://10.0.10.230/webstart/app" href="desktop.jnlp">
<information>
<title>MyApp Desktop</title>
<vendor>MyApp GmbH</vendor>
<homepage href="http://www.myres-edv.de"/>
<description>MyApp Desktop</description>
<offline-allowed/>
</information>
<security>
<all-permissions/>
</security>
<resources>
<j2se version="1.5+" initial-heap-size="512M" max-heap-size="1024M" javaws-vm-args="-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8200"/> 
 <property name="org.omg.CORBA.ORBInitialHost" value="10.0.10.230"/>             
 <property name="org.omg.CORBA.ORBServerHost" value="10.0.10.230" />
 <property name="sun.net.spi.nameservice.provider.1" value="dns,sun" />
 <property name="MyApp.baktswritedos" value="true"/>
 <property name="MyApp.nocomm" value="true"/>
 <property name="MyApp.la.erfassungdos" value="true"/>
 <property name="com.sun.corba.ee.transport.ORBTCPConnectTimeouts" value="500:30000:40:30000" />
 <property name="deployment.trace.level" value="all" /> 
 <jar href="myresjar/ejb/myres/myres_ejb_client.jar" main="true" download="eager"/>
 <jar href="myresjar/ejb/myres/myres_ejb.jar" download="eager"/>
 <extension name="jars" href="commonejbjars.jnlp"/>
 <extension name="jars" href="jr.jnlp"/>
 <extension name="jars" href="commonjars.jnlp"/>
 <extension name="jars" href="commonjh.jnlp"/>
 <nativelib href="myresjar/ejb/myres/myres_dll.jar"/>
</resources>
<resources os="Windows">
    <nativelib href="myresjar/myres/native-dlls.jar" download="eager"/>
</resources>
<application-desc main-class="de.myapp.gui.desktop.mainframe.DesktopMainFrame">
   <argument>-serverIP=10.0.0.230</argument> 
   <argument>-initNewDayAction=true</argument> 
</application-desc>
</jnlp>    
4

5 回答 5

32

我们在 Java 7 Update 45 (1.7.0_45) 中遇到了同样的问题。JNLP 规范给出了解决方法的提示:

jnlp 文件中设置的属性通常由 Java Web Start 在 VM 启动之后但在调用应用程序之前设置。一些属性被认为是“安全”属性,可以在 java 调用命令行上作为 -Dkey=value 参数传递。

以下属性,以及以“javaws”开头的属性。或“jnlp.”,被认为是“安全的”,并将以这种方式传递给 VM:...

虽然“不安全”属性停止工作,但我们意识到“安全”属性仍然可以正确设置。也许在 VM 启动之后但在调用应用程序之前设置属性的机制被这个 Java 更新破坏了,或者这可能是一个有意但未记录的更改。

解决方法现在取决于系统属性的类型:

对于影响 Java 行为或库的系统属性,我们将代码更改为在应用程序启动时调用System.setProperty(),而不是在 JNLP 中设置它们。

对于我们用于从 JNLP 文件配置应用程序的属性,我们添加了jnlp. 前缀,以便它们再次正确传递。

<property name="myconfig" value="DE" />

<property name="jnlp.myconfig" value="DE" />

编辑:根据OpenJDK Bug JDK-8023821,更改是故意的:

从 7u45 开始,启动描述符(JNLP 文件)需要签名才能设置不安全的系统属性。所以这是 7u45 中的预期行为......(来自评论)

签署 JNLP 的说明

于 2013-10-16T14:05:41.440 回答
4

我们对同样的问题有点糟糕。我们最终选择在签名的 jar 中包含 JNLP 文件,但这给我们带来了一些棘手的构建问题,因为我们之前构建了一组 JARS 并使用多个 JNLP 文件来支持不同的环境(QA、生产、演示等),通过系统属性将环境详细信息传递给应用程序。我们确实尝试使用此处讨论的 JNLP 模板文件,http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/signedJNLP.html,但我们不断收到与验证 JNLP 文件相关的错误,并且由于时间限制而放弃了。可能我们只是做错了什么,但错误消息并没有明确说明 JNLP 文件的哪一部分与模板不匹配。此外,上面的链接中有一条有点无用的注释,上面写着:“可能危及安全的元素或属性将被此功能锁定。” 我找不到此类元素或属性的记录示例。

于 2013-10-21T15:51:08.613 回答
2

有同样的问题并通过签署 jnlp 文件解决了它。您的主 jar 应包含重命名为 APPLICATION.JNLP 并放置在 JNLP-INF 文件夹下的 jnlp 文件的副本。(文件夹和 jnlp 文件的名称必须大写)

于 2013-10-16T11:03:59.330 回答
2

我设置为:

<jnlp>
...
    <application-desc main-class="Main">
        <argument>param1=value1</argument>
    </application-desc>
</jnlp>

附言。请注意,使用标签传递值是传递应用程序参数而不是 JVM 参数。您的应用程序应该在您的方法 main(String args[]) 中捕获此参数

于 2013-10-17T14:10:25.403 回答
0

刚刚花了 2 天时间试图解决这个问题,尝试签署 jars 和其他文件......然后我发现解决方案似乎非常简单并且工作正常:

我*在我的 JRE-home-director*y (jre7/lib) 中放置了一个包含以下内容的 jndi.properties 文件:

java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=jnp://localhost:1099

从 Java 1.6 更新到 Java 1.7(51) 时我遇到了这个问题...

于 2014-03-18T08:59:56.377 回答