Spring Boot中的热插拔

Amn*_*non 41 java eclipse spring intellij-idea spring-boot

我一直在用Spring Boot做POC.

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

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

Dav*_*yer 24

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

不再推荐使用Spring Loaded,但可能仍在使用中.如果您需要零延迟的热交换(例如JRebel),更复杂的基于代理的工具可以更好地工作.

查看文档以获取最新内容

  • 我没有意识到只要在调试模式下启动就可以让STS热重载`.class`文件.谢谢! (2认同)

Fre*_*d K 7

你可以进行热交换:

  • 对于java代码:使用spring-loaded
  • 对于Thymeleaf模板:禁用缓存

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


Igo*_*gor 6

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

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

我的maven运行配置项配置如下:

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

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

而已。


sha*_*bby 6

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

在IntelliJ 15.0,Windows 10中帮助我的是以下顺序:

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

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-devtools</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)

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

启用自动生成项目.单击"确定"并关闭对话框

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

compiler.automake.allow.when.app.running
Run Code Online (Sandbox Code Playgroud)

并启用它,单击关闭

第4步:重新启动IDE

从这个来源阐述

  • 这只是在保存文件时重新启动 SpringBoot 还是? (2认同)
  • 是的,但是当我保存它时,它会从头开始重新启动 SpringBoot。我只是想对更改为加载的类进行分类。 (2认同)

Jak*_*ski 5

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


ast*_*ere 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"
Run Code Online (Sandbox Code Playgroud)

使用命令从IDE或命令行运行应用程序 gradle build run

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

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


Dav*_*mes 5

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

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

我的环境/设置包括:
Intellij 13
嵌入式Tomcat
运行/调试配置类型'Application'(它只使用一个主类)
提供静态html,css和js(没有jsp)


Vip*_*ane 5

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

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>
 </dependencies>
Run Code Online (Sandbox Code Playgroud)

http://mytechnologythought.blogspot.com/2017/07/how-to-run-server-of-spring-boot-auto.html