13

由于 Oracle 推出了 java 7 update 25,我们的应用程序不再运行。

最初,我们收到了一些关于 Manifest 文件中缺少代码库和安全标签的警告,我们已修复。

我们现在最终遇到的问题是,在控制台中我们只得到以下几行:

#### Java Web Start Error:
#### null

我们还会收到一个带有消息的应用程序错误对话框:无法启动应用程序

详细信息按钮在异常中提供以下详细信息:

java.lang.NullPointerException
    at com.sun.jnlp.JNLPClassLoader.getPermissions(Unknown Source)
    at java.security.SecureClassLoader.getProtectionDomain(SecureClassLoader.java:206)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at com.sun.jnlp.JNLPClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at desktop.DesktopProxySelector.<init>(DesktopProxySelector.java:24)     <- code smippet below
    at desktop.Main.main(Main.java:139)                                      <- code smippet below
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    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(Thread.java:724)

相关的代码部分是:

Desktop.Main.main

/**
 * Main method, starts the application
 */
public static void main(String[] args) {
    System.setProperty("java.net.useSystemProxies", "true");

    //Logger.getLogger("httpclient.wire.header.level").setLevel(Level.FINEST);
    //Logger.getLogger("org.apache.commons.httpclient.level").setLevel(Level.FINEST);
    java.net.ProxySelector.setDefault(new DesktopProxySelector(java.net.ProxySelector.getDefault()));

(最后一行是第 139 行)

desktop.DesktopProxySelector:

public class DesktopProxySelector extends ProxySelector {

    public  DesktopProxySelector(ProxySelector defaultSelector) {
    URI httpsUri = new CentralConfigurationService().getCentralLocation();

(最后一行是发生异常的第 24 行)

有人可以给我们一些线索提示(或更好的解决方案),以解决由这个“小”更新引起的这种 java 新行为。

当我们使用 java -jar Desktop.jar 直接从 cli 运行应用程序时,应用程序将运行文件,因此问题显然与 java web start 中的更改有关。

@trashgod:该错误显然与 7u25 中的权限更改有关,因为 NullPointerException 发生在 com.sun.jnlp.JNLPClassLoader.getPermissions 中。

只是为了解释我认为会发生什么(我是 Wouter 的同事):desktop.Main 实例化一个 desktop.DesktopProxySelector(我们的类),desktop.DesktopProxySelector 实例化 desktop.configuration.CentralConfigurationService desktop.configuration.CentralConfigurationService 实例化一个 java.net.URI .

在 DesktopProxySelector init 的第一行中,CentralConfigurationService 被实例化,由 JNLPClassLoader 调用的 getPermissions 方法引发 NullPointerException。因此,在通过 java webstart 加载 CentralConfigurationService 类并获取该类的权限时出现了问题。这是否与 URI 类已实例化这一事实有关,这需要额外的权限(已设置到远程 uri 的连接)?

4

1 回答 1

6

最终问题解决了。该问题是由于主 MANIFEST.MF 文件中包含的 jar 文件与 launch.jnlp 中提到的 jar 文件不匹配造成的。

显然,现在需要将所有将使用的 jar 文件也存在于 launch.jnlp 文件中。

(过去决定将此文件手动保存在接收器中,显然并不总是以适当的方式维护。现在这个过程是自动化的,所以问题应该不再发生在我们身上。)

于 2013-06-24T20:47:32.133 回答