如何创建示例java.lang.SecurityException:密封违规:package ..是密封的

时间:2012-07-03 16:15:39

标签: java securityexception sealed

我们遇到一个问题,一个长时间运行的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)是从覆盖文件加载的?

1 个答案:

答案 0 :(得分:0)

请尝试以下方法:

  • 从seal-1.0.jar中移除A3.java,但保留在seal-2.0.jar中;
  • 在类路径中都有密封的jar并运行测试程序。

这应该给你所需的“SecurityException:seal violation”。