平时开发java 程序的时候,需要经常重启项目,而springboot 项目启动又非常慢,有没有好的解决方案呢?
答案是有的,使用热部署的方式,可以在改动代码的时候,自动重启项目。目前市面上主要是有2种方案,插件集成和依赖集成。
方案一
使用JRebel 来进行热部署,JRebel可以在应用程序运行时动态加载修改后的 Java 类和资源文件,使开发人员能够在不停止和重新启动应用程序的情况下快速看到代码更改的结果。
安装的方式比较简单,直接在idea 插件市场搜索即可
安装好后点击在idea 的 按钮即可使用jrebel 进行启动项目了。
后面如果修改项目,就会自动进行不部署了。
那么Jrebel 为什么可以进行热部署呢?
JRebel 的工作原理可以简单概括为在应用程序运行时动态替换 Java 类和资源文件。具体来说,它通过以下步骤实现代码热部署:
JRebel 在应服务器托管网用程序启动时会加载一个 Java 代理,它会监视应用程序的类加载器和文件系统。
当开发人员修改了 Java 类或资源文件并保存时,JRebel 会检测到文件系统的变化,并将修改后的文件加载到内存中。
JRebel 会使用自己的类加载器来加载修改后的类,并将其替换原来的类。在替换类的过程中,JRebel 会保留原来类的状态和数据,以确保应用程序的正确性。
JRebel 会通知应用程序的类加载器和JVM,告诉它们有新的类可用。这样,应用程序就可以使用修改后的类而不需要重启或重新加载整个应用程序。
JRebel 的工作原理基于 Java 的动态代理机制和类加载器机制。它使用自己的类加载器来加载修改后的类,而不是使用应用程序的类加载器。这样可以避免应用程序的类加载器和 JVM 的内存泄漏问题。同时,JRebel 还使用了一些高级技术,如字节码增强、动态代理、反射等,来确保代码热部署的正确性和性能。
虽然插件很好用,也不会入侵代码,不过用Jrebel 也是有点缺点的,首先这是一个付费的插件,然后就是我测试在jdk8正常运行,但是jdk17 的项目是不能运行的,可能还有一些问题要解决。
方案二
使用 spring-boot-devtools 依赖来热部署。
spring-boot-devtools 是免费的,而且使用起来比较简单,大家可以在项目中使用相关组件即可。
- 配置pom.xml。
org.springframework.boot
spring-boot-devtools
true
provided
org.apache.maven.plugins
maven-compiler-plugin
${maven-compiler-plugin.verison}
true
org.springframework.boot服务器托管网
spring-boot-maven-plugin
${spring-boot.version}
true
repackage
- 配置yml 开启develop。
spring:
devtools:
restart:
enabled: true
idea 如果要用,也需要做一些配置。
idea 2021 之前的配置,
ctrl+ alt +shift+/然后点击 Registery。
idea 2021 之后的配置,直接在setting 里面可以找到。
它的原理其实和jRebel 有点像,也是利用到了类加载器的原理。
spring-boot-devtools 可以分为以下几个步骤:
在应用程序启动时,spring-boot-devtools 会创建一个新的类加载器,并将它设置为应用程序的主类加载器的子加载器。
spring-boot-devtools 会监视应用程序的类路径和文件系统,当检测到代码或资源文件的变化时,它会使用新的类加载器重新加载应用程序。
spring-boot-devtools 还会使用 Java Agent 技术来修改应用程序的字节码,以支持热替换和自动重启应用程序。
当应用程序重新加载时,spring-boot-devtools 会关闭旧的应用程序实例,并启动一个新的实例,从而实现自动重启应用程序。
这样在项目中,就可以使用热部署了,spring-boot-devtools 优点是免费,配置也简单,缺点就是有一定的的入侵性,配置也相对繁琐一点如果对这方面要求没有那么高的可以试试。
小结
简单总结一下,土豪用Jrebel,想免费可以用spring-boot-devtools。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
终于明白了i++到底是怎么个事,以前一直稀里糊涂的,虽然是最基础的但是搞懂了之后真的心里好舒服。 #include int main() { int line = 0; while (line=200) printf(“大于200了”); } 随手写了个,也知…