Как динамически загрузить класс из приложения JAR для использования в другом JAR? - PullRequest
0 голосов
/ 11 июня 2018

У меня есть JAR-приложение, M.jar, которое поддерживает расширения для динамической записи и загрузки.Приложение требует, чтобы классы реализовывали интерфейс E и назывались NE.

Теперь я пытаюсь сделать следующее:

  1. Написать расширение API1 и загрузить его вM.
  2. Напишите другое расширение APIUser, загрузите его в M и используйте API1.

Пожалуйста, см. Диаграмму ниже для того, что я пытаюсь сделать здесь.

enter image description here

Я знаю, что M.jar использует пользовательский ClassLoader, потому что для него требуется, чтобы любое расширение имело только имя AE.

Я пробовал метод ServiceProvider, ServiceProviderInterfaceкак описано здесь , но это не сработало.Я полагаю, что это потому, что классы API не находятся в пути к классам М. и, следовательно, APIUser не может его найти.

Я хочу знать,

  1. Если возможно использовать ClassLoader APIUser для загрузки APIКласс и инициализировать его для использования в APIUser.
  2. Возможно ли для M заблокировать / изолировать ClassLoader API от любых других расширений?Я думаю, что это может быть основано на этом ответе .
  3. Какие есть еще способы загрузить класс API в APIUser1 или APIUSer2 ... и поддерживать только один экземпляр класса API?(то есть синглтон)

1 Ответ

0 голосов
/ 18 июня 2018

После некоторого изучения и изучения ClassLoaders, вот что я узнал относительно моих вопросов.

  1. Это невозможно сделать, потому что таким образом M.jar и другие расширяемые Java-программызагрузка другого использует URLClassLoader как дочерний элемент некоторого другого ClassLoader.Это означает, что в иерархии делегирования ClassLoader ClassLoader класса API.jar находится выше в иерархии, а ClassLoader класса APIUser.jar будет родственным.Это означает, что классы, загруженные из API.jar, не видны в APIUser.jar.

  2. M явно не изолирует расширения, но это естественный способ загрузки JAR-файлов в приложение.

  3. Основываясь на ответе на вопрос 1, я сейчас использую способ hackish для добавления JAR-файла в путь к классам SystemClassLoader во время выполнения изатем ссылаясь на него из других / любых расширений, загрузив его с помощью SystemClassLoader.Это потому, что SystemClassLoader виден из любых расширений.

ПРИМЕЧАНИЯ. Я также предполагаю, что способ ServiceLoader для этого также будет работать.Но я сам не пробовал.

Ссылки:

https://zeroturnaround.com/rebellabs/rebel-labs-tutorial-do-you-really-get-classloaders/

https://docs.oracle.com/javase/8/docs/api/java/lang/ClassLoader.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...