署名済みのJarを使ったJava Web Start上でJavassistを使うとき
2008/03/11
2008/03/11
javassist
webstart
普通に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)
参考
: