我正在评估Spring MVC&用于构建Web应用程序的Boot和AngularJs。我遇到的问题是,当我对静态内容(html,js,css)进行修改时,我每次都必须重新启动应用程序。我希望有一种方法可以解决这个问题,因为重新启动静态内容更改的整个应用程序效率不高。我尝试过的每个其他Web应用程序框架都允许动态更新静态内容文件(即使只是Spring MVC和普通的旧WAR应用程序)。
我从“使用Spring Boot Actuator构建RESTful Web服务”指南(http://spring.io/guides/gs/actuator-service/)设置了我的项目。基本上它使用Spring Boot和MVC控制器来创建REST服务。另外,我使用“使用AngularJS使用RESTful Web服务”指南(http://spring.io/guides/gs/consuming-rest-angularjs/)来构建AngularJS的前端。它创建一个显示REST服务响应的网页。我所做的唯一更改是请求发送到我的应用程序而不是“http://rest-service.guides.spring.io/greeting”。我的静态内容存储在“src / main / resources / public”文件夹中。此设置正常工作,但不会重新加载静态内容。
答案 0 :(得分:29)
回顾原始问题
我遇到的问题是,当我修改静态内容(html,js,css)时,我每次都要重启应用程序
我遇到了同样的问题,最后通过添加
解决了这个问题<configuration>
<addResources>true</addResources>
</configuration>
<{1}}中的{p}到spring-boot-maven-plugin
我对这个spring-boot-devtools事情感到困惑,但无论我做什么都没有效果。
我的静态内容存储在&#34; src / main / resources / public&#34;文件夹中。
你的道路很好。 src / main / resources / static也没关系。
答案 1 :(得分:26)
啊......我也遇到过这个问题。
不要将静态内容放在classpath src/main/resources/public
文件夹中,而是将它们放在src/main/webapp
中,与其他任何Java Web应用程序相同。嵌入式Tomcat会在它们发生变化时自动重新加载。
如评论中所述,默认配置不包括src\main\webapp
中的资源。要解决此问题,您只需将以下内容添加到pom.xml <build>
节点:
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>copy-resources</id>
<phase>validate</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${basedir}/target/classes/static</outputDirectory>
<resources>
<resource>
<directory>src/main/webapp</directory>
<filtering>true</filtering>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
通过使用资源插件,您可以通过运行可执行文件JAR来进行本地开发:
java -jar target / .jar
当它正在运行时,您可以使用Chrome开发工具或您喜欢的任何IDE来修改文件,而无需重新启动。但是,无论何时运行构建,生成的包都将包含src\main\webapp
中src\main\resources\static
下的所有文件。
答案 2 :(得分:12)
文档说&#34;所有现代IDE都允许重新加载静态资源,通常还有Java类更改的热插拔。 (https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/html/howto.html#howto-hotswapping)。这是真的。 Eclipse默认情况下或多或少都会这样做,而且我不是IntelliJ用户,但据我所知,您可以将其配置为自动构建。
答案 3 :(得分:8)
我和一位同事也遇到了这个问题。我们在IntelliJ documentation ...
中找到了答案在主菜单上,选择运行|重新加载更改的课程
答案 4 :(得分:4)
我的解决方案(用Kotlin编写,但非常明显):
@Controller
class WebController : WebMvcConfigurerAdapter() {
override fun addResourceHandlers(registry: ResourceHandlerRegistry) {
System.getProperty("resources.local.path")?.let {
registry.addResourceHandler("/**").addResourceLocations(it)
}
}
...
}
主要思想是您可以有条件地添加自己的资源处理程序。例如。如果设置了某个系统属性( resources.local.path ),则使用属性中的值添加资源位置。然后在开发中使用一些合理的值设置此属性,例如'-Dresources.local.path = file:/ Users / andrey / Projects / gsp-test / src / main / resources / static /'.
不要忘记尾随斜杠。
答案 5 :(得分:2)
我有同样的问题,这里提出的解决方案似乎合乎逻辑,对我有用 在breif: 1- ctrl + shift + A. 2-搜索注册表 3-在打开的对话框中搜索&#34; compiler.automake.allow.when.app.running&#34; 并检查它 http://garywaddell.com/2015/11/20/spring-boot-intellij-idea-not-reloading-static-content/
答案 6 :(得分:1)
对于eclipse,你必须激活项目 - &gt; &#34;自动构建&#34;选项作为最低配置。
答案 7 :(得分:1)
我最终使用的是Browsersync with grunt。 browsersync和grunt监视磁盘上的静态资源,并在编辑文件时更新浏览器。它充当一种代理。这样,您可以立即看到UI中的更改,而无需构建或重新启动任何内容。
如果您使用我用于设置项目的JHipster,则会为您配置Grunt,browsersync,spring boot和angularjs。
当然,这需要比IDE更多的工具,而且要复杂得多,所以我不建议每个项目使用它。
答案 8 :(得分:1)
spring-boot-devtools 不编辑静态htm / js的“热部署”解决方案
我在intellij中配置了一个web facet,这样当我用它来编辑resources / static里面的html / js文件时,intellij就知道将更新的文件复制到./target和我自动启动的spring boot应用程序显示该内容
见 https://www.jetbrains.com/help/idea/2016.2/configuring-static-content-resources.html
答案 9 :(得分:1)
@eigil为maven build提到addResources
配置。我在gradle构建中使用spring-boot-gradle-plugin
,我发现了Spring Boot github issue
和Spring Boot doc mentioned this option too。只需将此指令添加到build.gradle并运行Gradle任务bootRun
,然后资源文件在保存时立即刷新。 FYI。
答案 10 :(得分:1)
@viator的Java版本答案:
@Configuration
class WebMvcConfigurer extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/dist/*.js").addResourceLocations(
"file:src/main/typescript/dist/"
);
}
}
答案 11 :(得分:1)
我正在使用1.5.8.RELEASE。
它会立即更新我的更改,尤其是静态文件或jsp文件。
如果您正在使用Maven。您需要在pom.xml中添加它
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
你必须用这个开始Spring Boot:
mvn clean spring-boot:run
此处的完整示例和更多详细信息https://www.surasint.com/spring-boot-with-auto-update-changed-files-example/
答案 12 :(得分:1)
你可以通过添加一个依赖
来实现你Gradle
compile group: 'org.springframework.boot', name: 'spring-boot-devtools', version: '1.3.0.RELEASE'
在你的Pom.xml中
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<version>1.3.0.RELEASE</version>
</dependency>
答案 13 :(得分:0)
您有两种可能性来提供静态网页内容
如果选择解决方案1)-您可以安全地复制jar,因为静态Web内容位于该jar中。如果希望服务器提取更改,则需要进行(自动)热交换。
如果选择解决方案2)-一切将立即可用,则所有更改都将自动进行。但是-如果将最终的jar复制到其他位置-一切都会停止。除非您在application.properties
中指定绝对路径。例如:
spring.resources.static-locations=file:///C:/myspringbootapp/src/main/webapp
因此,解决方案2)比较容易,但便携性较差。解决方案1)是便携式的,但使用起来更困难(ide config)。
答案 14 :(得分:0)
对于带有Gradle Kotlin dsl的Spring Boot 2 +:
tasks.bootRun {
sourceResources(sourceSets.getAt(SourceSet.MAIN_SOURCE_SET_NAME))
}
感谢gradle dsl版本的@briskr回答:)
答案 15 :(得分:0)
我在 SpringBoot 项目中实时重新加载静态内容时遇到了同样的问题:现在从 StackOverflow 中发布的各种解决方案中,我能够得到解决方案。以下是我用于开发的工具: Ubuntu 18.04 中的 IntelliJ Idea 和 Google Chrome 我做了以下事情:
<addResources>true</addResources>
</configuration>
到 POM 文件中的 spring-maven-plugin。
3.请不要忘记将此依赖添加到 POM 文件中
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
将 Live Reload 扩展程序添加到您的网络浏览器。
使用“ mvn clean spring-boot:run ”重新启动服务器(只有这样更改才会反映在构建中)。在服务器启动期间,您可以看到消息 Live Server started at ....
使用 localhost:8080/... 加载页面,然后单击 LiveReload 扩展以将其与服务器连接。
对资源/模板文件夹中的静态 HTML 文件进行任何更改。保存并再次检查网络浏览器,它会在那里反映出来...