あなたの解決策の鍵は、私が別の投稿で読んだのは、です。各Eclipse Pluginは、独自のクラスローダーを維持しています。
私はEclipse(3.7)プラグインが動的ロードのために何をしているのかを知ることができます。あなたのニーズに「フィット」できるかどうかはわかりません。基本的に、私のプラグインは暗号化/復号化を行います。新しい拡張として、ユーザーはFileDialog経由で1つ以上のJarファイルをロードできます。ここで、各jarファイルはURLClassLoaderを使用してロードされます。
this.FQCNLoader = new URLClassLoader (getFQCNUrls(), this.getClass().getClassLoader());
キーが2番目の引数として、Eclipseのプラグインのクラスローダに渡すことだった...これはあなたの「カスタム」クラスローダは、EclipseプラグインのCLASSPATHを有することを意味:私は次の行で私の「カスタム」クラスローダの作成しますあなたが追加しているURLを加えます(getter getFQCNUrls()はURL []を返します)。
もう一つの重要なポイントは、私がEclipseプラグインの一生を通して知っているビュー内の「カスタム」クラスローダーを維持していたことです。ビューは動的* .jarクラスを参照する必要があるすべてのコードの上にあります。
だから、同じ行に何かをする必要があります。あなたの "カスタム"クラスローダは、pluginAとpluginBの両方より上のクラスに存在する必要があります。
1.) Let pluginB load dynamic *.jar/classes. Convert into URL[].
2.) Create "custom" loader, pass in pluginB URL[] PLUS pluginA classloader.
ここに私の中addURL()メソッドは次のとおりです。また、私はそれぞれのプラグインは、それが自分のクラスローダのしているので、あなたが実際には次のような何かを「カスタム」クラスローダを構築するために必要になるだろうと思うだろう"カスタム"クラスローダーを構築するビュークラス...私は急いでそれを書いて、ユーザーが*をロードするたびに "カスタム"クラスローダーを再構築するので、少し醜いです。瓶が、それはEclipseでとOSGiせずに作業を行います。
private int URLCount = 0;
private URL[] FQCNUrls = new URL[10];
private ClassLoader FQCNLoader = new URLClassLoader (this.FQCNUrls);
...Lots of code...
public void addURL (URL theURL) throws IOException {
//CPTest lclsTest = new CPTest();
if (getURLCount() == 0) {
getFQCNUrls()[getURLCount()] = theURL;
setURLCount (1);
}
else {
boolean lisThere = false;
for (int i = 0; i < getURLCount(); i++) {
if (getFQCNUrls()[i].toString().equalsIgnoreCase(theURL.toString())) {
lisThere = true;
}
}
if (lisThere) {
System.out.println ("File URL [" + theURL.toString() + "] already on the CLASSPATH!");
}
else {
getFQCNUrls()[getURLCount()] = theURL;
setURLCount (getURLCount()+1);
}
}
// CLEAR : Null out the classloader...
this.FQCNLoader = null;
// BUILD/RE-BUILD : the classloader...
this.FQCNLoader = new URLClassLoader (getFQCNUrls(), this.getClass().getClassLoader());
//try {
// System.out.println ("---------------------------------------------------------------------------");
// System.out.println ("Current Working Directory.............[" + System.getProperty ("user.dir") + "]");
// System.out.println ("---------------------------------------------------------------------------");
// System.out.println ("this.classes []! ");
// lclsTest.dumpClasses (this.getClass().getClassLoader());
// System.out.println ("---------------------------------------------------------------------------");
//
// System.out.println ("---------------------------------------------------------------------------");
// System.out.println ("File URL [" + theURL.toString() + "] added! ");
// lclsTest.dumpClasses (this.FQCNLoader);
// System.out.println ("---------------------------------------------------------------------------");
// System.out.println ("---------------------------------------------------------------------------");
// System.out.println ("ClassLoader.getSystemClassLoader() ");
// lclsTest.dumpClasses (ClassLoader.getSystemClassLoader());
// System.out.println ("---------------------------------------------------------------------------");
// Class cls = this.FQCNLoader.loadClass ("com.lmig.RRFECF.pso.security.nonproduction.CM_RRFECF_development_securitykey");
// Class cls = Class.forName(theFQCN, false, theClsLoader);
// theObjectKey = (Object) theClsLoader.loadClass(theFQCN);
//}
//catch (Exception e) {
//// TODO Auto-generated catch block
// e.printStackTrace();
//}
Class sysclass = URLClassLoader.class;
try {
Method method = sysclass.getDeclaredMethod("addURL", parameters);
method.setAccessible(true);
method.invoke(getFQCNLoader(), new Object[] {
theURL
});
}
catch (Throwable t) {
t.printStackTrace();
throw new IOException(
"Error, could not add URL to system classloader");
}
}
ところで、私は最初の行にコメントアウトCPTestクラスは、それは別のクラスローダーとどのような洞察を得ることに私には非常に貴重であったことをつかむことをお勧め彼らの中にあった。私はクラスローダーのすべてのクラスをダンプする方法を見ることができるように、コードにSysout行を残しました。
あなたはおそらく正しいですが、これは私たちのアプリケーションで実行可能なオプションではありません。私の問題では、リフレクションを使用してクラスを動的にインスタンス化し、代わりにコード生成を行うことに反対しました。 – lucks