プログラマメモ2 - programmer no memo2

署名済みのJarを使ったJava Web Start上でJavassistを使うとき 2008/03/11
2008/03/11

普通にEclipse上で開発していて、Javassistでバイトコードをさわって、toClassして問題なかったのにそれをJavaWebStart化するとエラーになりました。

javassist.CannotCompileException: by java.lang.SecurityException: class "クラス名"'s signer information does not match signer information of other classes in the same package


で、うーんと悩んだわけです。

すると、下記のようなものをみつけました。


webstartで、使えるようなので、調べた結果。

toClassするときに、クラスローダーと、ProtectionDomainを渡せばいいようです。

myCtClass.toClass(クラス.class.getClassLoader(), クラス.class.getProtectionDomain());


あと、webstartだと、すぐにクラスがみつかりません。
poolにクラスへのパスを渡してあげます。そのときに、LoaderClassPathを使うとうまくいきました。

pool.appendClassPath(new javassist.LoaderClassPath(クラス.class.getClassLoader()));


ちなみに、webstart上でのリソースをみつける方法に注意!!

Java Web Start でアプリケーションリソースを見つけるには、アプリケーションをロードしたクラスローダを使用します。たとえば、アプリケーションのメインスレッド内で次のメソッドを呼び出します。

this.getClass().getClassLoader();

次のメソッドも使用できます。

Thread.getCurrent().getContextClassLoader();
Java Web Start - よくある質問 (FAQ)


参考

: