Горячая замена файлов JAR в Java
У меня есть два фляги. One.jar содержит метод main для запуска процесса, а другие two.jar содержат только файлы классов.
В One.jar я ссылался на two.jar в его манифестированном classpath.
One.jar содержит механизм для динамической загрузки классов с использованием Class.forName()
Я хочу развернуть One.jar только один раз за всю жизнь. Не буду вносить в него какие-либо изменения.
Изменения будут происходить только в два.jar
Я хочу выполнить горячую замену two.jar с обновленным two.jar. Я также видел другие сообщения о горячей замене, такие как OSGi, горячая замена для ANT, но мне ничего не помогает.
После небольшого исследования выяснилось, что JRebel делает это действительно лучше, но я действительно не знаю, как интегрировать его с этими банками? Я застрял на этом почти 2 дня. Просто нужно несколько шагов информации, чтобы сделать это. Кто-нибудь, помогите мне, пожалуйста... Это действительно очень важно для меня... Спасибо
2 ответа
Привет всем, у меня наконец есть решение для этого. Я действительно не знаю, что придумаю такое простое решение. Я взял идею @Thorbjørn Равн Андерсен. Все, что я сделал, сначала получил временную метку файла jar, а затем загрузил jar с помощью URLClassLoader. Если временная метка файла jar изменяется (т.е. когда я заменяю jar на обновленный jar), то я удаляю старый объект URLClassLoader с помощью close() и снова загружаю новый jar с помощью URLClassLoader. Единственное, что я должен проверять каждый раз, это то, меняется ли отметка времени банки. Надеюсь, что этот ответ поможет другим людям. Спасибо всем за вашу поддержку.
Поскольку я напрямую связан с JRebel (я менеджер по продукту), я, вероятно, могу дать некоторые указания по настройке.
Чтобы обновить классы в JAR с помощью JRebel, поместите специальный файл конфигурации rebel.xml в тот файл two.jar, который будет указывать на каталог, в котором находятся скомпилированные классы файла two.jar.
one.jar ---> two.jar
`- rebel.xml // points to two/project/classes
Вот документ с примерами: http://manuals.zeroturnaround.com/jrebel/standalone/config.html
В зависимости от того, как настроен ваш проект, плагины IDE помогут автоматизировать это.
Обратите внимание, что если вы хотите выполнить эту процедуру в действующей системе, то JRebel не является инструментом для такого рода целей.