使用Spring MVC和Boot刷新静态内容

我正在评估Spring MVC&Boot和AngularJs构建Web应用程序。 我遇到了问题,当我修改我的静态内容(html,js,css)时,我不得不每次重新启动应用程序。 我希望有一个解决方法,因为重新启动整个应用程序的静态内容变化效率不高。 我试过的每个其他Web应用程序框架允许更新静态内容文件(即使只是Spring MVC和普通的旧WAR应用程序)。

我已经从“使用Spring Boot Actuator构建REST风格的Web服务”指南( http://spring.io/guides/gs/actuator-service/ )安装我的项目。 基本上它使用Spring Boot和MVC控制器来创建一个REST服务。 另外,我使用了“使用AngularJS使用REST风格的Web服务”( http://spring.io/guides/gs/consuming-rest-angularjs/ )来构建AngularJS的前端。 它创建一个显示REST服务响应的网页。 我做的唯一的改变是请求是由我的应用程序而不是“ http://rest-service.guides.spring.io/greeting ”。 我的静态内容存储在“src / main / resources / public”文件夹中。 除非不重新加载静态内容,否则此设置可以正常工作。

该文档说“所有现代的IDE允许重新加载静态资源,并通常也热切换Java类的变化”( http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#howto -hotswapping )。 这是真的。 Eclipse默认情况下或多或少,我不是一个IntelliJ用户,但从我所了解的你可以配置它自动生成。

啊…我也遇到过这个问题。

把你的静态内容放在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\resources\static下包含src\main\webapp下的所有文件。

原始问题的回顾

我遇到了问题,当我修改我的静态内容(html,js,css)时,我必须每次重新启动应用程序

我有同样的问题,并最终通过添加解决

 <configuration> <addResources>true</addResources> </configuration> 

pom.xml中的spring-boot-maven-plugin ,我被这个spring-boot-devtools的东西搞糊涂了,但是对我做的事情没有任何影响。

我的静态内容存储在“src / main / resources / public”文件夹中。

你的路很好。 src / main / resources / static也很好。

同事和我也遇到了这个问题。 我们在IntelliJ文档中找到了答案

在主菜单上,选择运行| 重新加载更改的类

我的解决方案(写在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 /”。

不要忘记尾随斜线。

我有同样的问题,在这里提出的解决方案似乎是合乎逻辑的,并为我工作breif:1- Ctrl + Shift + A 2-搜索注册表3-在打开的对话框中搜索“compiler.automake.allow.when.app。运行“并检查它http://garywaddell.com/2015/11/20/spring-boot-intellij-idea-not-reloading-static-content/

对于eclipse,你必须激活项目 – >“自动构建”选项作为最低配置。

我最终使用的是带有grunt的Browsersync 。 浏览器同步和grunt监视磁盘上的静态资源,并在编辑文件时更新浏览器。 它作为一种代理。 这样,您可以立即看到UI中的更改,无需构建或重新启动任何内容。

Grunt,browsersync,spring引导和angularjs为您配置,如果您使用JHipster ,我用来设置我的项目。

当然,这需要比IDE更多的工具,而且要复杂得多,所以我不会为每个项目推荐这个。

spring-boot-devtools 不是解决热编译静态htm / js的问题

我在intellij里面配置了一个web facet,这样当我用它来编辑resources / static里面的html / js文件时,intellij知道把更新后的文件拷贝到./target里面,而且我在里面启动的spring启动应用程序会自动显示内容

请参阅https://www.jetbrains.com/help/idea/2016.2/configuring-static-content-resources.html

@eigil为maven构建提供了addResources配置。 我在gradle build中使用了spring-boot-gradle-plugin ,并且发现了这个Spring Boot github问题 ,Spring Boot doc也提到了这个选项 。 只要添加这个指令build.gradle并运行Gradle任务bootRun ,然后资源文件保存时立即刷新。 仅供参考。

@viator的Java版本的答案是:

 @Configuration class WebMvcConfigurer extends WebMvcConfigurerAdapter { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/dist/*.js").addResourceLocations( "file:./src/main/typescript/dist/" ); } }