Я тестирую динамическую загрузку JARS с помощью GroovyClassLoader
. Мы будем часто обновлять JAR, поэтому нам нужно перезагрузить JAR (более конкретно, класс), когда будут сделаны изменения без перезапуска JVM. Это возможно?Groovy GroovyClassLoader JVM Кэширование и обновление загруженных классов
Я делаю classLoader.addUrl(path)
один раз, а JAR загружается в память. Затем я могу генерировать экземпляры в последующих сценариях без необходимости снова загружать класс (это похоже на кеширование, которое прекрасно).
Проблема в том, что я пробовал делать classLoader.clearCache()
, и, похоже, это не произвело никакого эффекта. .classCache
и .sourceCache
пустые. Но я все еще могу генерировать экземпляры. Я попытался получить родительский загрузчик классов , но он не показывает никаких следов загруженного пакета . Я не уверен, где он живет.
Я также прочитал эту статью, и нет, у меня нет класса, скомпилированного в JVM.
Classes Loaded by GroovyClassLoader not listed
Я не думаю, что мой код актуален, но здесь это в любом случае.
GroovyClassLoader classLoader = new GroovyClassLoader()
def jarFile = new File("C:/sandbox-test-0.1.0-SNAPSHOT.jar")
classLoader.addURL(jarFile.toURI().toURL())
def mySand = Class.forName("com.test.Sandbox").newInstance()
println mySand.dump()
Исправьте меня, если я ошибаюсь, я понимаю, что вы пытаетесь заменить существующую банку более новой версией jar в вашем пути к классам. Если это так, не вызывал бы classLoader.addUrl (путь) с новым курсом jar, просто добавляя новую версию jar в конец пути к классам? Я считаю, что результатом этого было бы то, что теперь у вас есть 2 версии вашего флага в пути к классам и, что более важно, Java найдет старую версию, указанную первыми в пути к классам, и никогда не загружает классы из новой банки, если они не являются новыми классами, которые не выполнялись в оригинальной форме. – pczeus
Это действительно так, и действительно проблема. С помощью удивительного гуру Groovy я теперь работаю над следующим решением: 1. Напишите новый класс, который служит для создания и управления новым UrlClassLoader() во время запуска, а затем загружает все мои JAR-URL. Этот загрузчик классов будет храниться в JVM как статическая переменная, позволяя всем моим пользовательским кодам найти этот загрузчик классов. Самое главное, мой процесс «Updater» будет запускаться каждые 10 минут, и если он обнаружит изменения в любых баночках, он установит эту переменную в нуль, а затем снова заново закроет ее, вытаскивая свежие копии JARS в процессе. – solvingJ