在 Java 7 Update 45 中,系统属性不再从 JNLP 标记“属性”设置

2022-09-01 18:54:34

我们从附加的 JNLP 运行应用程序。在 Java 控制台上,我们用 D 输出系统属性。我们的 JNLP 文件中的属性不再设置。这是我们遇到的第一个Java版本。一切都很好,包括7 Update 40。

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

<?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>    

答案 1

我们在 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 进行签名的说明


答案 2

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