我正在寻找一种方法,用新的功能替换旧功能的jar而不停止整个应用程序。我已经谷歌搜索了一下(Unloading classes in java?,Dynamically loadable and unloadable application modules in Java - how?),并找到了3种可能的解决方案:
有没有关于Tomcat如何卸载类(战争)的解释?是否可以在我的应用程序中重复使用它?
PS 就在我写这篇文章的时候,有两个奇怪的想法出现在我脑海里:
答案 0 :(得分:2)
只有当类及其类加载器无法访问并且因此有资格进行垃圾回收时,才能卸载该类。由于类加载器可以到达它加载的每个类,并且由类加载器加载的每个类都可以到达它的类加载器,并且作为类的实例的每个对象都可以到达它的类,这意味着类加载器,它加载的所有类并且作为这些类的实例的所有对象必须 all 无法访问并且有资格被垃圾收集。只有这样,一个班级才能被卸下"当完整的对象图被垃圾收集时。
答案 1 :(得分:1)
我只能部分地回答你的问题,但总比没有好......你是对的,模块化是一个非常繁琐的话题(至少在Java 9之前)。
Ad idea 2(Spring):我已经对Spring Boot over here做了一些考虑,并得出结论,我将坚持OSGI(值得进入它)或纯粹的微服务架构。
答案 2 :(得分:1)
我认为你没有完全重新部署应用程序,但是每次开发时都不想重启整个应用程序
如果要在不更改类或方法签名的情况下更改方法的功能,可以使用Spring Loaded
为项目添加依赖关系https://mvnrepository.com/artifact/org.springframework/springloaded/1.2.6.RELEASE
设置JVM选项-javaagent:path \ springloaded-version.jar -noverify
此选项可以通过多种方式设置,具体取决于您运行tomcat的方式
我有Broadleaf eccomerce网站,我在运行嵌入式tomcat的批处理脚本中将此选项添加到MAVEN_OPTS,或者您可以在运行配置中为Tomcat VM选项配置
阅读http://docs.spring.io/spring-boot/docs/current/reference/html/howto-hotswapping.html