java.lang.SecurityException:类“XYZ”的签名者信息与同一包中其他类的签名者信息不匹配

我有一个applet,它在浏览器中运行,并从Javascript调用.有两个类:PortalLauncher和ParamSplitter,它们都在默认包中. Javascript调用PortalLauncher中的一个方法,后者又调用ParamSplitter中的一个函数.小程序在一个签名的jar中.

这大部分时间都有效.但是,一些用户不时会遇到问题.在当天的某个时间(即不在第一次访问时),抛出以下异常:

java.lang.SecurityException: class "ParamSplitter"'s signer information does not
    match signer information of other classes in the same package
    at java.lang.ClassLoader.checkCerts(Unknown Source)
    at java.lang.ClassLoader.preDefineClass(Unknown Source)
    at java.lang.ClassLoader.defineClass(Unknown Source)
    at java.security.SecureClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.access$000(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at sun.applet.AppletClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.applet.AppletClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClassInternal(Unknown Source)
    at PortalLauncher.openFile(PortalLauncher.java:313)
    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 sun.plugin.javascript.JSInvoke.invoke(Unknown Source)
    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 sun.plugin.javascript.JSClassLoader.invoke(Unknown Source)
    at sun.plugin.com.MethodDispatcher.invoke(Unknown Source)
    at sun.plugin.com.DispatchImpl.invokeImpl(Unknown Source)
    at sun.plugin.com.DispatchImpl$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.plugin.com.DispatchImpl.invoke(Unknown Source)
java.lang.Exception: java.lang.SecurityException: class "ParamSplitter"'s signer
    information does not match signer information of other classes in the same package
    at sun.plugin.com.DispatchImpl.invokeImpl(Unknown Source)
    at sun.plugin.com.DispatchImpl$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.plugin.com.DispatchImpl.invoke(Unknown Source)

任何人都可以对这个异常意味着什么以及可能导致它的原因有所了解吗?大约有800个用户拥有这个小程序,但只有少数人受到影响,甚至那些只有occaisionally的问题.

解决方法:

这意味着在同一个JVM中,还有其他类从其他jar加载,这些类的签名方式不同(或者可能没有签名),也在默认包中.

如果我正确地解释你的问题你的applet本身只有一个jar,所以它必须是来自其他地方的jar;只有一些用户拥有.
我首先想到的可能是在另一个标签中运行的applet的jar(可以使用相同的jvm实例).但是其他小程序应该使用单独的类加载器,所以它们不应该像那样发生碰撞.
更有可能的是,他们在jvm的boot类路径中有一个jar,它在root包中也有一个类.

无论哪种方式,解决方案/解决方法都不是使用默认包,而是使用您自己的包.这样你就可以避免与其他jar碰撞.

上一篇:自Java 7更新25以来,Applet.getCodeBase()为本地Applet返回null


下一篇:创建Java Applet的指南,无需提示即可打印