Docker:图像不会 运行:在 META-INF/spring.factories 中找不到自动配置 类

Docker: image won't run : No auto configuration classes found in META-INF/spring.factories

我正在制作我的第一个非常基本的 Docker 图像,带有 Spring 引导和 Gradle.

当我 运行 时出现以下错误:
No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.

02:33:59.843 [main] ERROR org.springframework.boot.SpringApplication - Application run failed
java.lang.IllegalArgumentException: No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct. 
        at org.springframework.util.Assert.notEmpty(Assert.java:470)
        at org.springframework.boot.autoconfigure.AutoConfigurationImportSelector.getCandidateConfigurations(AutoConfigurationImportSelector.java:180)
        at org.springframework.boot.autoconfigure.AutoConfigurationImportSelector.getAutoConfigurationEntry(AutoConfigurationImportSelector.java:123)
        at org.springframework.boot.autoconfigure.AutoConfigurationImportSelector$AutoConfigurationGroup.process(AutoConfigurationImportSelector.java:434)
        at org.springframework.context.annotation.ConfigurationClassParser$DeferredImportSelectorGrouping.getImports(ConfigurationClassParser.java:879)
        at org.springframework.context.annotation.ConfigurationClassParser$DeferredImportSelectorGroupingHandler.processGroupImports(ConfigurationClassParser.java:809)    
        at org.springframework.context.annotation.ConfigurationClassParser$DeferredImportSelectorHandler.process(ConfigurationClassParser.java:780)
        at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:193)
        at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:331)
        at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:247)
        at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:311)    
        at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:112)
        at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:746)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:564)
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145)
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:730)
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:412)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:302)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1301)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1290)
        at be.dennisvn.demo.MoesCrudApplication.main(MoesCrudApplication.java:13)
02:33:59.875 [main] DEBUG org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext - Closing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@d6da883, started on Thu Dec 02 02:33:59 UTC 2021


这是我的主class

package be.dennisvn.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MoesCrudApplication {

    public static void main(String[] args) {
        SpringApplication.run(MoesCrudApplication.class, args);
    }
}

这是我的 build.gradle :

plugins {
    id 'org.springframework.boot' version '2.6.0'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
    id 'com.palantir.docker' version '0.22.1'
}

group = 'be.dennisvn'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

docker {
    name "crudformoes"
    dockerfile file('Dockerfile')
    copySpec.from(jar).rename(".*","app.jar")
    buildArgs(['JAR_FILE': "app.jar"])
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-websocket'
    compileOnly 'org.projectlombok:lombok'
    runtimeOnly 'org.postgresql:postgresql'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
    useJUnitPlatform()
}

这是我的Docker文件:

FROM openjdk:17.0.1
ADD MoesCrud.jar MoesCrud.jar
EXPOSE 9090
ENTRYPOINT ["java", "-jar","MoesCrud.jar"]

除了在其他线程上尝试大多数建议外,我还尝试删除 id 'com.palantir.docker' version '0.22.1',因为我认为是插件导致的。但它也没有解决错误。Source of the plugin as recommended in this tutorial

我知道观看 youtube 教程并不总是最明智的方法,但我发现很难找到关于所有这些工作原理的直接解释 together.I 经历了类似的帖子,但都有非常具体的构建,使用 pom.xml 文件或多年前发布的文件。

这让我想起了我曾经犯过的类似错误。 gradle 构建只考虑项目中的源文件。它在生成的 jar 文件中不包含其他依赖项。

所以这基本上意味着,您的项目需要的每个依赖项都不存在。

要解决这个问题,您必须构建一个可执行 jar/fat jar。

Spring开机方式

您可以使用命令 ./gradlew bootJar

构建可执行 jar

也可以添加gradle配置:

springBoot {
  exectuable = true
}

注意:我对这个配置没有太多经验,但 documentation 给出了更广泛的概述。

阴影

您还可以使用名为 shadow 的 gradle 插件。

有了它,您可以构建一个 uber / fat jar,其中包含您的应用程序需要 运行 独立运行的所有依赖项。