Я использую весеннюю загрузку с докером. У меня есть статические ресурсы в проекте загрузки spring, и когда я запускаю его с помощью mvn spring: boot run, все работает нормально, и ресурсы доступны. Но когда я создаю из него образ докера, используя команду

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

Тогда мои статические ресурсы недоступны для localhost: 8080. Приложение запустилось успешно (ошибок в логах нет).

1
Alex 17 Мар 2018 в 03:06

1 ответ

Лучший ответ

Ресурсы в файле jar могут быть сложными.

Вот несколько советов по устранению неполадок:

  1. Совпадает ли URL-адрес 404 с обоими методами развертывания?

  2. Проверьте файл jar, используемый в докере, есть ли ваши ресурсы?

  3. Попробуйте запустить файл jar без докера, я подозреваю, что ваши ресурсы не хватает. Если отсутствует, вам нужно заставить maven помещать их в банку, и вы, вероятно, не следуете соглашениям Springboot для ресурсов.

Вот что сработало для меня, когда мне нужно было включить приложение полной загрузки Spring в качестве зависимости в родительское приложение:

Место нахождения

  • Ресурсы => 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)
2
thesb 17 Мар 2018 в 03:39
1
Самая сложная вещь, что все работает нормально, если я просто использую запустить эту банку без докера.
 – 
Alex
17 Мар 2018 в 12:35
Но вы правы - главное, что решает проблему, - это поместить все ресурсы в папку src / main / resources / static.
 – 
Alex
17 Мар 2018 в 14:33
У меня аналогичные проблемы с докером и ресурсами, но ресурсы загружены, поэтому их нельзя хранить в папке src/main/resources/static, если вы, ребята, поделились со мной подсказкой stackoverflow.com / questions / 61019493 /… заранее спасибо
 – 
Dimitri Kopriwa
3 Апр 2020 в 23:36