我正在使用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()
答案 0 :(得分:0)
Sascha向我展示了一个非常简单的解决方法。
To"更新"一个类加载器,可以简单地使现有的一个并重新制作:
classloader = null
classloader = new GroovyClassLoader()
classLoader.addURL(jarFile.toURI().toURL())
只有在请求类时才需要类加载器。
这在我的用例中很简单。也许其他人会有更复杂的情况,可能会使这不起作用。