Запуск класса в отдельном контексте - PullRequest
0 голосов
/ 16 июня 2011

Я пытаюсь сделать простое приложение, которое загружает и запускает некоторые классы во время выполнения. Например, допустим, у меня есть этот конфиг:

module1.classpath=module1.jar,somelibs1.jar
module1.class=com.blabla.Module1
module2.classpath=module2.jar,somelibs2.jar
module2.class=com.blabla.Module2

Затем мне нужно загрузить библиотеки, указанные в module1.classpath, и запустить module1.class с загруженными библиотеками. После этого мне нужно загрузить module2.classpath и запустить module2.clas s с этими библиотеками.

Как мне справиться со случаем, когда somelibs1.jar и somelibs2.jar имеют внутри одинаковые классы? В основном я хотел бы запустить module1.jar, используя исключительно somelibs1.jar и module2.jar, используя исключительно somelibs2.jar. Как мне это реализовать?

Полагаю, мне нужно создать отдельный загрузчик классов для каждого из моих классов и вставить банки в эти загрузчики классов. Однако я был бы признателен за пример или хотя бы подтверждение того, что это правильный способ сделать это.

Ответы [ 2 ]

1 голос
/ 16 июня 2011

Это, похоже, довольно хороший вариант использования для OSGI .Я бы порекомендовал использовать OSGI для этого, так как все, что вам нужно, предоставляется OSGI из коробки.

Но если по какой-то причине вы не можете использовать OSGI, вам нужно иметь загрузчик классов для каждого модуля.Загрузите moduleX.class с помощью ClassLoaderX, и moduleX.classpath должен быть добавлен в путь ClassLoaderX.Для этого вы можете использовать набор простых URLClassLoader.

0 голосов
/ 16 июня 2011

Спасибо за вопрос. Очень интересно.

Кажется, вы не можете использовать несколько версий одного и того же класса в одном экземпляре JVM. У меня никогда не было этой задачи, и я не знаю, как это реализовать.

Но давайте играть. Я не знаю, что за экзотическое приложение вы разрабатываете. Может быть, вы можете запустить много JVM, и у каждой JVM будет эксклюзивная CLASSPATH.

Напишите приложение, которое может запускать (например, с помощью Runtime.exec()) другую JVM и вести с ней разговор по некоторому каналу (может быть по сети).

...