2011-12-17 8 views
3

外部の*.jar -filesで定義された一連のクラスを使用する必要があるGroovy/Javaアプリケーションを用意しましょう(それらがメインの実行可能なJARの近くにあると仮定します)。JARプラグインの実装

したがって、メインクラス(Mainと呼ぶ)は、実行時にファイルplugin.jarをロードし、そのjarで定義されたクラスに対していくつかのインスタンスメソッドを呼び出す必要があります(規約によっては、我々の場合はPlugin)。

Mainクラスは、実行されるまでどのプラグインがあるかを知ることができませんでした。 CLASSPATHjava -jarの引数を捨てて、コードだけで魔法を実行しましょう。

これはどのようにして正しくロードするためにplugin.jarを(私の場合はEclipseを使用して)作成する必要があるのですか?

PS:はい、私はgroovyソースをjarファイルにコンパイルします。しかし、私はクラスの読み込みを実行し、正確にオンザフライを呼び出す必要があります。

答えて

2

秘密は本当に簡単でした!

URLClassLoaderを使用すると、このトリックが実行されます。

ので、Groovyのコード:

ClassLoader loader = new URLClassLoader((URL[]) [ 
    new File("C:\\Users\\errorist\\workspace\\javatest1\\bin\\").toURI().toURL() 
]) 

Class c = loader.loadClass("src.SomeClass1") 

c.invokeMethod("main", (String[]) ["Hello", "World"]) 

そしてのJava 1:

File file = new File("C:\\Users\\errorist\\workspace\\javatest1\\bin\\"); 
URL[] urls = new URL[] { file.toURI().toURL() }; 
ClassLoader loader = new URLClassLoader(urls); 
Class c = loader.loadClass("src.SomeClass1"); 
c.invokeMethod("main", new String[] { "Hello", "World!" }); 
1

OSGiフレームワークは、プラグインの動的ロードをサポートしています。 Eclipse自体の基盤となるEquinoxを含む複数の実装があります。

+0

だけでなく、おかげで、私はサードパーティせずにそれを行うことができれば、私は願っ=) – shybovycha

関連する問題