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

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

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

   MyApp Desktop MyApp GmbH  MyApp Desktop                            -serverIP=10.0.0.230 -initNewDayAction=true   

我们遇到了与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。 前缀,以便它们再次正确传递。

  

  

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

从7u45开始描述符(JNLP文件)开始需要签名才能设置不安全的系统属性。 因此预计7u45的行为……(来自评论)

签署JNLP的说明 。

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

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

我设为:

  ...  param1=value1   

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

只花了2天试图解决这个问题,试图签署jar子和其他文件……然后我发现解决方案似乎很简单,工作正常:

我在我的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)时遇到此问题…