0

我们遇到了一个长期运行的 Java 进程突然吐出 java.lang.SecurityException: seal violation: 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)是从被覆盖的文件加载的,所以不应该违反密封吗?

4

1 回答 1

0

请尝试以下方法:

  • 从 seal-1.0.jar 中删除 A3.java,但将其保留在 seal-2.0.jar 中;
  • 在类路径中有两个密封的罐子并运行测试程序。

那应该会给您所需的“SecurityException:密封违规”。

于 2012-07-05T16:24:35.103 回答