Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Tomcat:Tomcat如何在内部卸载类?_Java_Spring_Tomcat_Osgi_Classloader - Fatal编程技术网

Java Tomcat:Tomcat如何在内部卸载类?

Java Tomcat:Tomcat如何在内部卸载类?,java,spring,tomcat,osgi,classloader,Java,Spring,Tomcat,Osgi,Classloader,我正在寻找一种方法,在不停止整个应用程序的情况下,用新功能替换一个jar。我在谷歌上搜索了一下(,),找到了3种可能的解决方案: OSGI看起来太复杂了:从这个强大的规范中,我只需要卸载类 自己的实现,这意味着创建自己的类加载器,在它的帮助下加载jar,当需要关闭jar时,向GC公开类加载器实例,并希望GC将其与所有加载的jar一起删除,这可能不会立即发生 复制应用程序服务器所做的工作:)这就是我问题的目的 关于Tomcat如何卸载类(wars)有什么解释吗?是否可以在我的应用程序中重用此功能?

我正在寻找一种方法,在不停止整个应用程序的情况下,用新功能替换一个jar。我在谷歌上搜索了一下(,),找到了3种可能的解决方案:

  • OSGI看起来太复杂了:从这个强大的规范中,我只需要卸载类
  • 自己的实现,这意味着创建自己的类加载器,在它的帮助下加载jar,当需要关闭jar时,向GC公开类加载器实例,并希望GC将其与所有加载的jar一起删除,这可能不会立即发生
  • 复制应用程序服务器所做的工作:)这就是我问题的目的 关于Tomcat如何卸载类(wars)有什么解释吗?是否可以在我的应用程序中重用此功能?

    PS 就在我写这篇文章的时候,两个奇怪的想法出现在我的脑海里:

  • 也许我们可以用一组新的JAR启动另一个应用程序实例,并将输入和输出数据流从旧的JAR切换到新的JAR。如果有一个地方可以保存状态,那么它可以比完全重启更快
  • 春天会有帮助吗?它可以动态注册bean,但这看起来有点难看,而且它无论如何也无法卸载它们;也许,弹簧靴会有帮助吗

  • 我只能部分回答你的问题,但总比什么都不回答好。。。您是对的,模块化是一个相当乏味的话题(至少在出现Java9之前是如此)


    广告创意2(Spring):我已经对Spring Boot进行了一些思考,并得出结论,我将坚持OSGI(值得一试)或纯微服务架构。

    我只能部分回答您的问题,但总比什么都不回答好。。。您是对的,模块化是一个相当乏味的话题(至少在出现Java9之前是如此)

    广告创意2(Spring):我已经在Spring Boot上花了一些心思,并得出结论,我要么坚持OSGI(值得一试),要么坚持纯微服务架构。

    • 我假设您并没有重新部署整个应用程序,但不希望在每次开发应用程序时都重新启动整个应用程序

    • 如果希望在不更改类或方法签名的情况下更改方法的功能,可以使用Spring Loaded

    • 将依赖项添加到项目中

    • 设置JVM选项-javaagent:path\springload-version.jar-noverify

      • 根据运行tomcat的方式,可以通过多种方式设置此选项

      • 我有一个Broadleaf eCommerce网站,我将此选项添加到运行嵌入式tomcat的批处理脚本中的MAVEN_OPTS中,或者您可以为tomcat VM选项配置运行配置

    • 阅读

        • 我假设您并没有重新部署整个应用程序,但不希望在每次开发应用程序时都重新启动整个应用程序

        • 如果希望在不更改类或方法签名的情况下更改方法的功能,可以使用Spring Loaded

        • 将依赖项添加到项目中

        • 设置JVM选项-javaagent:path\springload-version.jar-noverify

          • 根据运行tomcat的方式,可以通过多种方式设置此选项

          • 我有一个Broadleaf eCommerce网站,我将此选项添加到运行嵌入式tomcat的批处理脚本中的MAVEN_OPTS中,或者您可以为tomcat VM选项配置运行配置

        • 阅读


        只有当类及其类加载器不可访问且因此有资格进行垃圾收集时,才能卸载类。由于类加载器可以到达它加载的每个类,并且类加载器加载的每个类都可以到达它的类加载器,并且作为类实例的每个对象都可以到达它的类,这意味着类加载器,它加载的所有类以及作为这些类实例的所有对象都必须是不可访问的,并且有资格进行垃圾收集。只有这样,当完整的对象图被垃圾收集时,才能“卸载”类。

        只有当类及其类加载器不可访问并且因此有资格进行垃圾收集时,才能卸载类。由于类加载器可以到达它加载的每个类,并且类加载器加载的每个类都可以到达它的类加载器,并且作为类实例的每个对象都可以到达它的类,这意味着类加载器,它加载的所有类以及作为这些类实例的所有对象都必须是不可访问的,并且有资格进行垃圾收集。只有这样,当完整的对象图被垃圾收集时,类才能被“卸载”。

        模块化在Java9中也是一个乏味的话题。Java 9中没有魔法仙子灰尘出现。:-)模块化在Java9中也是一个乏味的话题。Java 9中没有魔法仙子灰尘出现。:-)OSGi可能看起来很复杂,因为它必须处理很多角落的情况。如果你选择2号或3号路线,你很可能会重新实现OSGi的很大一部分——除非没有我们18年的经验:-)OSGi可能看起来很复杂,因为它必须处理很多角落的案例。如果你选择2号或3号路线,你很可能会重新实现OSGi的很大一部分——除非没有我们18年的经验:-)谢谢,Zildyan!据我所知,这与热交换技术有关。但我对装卸技术更感兴趣。区别在于热交换替换了内存中的一些类实例,而我想添加它并完全删除它。谢谢,Zildyan!据我所知,这与热交换技术有关。但我对装卸技术更感兴趣。不同之处在于热交换替换了内存中的某些类实例,而我希望添加它并将其完全删除