在java中热交换jar文件

在java中热交换jar文件,java,jar,hotswap,Java,Jar,Hotswap,我有两个jar文件。 一个.jar包含启动进程的主方法,另两个.jar只包含类文件 在One.jar中,我在其清单类路径中引用了two.jar jar包含使用Class.forName()动态加载类的机制 我想一生只部署一次One.jar。不会对其进行任何更改 只有在two.jar中才会发生更改 我想用更新的two.jar热交换two.jar。我也看到过其他关于热交换的帖子,比如OSGi,ANT的热交换,但没有任何帮助 经过一点研究发现,JRebel确实做得更好,但我真的不知道如何将它与这些JA

我有两个jar文件。 一个.jar包含启动进程的主方法,另两个.jar只包含类文件

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

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

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

只有在two.jar中才会发生更改

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

经过一点研究发现,JRebel确实做得更好,但我真的不知道如何将它与这些JAR集成?我被困在这几乎有两天了。只需要几个步骤的信息来完成这件事。请有人帮帮我。。。这对我来说真的很重要。。。谢谢

因为我与JRebel有直接关系(我是产品经理),所以我可能可以为配置提供一些建议

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

     one.jar ---> two.jar
                   `- rebel.xml   // points to two/project/classes
以下是带有示例的文档:

根据项目的设置方式,IDE插件将有助于实现自动化


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

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

只需将jar放入预期目录即可。如果您真的只是加载类,如果jar在您的类路径中,它会找到类。这里不需要什么特别的东西,除非你的程序是全天候运行的,因为这样它就不会从jar中释放类。要替换类定义,你需要有自己的类加载器来读取two.jar。然后丢弃该类加载器以清除内存中的旧jar(及其所有对象),并创建一个新的类加载器来读取新jar。@SnakeDoc我在Java 7中没有尝试过这一点,但在下面的Java 6中,JVM会锁定文件,使替换文件变得困难……另外,JVM如何知道jar已被替换?编辑:oops,思想@MadProgrammer就是这样的作品!你在写一个全天候运行的程序吗?如果JVM终止(程序结束),那么JAR/类应该总是被释放。如果您的程序全天候运行(如应用程序服务器等),那么您将需要一些更具工业实力的东西,如OSGi或JBoss/Glassfish等。但这些都是笨重的Java EE容器,如果您的程序不是那种类型的,那么为其增加所有开销就没有什么意义了。@MadProgrammer right,这就是我的建议,只要应用程序不需要24/7运行(比如一些维护周期等)。显然这是一个低技术的解决方案。另一种方法是实现一个“暂存”目录,将您的新jar放入该目录,并让文件夹观察服务每隔一段时间扫描一次该目录,如果找到jar,卸载前一个jar,删除它,复制暂存区jar,通过类加载器加载它。通过这种方式,您还可以将程序的“内部”与用户隔离一点。谢谢安东的回答。是的,我的项目将在几天后上线,这就是为什么我们考虑热部署以节省时间。如果你认为JRebel不是适合我的工具,那么请你给我推荐其他工具好吗?JRebel并没有消除JVM平台在实时系统热部署方面的技术限制。它纯粹是作为开发工具设计的,EULA限制了它在生产中的使用。同一供应商提供的另一个工具--LiveRebel()旨在实现应用程序部署自动化,因此您可能想看看。如果有兴趣,请通过网站索取演示。@AntonArhipov只是为了澄清问题-你能在回答中说明你与JRebel的关系吗?@Thorbjørnravandersen done(不过,它仍在我的个人资料中)