我们遇到一个问题,一个长时间运行的Java进程突然吐出java.lang.SecurityException:密封违规:package ..被密封 在JVM运行时覆盖密封的jar。
我有点理解这个异常,但是为了重现这个(以及后面的内容),我试图人为地创建一个密封异常并且它不起作用。
有一个名为'seal.jar'的jar文件,其中包含META-INF / MANIFEST.MF文件:
Manifest-Version: 1.0
Sealed: true
这个包包含类A1,A2,A3,如下所示:
package sealed;
public class A1
{
public A1()
{
System.err.println("Created version 1.0 of " + this.getClass());
}
}
还有第二个jar seal-2.0.jar,它有相同的三个类但打印“2.0版” 现在第三个jar文件(run.jar)具有以下内容:
import sealed.A1;
import sealed.A2;
import sealed.A3;
public class SealingTest
{
public static void main(String[] args) {
int cnt=0;
try {
while(true) {
if( cnt%3==0 ) {
new A1();
}
else if( cnt%3==1 ) {
new A2();
}
else if( cnt%3==2 ) {
new A3();
}
Thread.sleep(5000);
cnt++;
}
}
catch (Throwable t) {
t.printStackTrace();
}
}
}
我认为当我执行以下操作时,此代码会创建一个密封的异常:
C:\CodeStreet\FTP>java -cp run.jar;seal-1.0.jar SealingTest
Created 1.0 of class sealed.A1 # now executing: copy seal-2.0.jar seal-1.0.jar
Created 2.0 of class sealed.A2
Created 2.0 of class sealed.A3
Created 1.0 of class sealed.A1
所以看起来A1是从seal-1.0.jar加载的,但A2是从覆盖的seal-1.0.jar加载的。
不应该存在密封违规,因为第一类(A1)是从seal-1.0.jar加载而第二类(A2)是从覆盖文件加载的?
答案 0 :(得分:0)
请尝试以下方法:
这应该给你所需的“SecurityException:seal violation”。