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



我们从附加的JNLP运行应用程序。 在 Java 控制台上,我们使用 D 输出系统属性。不再设置 JNLP 文件中的属性。 这是我们遇到此类问题的第一个Java版本。一切正常,包括 7 更新 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>    

我们在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错误JDK-8023821,更改是有意的:

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

签署 JNLP 的说明。

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

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

我设置为:

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

附言。请注意,使用 tag 传递值是传递应用程序参数,而不是 JVM 参数。 你的应用程序应该在你的方法中捕获这个参数 main(字符串参数[])

刚刚花了 2 天时间尝试解决此问题,尝试对 jar 和其他文件进行签名......然后我找到了似乎非常简单且工作正常的解决方案:

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

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) 时遇到了这个问题......

最新更新