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

时间:2014-07-15 15:49:04

标签: java spring-mvc spring-boot

我正在评估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”文件夹中。此设置正常工作,但不会重新加载静态内容。

16 个答案:

答案 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\webappsrc\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. 从类路径(默认为src / main / resources / static                     或src / main / resources / public或META-INF / resources /)
  2. 从文件系统(默认为src / main / webapp)

如果选择解决方案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 我做了以下事情:

  1. 将模板文件夹保存在资源文件夹中。 (有的解决方案我发现它保存在main下的webapp文件夹中,但我没有得到结果)
  2. 添加此配置
    <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>
  1. 将 Live Reload 扩展程序添加到您的网络浏览器。

  2. 使用“ mvn clean spring-boot:run ”重新启动服务器(只有这样更改才会反映在构建中)。在服务器启动期间,您可以看到消息 Live Server started at ....

  3. 使用 localhost:8080/... 加载页面,然后单击 LiveReload 扩展以将其与服务器连接。

  4. 对资源/模板文件夹中的静态 HTML 文件进行任何更改。保存并再次检查网络浏览器,它会在那里反映出来...