5

我有两个 jar 文件。one.jar 包含启动进程的主要方法,而其他 two.jar 仅包含类文件。

在 One.jar 中,我在其清单类路径中引用了 two.jar。

One.jar 包含使用 Class.forName() 动态加载类的机制

我想一生只部署一次 One.jar。不会对其进行任何更改。

更改只会在 two.jar 中发生

我想用更新的 two.jar 热交换 two.jar。我也看过其他关于热插拔的帖子,比如 OSGi、ANT 的热插拔,但没有任何帮助。

经过一番研究发现 JRebel 确实做得更好,但我真的不知道如何将它与这些 jar 集成?我被困在这个问题上将近 2 天。只需几个步骤的信息即可完成此操作。请有人帮助我...这对我来说真的很重要...谢谢

4

2 回答 2

5

嘿,我终于找到了解决方案。我真的不知道我会想出这么简单的解决方案。我接受了@Thorbjørn Ravn Andersen 的想法。我所做的只是首先获取 jar 文件的时间戳,然后使用 URLClassLoader 加载 jar。如果 jar 文件的时间戳发生变化(即当我用更新的 jar 替换 jar 时),那么我将使用 close() 丢弃旧的 URLClassLoader 对象并再次使用 URLClassLoader 加载新的 jar。每次我唯一需要检查的是jar的时间戳是否改变。希望这个答案也能帮助其他人。谢谢大家的支持。

于 2014-01-08T14:54:05.413 回答
2

由于我与 JRebel 直接相关(我是产品经理),因此我可能可以提供一些配置建议。

要使用 JRebel 更新 JAR 中的类,请将专用的 rebel.xml 配置文件放入该 two.jar 中,该文件将指向 two.jar 的已编译类所在的目录。

     one.jar ---> two.jar
                   `- rebel.xml   // points to two/project/classes

这是带有示例的文档:http: //manuals.zeroturnaround.com/jrebel/standalone/config.html#configuring-jars

根据您的项目的设置方式,IDE 插件将有助于自动执行此操作。

请注意,如果您打算在实时系统中执行此过程,则 JRebel 不是用于此类目的的工具。

于 2014-01-05T00:16:22.480 回答