我们的java应用程序是通过java web start(使用glassfish 4.0)启动的。更新到java 7u45后,它不再起作用。以下是错误消息:
java.lang.NullPointerException
at java.io.StringReader.<init>(Unknown Source)
at org.glassfish.appclient.client.JWSAppClientContainerMain.insertMaskingLoader(JWSAppClientContainerMain.java:186)
at org.glassfish.appclient.client.JWSAppClientContainerMain.main(JWSAppClientContainerMain.java:132)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.sun.javaws.Launcher.executeApplication(Unknown Source)
at com.sun.javaws.Launcher.executeMainClass(Unknown Source)
at com.sun.javaws.Launcher.doLaunchApp(Unknown Source)
at com.sun.javaws.Launcher.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
这在下载完成后立即发生。快速查看GF源文件后,似乎没有定义属性loader.config
,因为第二行抛出了NPE:
final String loaderConfig = System.getProperty("loader.config");
StringReader sr = new StringReader(loaderConfig);
修改
发生NPE的上述两个代码行是Glassfish代码,来自jar JWSAppClientContainerMain
中的类gf-client-module.jar
。它一直工作到java更新45。
答案 0 :(得分:1)
从Update 45开始,JavaWebstart将不再将不安全的属性传递给您的应用程序。所有未加jnlp
或javaws
前缀的属性都被视为不安全。
您需要将loader.config
更改为jnlp.loader.config
(在JNLP中以及您的Java代码中),或者您需要签署JNLP(将JNLP的精确副本放入
罐子里面有JNLP-INF/APPLICATION.JNLP
并在罐子上签名。
根据this OpenJDK Bugreport,这是解决安全问题的有意改变 漏洞
答案 1 :(得分:0)
系统属性中没有关键字“loader.config”的属性。这就是为什么它会将空值返回给loaderConfig
。当您将null
值传递给StringReader
构造函数时,它将抛出NPE,因为在输入Constructor参数( null 值)上调用了length方法。请看下面的
public StringReader(String s) {
this.str = s;
this.length = s.length();
}
希望这有帮助
答案 2 :(得分:0)
我们搜索了很多关于这个问题的内容,幸运的是我们找到了一个适合我们的解决方案。
在我们的jnlp文件中:
<resources>
<j2se version="1.5+"/>
...
</resources>
我们在这种模式下改变了它:
<resources>
<j2se version="1.6+" java-vm-args="-Djava.net.preferIPv4Stack=true"/>
...
</resources>
我们在这里找到了这个解决方案:
https://community.oracle.com/thread/2520987
希望这可以帮助你。
答案 3 :(得分:0)
此问题已在glassfish 4.1中解决,直到您将Java降级为u21或更早版本。