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

use*_*888 25 java jnlp properties system java-web-start

我们从附加的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>    
Run Code Online (Sandbox Code Playgroud)

Mic*_*old 32

我们遇到了与Java 7 Update 45(1.7.0_45)相同的问题.该JNLP规格给了一个变通的提示:

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

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

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

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

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

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

<property name="myconfig" value="DE" />
Run Code Online (Sandbox Code Playgroud)

<property name="jnlp.myconfig" value="DE" />
Run Code Online (Sandbox Code Playgroud)

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

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

签署JNLP的说明.

  • 奇怪的是,签署JNLP的说明不再作为Java 7技术指南的一部分提供,但你仍然可以在[Wayback Machine]上找到它们(https://web.archive.org/web/20131114031718/http:// docs.oracle.com/javase/7/docs/technotes/guides/jweb/signedJNLP.html)类似的内容也包含在Oracle [Java教程博客]中(https://blogs.oracle.com/thejavatutorials/entry)/signing_jar_files_with_a) (2认同)

小智 2

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

  • 显然,这不适用于动态 JNLP 文件(例如,向应用程序提供单点登录凭证凭证)。Michael Paesold 的解决方案是唯一完全有效的解决方案。要么此更改不是有意为之,要么 Oracle 没有完全意识到此更改将产生的影响。我遇到的主要问题是这一变化尚未宣布。我的公司现在有很多客户抱怨“我们的应用程序坏了”:( (6认同)