我正在用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()发布于 2016-02-17 16:44:07
Sascha给我展示了一个非常简单的解决方案。
要“更新”类加载器,可以简单地取消现有的类加载器并重做:
classloader = null
classloader = new GroovyClassLoader()
classLoader.addURL(jarFile.toURI().toURL())只有在请求类时才需要类加载器。
这在我的用例中很简单。也许其他人会有更复杂的情况,这可能会使这不起作用。
https://stackoverflow.com/questions/35192157
复制相似问题