【问题标题】:Spring Boot returns 404 for static resources with dockerSpring Boot 使用 docker 为静态资源返回 404
【发布时间】:2018-08-26 03:10:28
【问题描述】:

我正在使用带有 docker 的 spring boot。我在 spring boot 项目中有静态资源,当我使用 mvn spring:boot run 运行它时,一切正常并且资源可用。但是当我使用命令从它创建 docker 图像时

FROM openjdk:8-jdk-alpine
ADD /target/example-*.jar /
EXPOSE 8080
ENTRYPOINT java -jar example-*.jar

那么我的静态资源在 localhost:8080 是不可用的。应用程序启动成功(日志中没有错误。)

【问题讨论】:

    标签: java angular docker spring-boot


    【解决方案1】:

    jar 文件中的资源可能很棘手。

    以下是一些疑难解答提示:

    1. 两种部署方法的 404 的 url 是否相同?

    2. 检查docker中使用的jar文件,你的资源还在吗?

    3. 尝试在没有 docker 的情况下运行 jar 文件,我怀疑你的资源 缺失。如果丢失,您需要让 maven 将它们推送到 jar 中,并且您可能没有遵循 springboot 的资源约定。

    当我需要将完整的 springboot 应用程序作为依赖项包含在父应用程序中时,这对我有用:

    位置

    • 资源 => src/main/resources/META-INF/resources/static
    • 查看模板 => src/main/resources/WEB-INF/templates

    如果是 MVC,请确保映射资源:

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/static/**").addResourceLocations("classpath:META-INF/resources/static/");
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:META-INF/resources/webjars/");
        registry.addResourceHandler("/**").addResourceLocations("classpath:META-INF/");
    }
    

    还需要对我的 gradle 版本进行一些更改:

    buildscript {
        ext {
            springBootVersion = '2.0.0.M7'
        }
        repositories {
            mavenCentral()
            maven { url "https://repo.spring.io/snapshot" }
            maven { url "https://repo.spring.io/milestone" }
            maven { url 'http://repo.spring.io/plugins-release' }
        }
        dependencies {
            classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
            classpath 'io.spring.gradle:propdeps-plugin:0.0.9.RELEASE'
            classpath 'org.springframework:springloaded:1.2.6.RELEASE'
        }
    }
    
    ext {
        springBootVersion = '2.0.0.M7'
    }
    apply plugin: 'java'
    apply plugin: 'eclipse'
    apply plugin: 'idea'
    apply plugin: 'groovy'
    //apply plugin: 'org.springframework.boot'
    apply plugin: 'io.spring.dependency-management'
    apply plugin: 'propdeps'
    apply plugin: 'propdeps-idea'
    
    group = 'com.example.app'
    
    sourceCompatibility = 1.8
    
    repositories {
        mavenCentral()
        maven { url "https://repo.spring.io/snapshot" }
        maven { url "https://repo.spring.io/milestone" }
    }
    
    configurations {
        includeInJar
    }
    
    dependencies {
        compile('org.springframework.boot:spring-boot-starter-data-jpa')
        compile('org.springframework.boot:spring-boot-starter-web')
        compile('org.springframework.boot:spring-boot-starter-groovy-templates')
        compile('org.codehaus.groovy:groovy')
    
        includeInJar("org.webjars:bootstrap:4.0.0")
        includeInJar("org.webjars:jquery:3.3.1")
        configurations.compile.extendsFrom(configurations.includeInJar)
    }
    
    idea {
        module {
            inheritOutputDirs = true
        }
    }
    
    jar {
        from configurations.includeInJar.collect { it.isDirectory() ? it : zipTree(it) }
    }
    
    compileJava.dependsOn(processResources)
    

    【讨论】:

    • 最棘手的事情是,如果我只使用在没有 docker 的情况下运行这个 jar,一切正常。
    • 但你是对的 - 解决问题的主要方法是将所有资源放在 src/main/resources/static 文件夹下。
    • 我在 docker 和资源方面也有类似的问题,但是资源已上传,因此无法将其存储在 src/main/resources/static 文件夹中,如果你们对我有线索 stackoverflow.com/questions/61019493/… 提前谢谢跨度>
    猜你喜欢
    • 2016-10-01
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    • 2017-12-05
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多