我们有一个基于java(jersey + grizzly)的REST服务器,它公开了类似的调用
foo.com/{game}/rules
foo.com/{game}/players
foo.com/ {游戏} /匹配
可以有任意数量的游戏
每个游戏对规则,玩家,比赛都有不同的实现
由于历史原因,我们希望为每个游戏实施单独的罐子
所以有REST服务器
当有一个像foo.com/tennis/rules这样的电话时
我们希望REST服务器动态加载'网球'jar。罐子做它的操作。然后应该卸载jar
如果下一个电话是foo.com/football/players
我们希望REST服务器动态加载'足球'jar。罐子做它的操作。然后应该卸载jar
有没有这样做的技巧?
显然,[this]周围有一个非常古老的问题:java: is there a framework that allows dynamically loading and unloading of jars (but not osgi)?
答案 0 :(得分:0)
我不知道Java 8是如何工作的,但是在Java 7中卸载一个类不仅需要卸载类,还需要卸载它的加载器,以及该类可能具有的其他对象的所有引用。
一旦卸下所有这些,将调用System.gc。如果其他类仍然持有引用,则gc将无法完成其工作。
OSGI(由@Joop Eggen建议)是一个可行的选择。 JRebel,不是。
答案 1 :(得分:0)
代理对象 proxy-object library
在隔离的类加载器中动态加载Java jar文件,以避免依赖冲突并启用模块化更新。将加载[main jar文件夹] /lib/myLib/2.0 / * .jar中的所有jar文件。
代码示例
从位于myLib / 2.0文件夹中的JAR文件创建对象:
File libDir = new File("myLib/2.0");
ProxyCallerInterface caller = ObjectBuilder.builder()
.setClassName("net.proxy.lib.test.LibClass")
.setArtifact(DirArtifact.builder()
.withClazz(ObjectBuilderTest.class)
.withVersionInfo(newVersionInfo(libDir))
.build())
.build();
String version = caller.call("getLibVersion").asString();