2016-02-04 4 views
0

Я тестирую динамическую загрузку 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() 
+0

Исправьте меня, если я ошибаюсь, я понимаю, что вы пытаетесь заменить существующую банку более новой версией jar в вашем пути к классам. Если это так, не вызывал бы classLoader.addUrl (путь) с новым курсом jar, просто добавляя новую версию jar в конец пути к классам? Я считаю, что результатом этого было бы то, что теперь у вас есть 2 версии вашего флага в пути к классам и, что более важно, Java найдет старую версию, указанную первыми в пути к классам, и никогда не загружает классы из новой банки, если они не являются новыми классами, которые не выполнялись в оригинальной форме. – pczeus

+0

Это действительно так, и действительно проблема. С помощью удивительного гуру Groovy я теперь работаю над следующим решением: 1. Напишите новый класс, который служит для создания и управления новым UrlClassLoader() во время запуска, а затем загружает все мои JAR-URL. Этот загрузчик классов будет храниться в JVM как статическая переменная, позволяя всем моим пользовательским кодам найти этот загрузчик классов. Самое главное, мой процесс «Updater» будет запускаться каждые 10 минут, и если он обнаружит изменения в любых баночках, он установит эту переменную в нуль, а затем снова заново закроет ее, вытаскивая свежие копии JARS в процессе. – solvingJ

ответ

0

Саша показал мне блестяще простой обходной путь.

В «Update» загрузчики классов, можно просто свести на нет существующую и переделать:

classloader = null 
classloader = new GroovyClassLoader() 
classLoader.addURL(jarFile.toURI().toURL()) 

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

Это просто в моем случае использования. Возможно, другие будут иметь более сложные сценарии, которые могут заставить это работать.

Смежные вопросы