Реализация плагинов JAR - PullRequest
       19

Реализация плагинов JAR

3 голосов
/ 17 декабря 2011

Давайте создадим приложение на Groovy / Java, которое должно использовать набор классов, определенных во внешних *.jar -файлах (предположим, они расположены рядом с основным исполняемым файлом jar).

Итак, основной класс(давайте назовем его Main) должен загрузить plugin.jar файл во время выполнения и вызвать некоторый метод экземпляра для класса, определенного в этом jar (для некоторых соглашений, предположим, что класс имеет имя как jar - Plugin в нашемcase).

Класс Main не может знать, какие плагины он имеет, пока он не будет запущен.Давайте отбросим аргументы CLASSPATH и java -jar run и просто сделаем магию только с кодом.

Итак, как это можно сделать и как создать plugin.jar (используя Eclipse в моем случае) для того, чтобы быть правильно загруженным?

PS: да, я собираю мои отличные исходники в файл jar.Но мне нужно выполнить загрузку классов и запускать их точно на лету.

Ответы [ 2 ]

2 голосов
/ 17 декабря 2011

Секрет был действительно прост!

Использование 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 один:

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 голос
/ 17 декабря 2011

Фреймворк OSGi поддерживает динамическую загрузку плагинов.Существует несколько реализаций, включая Equinox , которая лежит в основе самого Eclipse.

...