Spring Boot中的热插拔

时间:2014-01-28 07:41:36

标签: java eclipse spring intellij-idea spring-boot

我一直在用Spring Boot做一个P.O.C.

到目前为止,它一直非常好,很有前景,但有一个主要缺点:我使用的是嵌入式服务器(即将网页应用打包在.jar中),所以在开发时我必须重建每次我更改CSS,HTML或JS文件时,jar并重新启动服务器。没有热插拔。这确实减慢了UI开发速度。

我可以想到几个快速修复,例如从其他域加载静态资源并从本地nginx提供静态资源,以及更多这样的变体,但是没有内置选项使用IntelliJ / Eclipse时有些什么?

12 个答案:

答案 0 :(得分:22)

有几种选择。在IDE中运行(特别是在调试时)是一种很好的开发方式(所有现代IDE都允许重新加载静态资源,通常还可以热插拔Java类更改)。 Spring Boot devtools是一种获得相当大提升的廉价方式(只需将其添加到类路径中)。它的工作原理是在检测到更改时在热JVM中重新启动应用程序。它还会在运行时关闭像百万美元高速缓存这样的东西,所以你不必记得自己这样做。如果您使用更高级别的工具编写该代码,则可以将其与外部css / js编译器进程一起使用。

不再推荐使用

Spring Loaded,但可能仍在使用中。如果您需要零延迟的热插拔(例如JRebel),更复杂的基于代理的工具可以更好地工作。

请参阅docs了解最新内容

答案 1 :(得分:7)

你可以进行热交换:

  • for java code:using spring-loaded
  • for Thymeleaf templates:禁用缓存

查看此信息以查看更多详情:http://blog.netgloo.com/2014/05/21/hot-swapping-in-spring-boot-with-eclipse-sts/

答案 2 :(得分:6)

  

但在使用IntelliJ / Eclipse时,是否有某种内置选项?

在IntelliJ 15.0(Windows 10)中帮助我的是以下序列:

第1步:在pom中添加了以下依赖项(这在任何地方都有提及但是这个单独的dint解决了它),如@jonashackt所述

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-devtools</artifactId>
</dependency>

第2步:然后从文件 - >设置 - &gt;构建 - 执行 - 部署 - &gt;编译器(确保选择主编译器选项而不是其任何子选项)

启用自动生成项目。单击“确定”并关闭对话框

第3步:按住 Shift + Ctrl + A (在Windows上)您将看到一个搜索对话框标题为&#34;输入操作或选项名称&#34;,键入注册表。双击第一个选项&#34; Registry ...&#34;它会打开另一个窗口。寻找以下选项:

compiler.automake.allow.when.app.running

并启用它,点击关闭

第4步:重启IDE

从此source

中阐述

答案 3 :(得分:5)

您也可以使用JRebel - 它将重新加载包括spring bean在内的所有更改(更好的hotswap)。它很容易与Intellij和Eclipse集成。

答案 4 :(得分:5)

假设你正在使用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"

使用命令gradle build run

从IDE或命令行运行应用程序

现在,IDE可以连接到运行spring boot应用程序的远程JVM(在端口7000上)。它还支持静态文件的热部署。

如果在IDE中正确管理依赖项,甚至可以从intelliJ运行主类。主类是包含调用SpringApplication.run("classpath:/applicationContext.xml", args);

的main方法的类

答案 5 :(得分:5)

在Intellij中,我可以得到这种行为。当程序在调试模式下运行时,请选择Run > Reload Changed Classes

注意:Intellij完成操作后,可能会说Loaded classes are up to date. Nothing to reload。这是误导性的,因为它实际上是DID重新加载你的类路径资源。

我的环境/设置包括:
Intellij 13
嵌入式Tomcat
“应用程序”类型的运行/调试配置(仅使用主类)
提供静态html,css和js(没有jsp)

答案 6 :(得分:5)

我不知道这种支持有多远,但是如果您使用Eclipse IDE(或任何阅读此内容的人):在调试模式下通过m2e启动Spring-Boot应用程序(按“调试” - 下拉按钮并选择你的maven运行配置项。)

它对我来说就像一个魅力。

我的maven run配置项配置如下:

  • 目标设置为“spring-boot:run”
  • 基目录是项目目录

没有使用任何其他库(甚至不是spring-boot-devtools)。

就是这样。

答案 7 :(得分:3)

尝试在pom.xml中使用这个spring-boot-devtools标记

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>
 </dependencies>

答案 8 :(得分:2)

我推荐Thymeleaf(模板引擎),jRebel for personal developer。 Thymeleaf模板文件只是HTML资源。因此,在编辑模板文件后,它们会立即更改。

答案 9 :(得分:1)

从1.3.0开始。 (现在在Milestone 2中),你可以使用spring-boot-devtools作为lightweigt方法 - 参见docsthis blogpost。 只需升级到&gt; = 1.3.0。并将以下内容添加到您的pom.xml:

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
  </dependency>
</dependencies>

比使用Run As启动SpringBootApplication ...你很好。

答案 10 :(得分:0)

如果您正在使用maven,那么pom.xml中的spring-boot-maven-plugin必须像这样才能获得热插拔:

  <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>

如果您使用百里香,请将其添加到您的应用程序属性中:

spring.thymeleaf.cache=false

但请记住:不要在生产环境中使用它。

答案 11 :(得分:0)

如何在Springboot应用程序中执行热交换

  1. 使用gradle时,在依赖项中包括以下内容: compile group: 'org.springframework.boot', name: 'spring-boot-devtools', version: '2.0.1.RELEASE'providedRuntime('org.springframework.boot:spring-boot-starter-tomcat')

  2. application.properties 中添加属性spring.devtools.restart.additional-paths=.

  3. 构建Gradle,然后以bootRun运行应用程序

应用程序准备好在修改类时执行热交换