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) は上書きされたファイルから読み込まれるため、封印違反になるのではないでしょうか?