Groovy GroovyClassLoader JVM缓存和更新加载的类

时间:2016-02-04 03:50:13

标签: java groovy jvm classloader

我正在使用GroovyClassLoader测试JARS的动态加载。我们将经常更新JAR,因此我们需要在不重新启动JVM的情况下进行更改时重新加载JAR(更具体地说,类)。这可能吗?

我做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()

1 个答案:

答案 0 :(得分:0)

Sascha向我展示了一个非常简单的解决方法。

To"更新"一个类加载器,可以简单地使现有的一个并重新制作:

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

只有在请求类时才需要类加载器。

这在我的用例中很简单。也许其他人会有更复杂的情况,可能会使这不起作用。