0

我们有一个基于 java 的 (jersey+grizzly) REST 服务器,它公开诸如
foo.com/{game}/rules
foo.com/{game}/players
foo.com/{game}/matches 之类的调用


可以有任意数量的游戏
每个游戏都有不同的规则、玩家、比赛实现
由于历史原因,我们希望每个游戏实现都有单独的 jar


所以有 REST 服务器
,当有像 foo.com/tennis/rules 这样的调用时,
我们希望 REST 服务器动态加载“网球”jar。罐子执行它的操作。然后应该卸载 jar
如果下一个调用是针对 foo.com/football/players 我们希望 REST 服务器动态加载“足球”jar。罐子执行它的操作。然后 jar 应该被卸载


有没有一种技术可以做到这一点?
显然,围绕 [this] 有一个非常古老的问题:java:是否有一个框架允许动态加载和卸载 jars(但不是 osgi)?

4

2 回答 2

0

我不知道它在 Java 8 上是如何工作的,但是在 Java 7 中卸载一个类不仅需要卸载该类,还需要卸载它的加载器,以及该类可能具有的其他对象的所有引用。

一旦所有这些都被卸载, System.gc 将被调用。如果其他类仍然持有引用,那么 gc 将无法完成其工作。

OSGI(由@Joop Eggen 建议)是一个可行的选择。JRebel,不是。

于 2014-05-13T08:36:16.110 回答
0

代理对象 代理对象库

在隔离的类加载器中动态加载 java jar 文件以避免依赖冲突并启用模块化更新。[主 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();
于 2018-05-26T03:29:59.387 回答