罐的动态装载和卸载

时间:2014-05-13 08:00:35

标签: java jar classloader dynamic-class-loaders

我们有一个基于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)?

2 个答案:

答案 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();