Java Spring引导中的热插拔
我一直在用弹簧靴做p.O.C 到目前为止,它一直很好,很有前途,但有一个主要缺点:我使用的是嵌入式服务器(即,将web应用程序打包到Java Spring引导中的热插拔,java,eclipse,spring,intellij-idea,spring-boot,Java,Eclipse,Spring,Intellij Idea,Spring Boot,我一直在用弹簧靴做p.O.C 到目前为止,它一直很好,很有前途,但有一个主要缺点:我使用的是嵌入式服务器(即,将web应用程序打包到.jar),因此在开发时,每次更改CSS、HTML或JS文件时,我都必须重建jar并重新启动服务器。没有热插拔。这确实减慢了UI开发的速度 我可以想到一些快速修复方法,比如从不同的域加载静态资源,并从本地的nginx为其提供服务,以及其他类似的变体,但是在使用IntelliJ/Eclipse时,难道没有某种内置选项吗 有几种选择。在IDE中运行(特别是在调试打开的情
.jar
),因此在开发时,每次更改CSS、HTML或JS文件时,我都必须重建jar并重新启动服务器。没有热插拔。这确实减慢了UI开发的速度
我可以想到一些快速修复方法,比如从不同的域加载静态资源,并从本地的
nginx
为其提供服务,以及其他类似的变体,但是在使用IntelliJ/Eclipse时,难道没有某种内置选项吗 有几种选择。在IDE中运行(特别是在调试打开的情况下)是一种很好的开发方式(所有现代IDE都允许重新加载静态资源,通常还允许热交换Java类更改)。SpringBootDevTools是一种获得巨大提升的廉价方法(只需将其添加到类路径中)。它的工作原理是在检测到更改时在热JVM中重新启动应用程序。它还可以在运行时关闭诸如thymeleaf缓存之类的功能,所以您不必记得自己这样做。如果使用更高级的工具编写代码,则可以将其与外部css/js编译器进程一起使用
不再推荐,但可能仍在使用中。如果您需要零延迟的热插拔(例如JRebel),则更复杂的基于代理的工具工作得更好
有关一些最新内容,请参见。您也可以使用JRebel-它将重新加载所有更改(更好的热交换),包括SpringBean。它很容易与Intellij和Eclipse集成。假设您使用的是gradle;在build.gradle中使用以下配置
apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'spring-boot'
apply plugin: 'application'
applicationDefaultJvmArgs = ["-agentlib:jdwp=transport=dt_socket,address=localhost:7000,server=y,suspend=n"]
mainClassName = "package.ApplicationRunner"
使用命令gradlebuildrun
现在IDE可以连接到spring引导应用程序运行的远程JVM(在端口7000上)。它还支持静态文件的热部署
或者,如果依赖关系在IDE中得到正确管理,甚至可以从intelliJ运行主类。main类是包含将调用SpringApplication.run的main方法的类(“classpath:/applicationContext.xml”,args)代码>我推荐(模板引擎)。
Thymeleaf模板文件只是HTML资源。因此,在编辑模板文件后,它们会立即更改。您可以进行热插拔:
- 对于java代码:使用
- 对于Thymeleaf模板:禁用缓存
查看此帖子以查看更多详细信息:在Intellij中,我可以获得此行为。当程序在调试模式下运行时,选择Run>Reload Changed class
注意:Intellij完成操作后,可能会说加载的类是最新的。没有要重新加载的内容
。这是误导性的,因为它确实重新加载了类路径资源
我的环境/设置包括:
Intellij 13
嵌入式Tomcat
“应用程序”类型的运行/调试配置(仅使用主类)
从1.3.0提供静态html、css和js(无jsp)。(现在进入里程碑2)在上,您可以使用spring boot开发工具作为lightweigt方法-请参阅或。
只需升级到>=1.3.0即可。并将以下内容添加到pom.xml中:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
org.springframework.boot
弹簧靴开发工具
而不是以运行方式启动SpringBoot应用程序。。。您很好。如果您使用的是maven,pom.xml中的spring boot maven插件需要如下才能实现热插拔:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.0.RELEASE</version>
</dependency>
</dependencies>
</plugin>
但请记住:不要在您的生产环境中使用此功能。我不知道这种支持能达到什么程度,但如果您使用Eclipse IDE(或任何阅读此内容的人):在调试模式下通过m2e启动Spring Boot应用程序(按下“调试”-下拉按钮并选择maven run配置项)
它对我来说就像一个符咒
My maven run配置项配置如下:
- 目标设置为“springboot:run”
- 基本目录是项目目录
我不再使用任何其他库(甚至不是spring boot开发工具)
就这样
但是,在使用IntelliJ/Eclipse时,难道没有某种内置选项吗
在IntelliJ 15.0和windows 10中帮助我的是以下顺序:
第1步:在pom中添加了以下依赖项(到处都提到了这一点,但只有这一点才能解决它),正如@jonashackt所提到的
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
如果要启用它,请单击“关闭”
步骤4:重新启动IDE
在此基础上,尝试在pom.xml中使用此spring boot devtools标记
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
org.springframework.boot
如何在Springboot应用程序中执行热插拔
使用gradle时,在依赖项中包括以下内容:
编译组:'org.springframework.boot',名称:'spring boot devtools',版本:'2.0.1.RELEASE'
&providedRuntime('org.springframework.boot:spring boot starter tomcat')
在application.properties中添加属性spring.devtools.restart.additional Path=。
构建Gradle,然后将应用程序作为引导运行运行
应用程序已经准备好在修改类时执行热交换了谢谢dave,我将研究spring-loaded和maven用于重新加载静态文件的选项,有一个问题:我正在运行idea12,在注释驱动配置中运行嵌入式tomcat时,我找不到重新打包静态资源的方法,你确定它能用吗?我不是IDEA的常客,但我不知道有什么问题。去年我在一个项目上工作,每个人都使用它,从来没有任何问题。这一定是可能的。也许您必须将src/main/resources显式地添加到classpat中
compiler.automake.allow.when.app.running
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>