0

アプリケーションを Eclipse プラグイン、具体的には次のコードとしてデプロイするときに javassist を使用すると問題が発生します。

ClassPool.getDefault().get(aClassName);

を投げています: javassist.NotFoundException

プラグインの一部として使用されていない場合、コードは正常に機能します。問題がプラグインのクラスパスの構成にあるのか (そうではないようです)、またはプラグイン プロジェクトを Eclipse アプリケーションとして実行するときに Eclipse が使用するクラスローダーに関連するものなのかを理解しようとしています。

問題を引き起こすコードは、カスタム Eclipse エディターの一部です。そのため、ユーザーがエディターに関連付けられたドキュメントを開こうとすると表示されます。javassist がロードしようとしているクラスは、プラグイン クラスの一部です。

手がかりを事前にありがとう!

4

1 に答える 1

2

ClassPoolのドキュメントから:

デフォルトのクラスプールを返します。このメソッドはシングルトンファクトリであるため、返されるオブジェクトは常に同一です。

デフォルトのクラスプールは、システム検索パスを検索します。これには通常、プラットフォームライブラリ、拡張ライブラリ、および-classpathオプションまたはCLASSPATH環境変数で指定された検索パスが含まれます。

ClassPoolによって返されるのClassPool.getDefault()は、システムクラスパスを追加するだけです。Eclipseプラグインはシステムクラスローダーによってロードされないため、プラグインのクラスを表示できません。

プラグインのクラスローダーをクラスプールに追加して、それらのクラスを表示できるようにする必要があります。これは、次の方法で実行できます。

ClassLoader pluginLoader = ...;
ClassPool pool = ClassPool.getDefault();
pool.appendClassPath(new LoaderClassPath(pluginLoader));

pluginLoaderプラグインのクラスローダーはどこにありますか。これを取得する最も簡単な方法は、おそらく

pluginLoader = <one of your plugin's classes>.class.getClassLoader();
于 2011-11-30T22:00:52.920 に答える