Java Spring引导中的热插拔

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中运行(特别是在调试打开的情

我一直在用弹簧靴做p.O.C

到目前为止,它一直很好,很有前途,但有一个主要缺点:我使用的是嵌入式服务器(即,将web应用程序打包到
.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>