spring.resources.static-locations不使用devtools

时间:2017-06-17 18:59:43

标签: java spring spring-boot

我有一个具有以下结构的项目(就像spring.io):

├── frontend
│   ├── dist
│   |   ├── app.js
│   |   ├── vendor.js
│   |   ├── style.css
│   |   ├── index.html
│   ├── node_modules
│   ├── src
│   ├── package.json
│   ├── pom.xml
├── site
│   ├── src
│   ├── pom.xml

frontend是一个NodeJS项目,site是一个Spring Boot项目。

frontend/dist内的所有文件(包括html)都是由webpack自动生成的。为了访问 他们来自Spring Boot app我配置了开发资料。

application.yml

spring:
  profiles: development
  resources:
    static-locations:
      - file:../frontend/dist/

一切正常。但是,当我将spring-boot-devtools添加到站点项目类路径中时,我为dist文件夹中的任何文件获取404。

http://localhost:8080/ -> 404
http://localhost:8080/app.js -> 404

同样,没有devtools - 没问题。

此外,如果我用addResourceHandlers替换静态位置,它也可以工作(无论是否使用devtools)。

public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/**")
            .addResourceLocations("file:/full/path/to/frontend/dist/");
}

这是一个devtools错误还是我的错?

更新

好的,谢谢@AndyWilkinson,我已经找到了问题的原因。我在IntelliJ中工作并使用运行配置来设置env变量。以下是生成的命令行:

/usr/lib/jvm/java-8-oracle/bin/java -bla-bla-bla -Didea.version=2017.1.3 -T 2 -Dspring.profiles.active=dev spring-boot:run

但是如果devtools在项目类路径中,Spring Boot会忽略它们:

Could not find key 'spring.profiles.active' in any property source
No active profile set, falling back to default profiles: default

现在,如果我只是从pom.xml中删除devtools

The following profiles are active: dev
Activated profiles dev

......哇,它再次起作用。

可能的解决方法是直接通过application.yml设置活动配置文件。

spring:
  profiles:
    active: dev

---

spring:
  profiles: dev
  resources:
    static-locations:
      - file:../frontend/dist/

..但我不喜欢它,因为它不方便。

因为devtools是如此痛苦,我想我会像以前一样使用F5。

2 个答案:

答案 0 :(得分:0)

我有类似的问题。

我在spring.resources.static-location=file:../frontend/build

中添加了application.properties

使用也可以添加绝对路径

spring.resources.static-location=file:/User/XYZ/Desktop/frontend/build

答案 1 :(得分:0)

还配置InternalResourceViewResolver来解析静态资源:

public ViewResolver viewResolver() {
    InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
    viewResolver.setPrefix("/WEB-INF/classes/static/");
    viewResolver.setSuffix("");
    return viewResolver;
}