Как динамически загружать JAR-файлы во время выполнения?
Почему это так сложно сделать на Java? Если вы хотите иметь какую-либо модульную систему, вам нужно иметь возможность динамически загружать JAR-файлы. Мне сказали, что есть способ сделать это, написав свой собственный ClassLoader, но это большая работа для чего-то, что должно (по крайней мере, на мой взгляд) быть таким же простым, как вызов метода с JAR-файлом в качестве аргумента.
Есть предложения по простому коду, который это делает?
Переведено автоматически
Ответ 1
Причина, по которой это сложно, - безопасность. Загрузчики классов должны быть неизменяемыми; вы не должны иметь возможности волей-неволей добавлять к ним классы во время выполнения. На самом деле я очень удивлен, что это работает с системным загрузчиком классов. Вот как вы это делаете, создавая свой собственный дочерний загрузчик классов:
Хотя большинство перечисленных здесь решений являются либо взломами (до JDK 9), которые сложно настроить (агенты), либо просто больше не работают (после JDK 9) Я нахожу действительно удивительным, что никто не упомянул четко документированный метод.
Вы можете создать пользовательский системный загрузчик классов, а затем вольны делать все, что пожелаете. Отражение не требуется, и все классы используют один и тот же загрузчик классов.
У classloader должен быть конструктор, принимающий classloader, который должен быть установлен в качестве родительского. Конструктор будет вызван при запуске JVM и будет передан реальный системный загрузчик классов, основной класс будет загружен пользовательским загрузчиком.
Чтобы добавить jar-файлы, просто вызовите ClassLoader.getSystemClassLoader() и приведите его к своему классу.
Ознакомьтесь с этой реализацией для получения тщательно разработанного загрузчика классов. Пожалуйста, обратите внимание, что вы можете изменить add() метод на public .
Ответ 4
Вам следует взглянуть на OSGi, например, реализованный в платформе Eclipse. Он делает именно это. Вы можете устанавливать, деинсталлировать, запускать и останавливать так называемые пакеты, которые фактически являются файлами JAR. Но это делает немного больше, поскольку предлагает, например, сервисы, которые могут быть динамически обнаружены в файлах JAR во время выполнения.