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

时间:2013-10-16 10:14:07

标签: java properties system java-web-start jnlp

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

我们已经签署了所有的罐子,但它们的清单中没有安全属性。

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

5 个答案:

答案 0 :(得分:32)

我们遇到了与Java 7 Update 45(1.7.0_45)相同的问题。 JNLP Spec给出了一个解决方法的提示:

  

在启动VM之后但在调用应用程序之前,jnlp文件中设置的属性通常由Java Web Start设置。某些属性被视为“安全”属性,可以在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的预期行为......   (来自评论)

Instructions for signing a JNLP

答案 1 :(得分:4)

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

我设为:

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

聚苯乙烯。请注意,使用标记传递值是传递应用程序参数而不是JVM参数。您的应用程序应在方法main(String args [])

中捕获此参数

答案 4 :(得分:0)

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

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