我已经有一段时间没有使用spring了,我正在尝试使用spring boot开发工具来执行热重载。我已从 start.spring.io 项目生成器导入了 Web 和 Spring Boot 依赖项,并为“/hello”创建了 uri。我可以运行该项目,但更改 uri 值不会热重载,并且我不相信热重载正在工作。根据我在互联网上搜索的结果,唯一必要的步骤是在 pom 文件中添加热重载依赖项:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
我的整个pom.xml文件如下(从start.spring.io网站生成):
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.java</groupId>
<artifactId>java_app</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>java_app</name>
<description>Web Project</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
我的网络uri文件如下(可以工作,但没有热重载):
package com.java.java_app;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class JavaAppApplication {
public static void main(String[] args) {
SpringApplication.run(JavaAppApplication.class, args);
}
@GetMapping("/hello")
public String hello(@RequestParam(value = "name", defaultValue = "World") String name){
return String.format("Hello %s!", name);
}
}
这是一个我认为可以构建的简单应用程序,所以我很困惑需要哪些额外的必要步骤才能使热重载工作。除了添加依赖项之外,这里似乎没有记录(https://www.baeldung.com/spring-boot-devtools)。如果重要的话我正在运行 ubuntu 20.04。
编辑:
我正在端口 :8080 上的终端中运行应用程序,并在应用程序运行时使用 vim 修改 uri 文件。由于 java 有很多适用于各种 IDE 的插件,有人建议值得一提。
如果您没有使用 IDE,您可以使用
./mvnw compile
,项目将在编辑器运行时重新编译。
如果您不使用 IDE,有一种方法可以进行热重载
对于 vim 用户
// Add below into your ~/.vim/ftplugin/java.vim
function! SearchFileBackwards(fn)
let fp = expand('%:p')
let pos = len(fp) - 1
while pos > 0
let pom = ""
if fp[pos] == '/'
let pom = strpart(fp, 0, pos + 1) . a:fn
if filereadable(pom)
break
endif
endif
let pos = pos - 1
endwhile
return pom
endfunction
function! BuildMavenProject()
let pom = SearchFileBackwards("pom.xml")
if pom != ""
exec '!mvn -f '.SearchFileBackwards("pom.xml").' compile'
else
echohl WarningMsg | echo "No pom.xml found." | echohl None
endif
endfunction
" comment out below line to enable automatic build on maven project.
" autocmd BufWritePost *.java :call BuildMavenProject()
" Press <F8> to build current maven project.
nnoremap <buffer> <silent> <F8> :call BuildMavenProject()<CR>
如果您使用 nvim,这里是代码
// this file should be created in ~/.config/nvim/ftplugin/java.lua
function SearchFileBackwards(fn)
local fp = vim.fn.expand('%:p')
local pos = #fp
local pom = ""
while pos > 0 do
if fp:sub(pos, pos) == '/' then
pom = fp:sub(1, pos) .. fn
if vim.fn.filereadable(pom) == 1 then
break
end
end
pos = pos - 1
end
return pom
end
function BuildMavenProject()
local pom = SearchFileBackwards("pom.xml")
if pom ~= "" then
vim.fn.system('mvn -f ' .. pom .. ' compile')
else
vim.api.nvim_echo({{ "No pom.xml found.", "WarningMsg" }}, true, {})
end
end
vim.api.nvim_buf_set_keymap(0, "n", "<F8>", ":lua BuildMavenProject()<CR>", { silent = true })
vim.api.nvim_command('autocmd BufWritePost *.java lua BuildMavenProject()')