0

JVM の実行中に密封された jar を上書きした後、長時間実行されている Java プロセスが突然 java.lang.SecurityException: seal violation: package .. is seal を吐き出すという問題があります。

私はこの例外をある程度理解していますが、これ (およびそれに続くもの) を再現するために、封印された例外を人為的に作成しようとしていますが、機能していません。

次のような META-INF/MANIFEST.MF ファイルを含む「seal.jar」という名前の jar ファイルがあります。

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());
  }
}

同じ 3 つのクラスを持つ 2 番目の jar seal-2.0.jar がありますが、「バージョン 2.0」と出力されます。3 番目の 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 から読み込まれ、2 番目のクラス (A2) は上書きされたファイルから読み込まれるため、封印違反になるのではないでしょうか?

4

1 に答える 1

0

次のことを試してください。

  • seal-1.0.jar から A3.java を削除しますが、seal-2.0.jar には保持します。
  • クラスパスに両方の jar を封印し、テスト プログラムを実行します。

これにより、目的の「SecurityException: 封印違反」が発生するはずです。

于 2012-07-05T16:24:35.103 に答える