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

Posted

技术标签:

【中文标题】Docker:图像无法运行:在 META-INF/spring.factories 中找不到自动配置类【英文标题】:Docker: image won't run : No auto configuration classes found in META-INF/spring.factories 【发布时间】:2022-01-08 14:46:21 【问题描述】:

我正在使用 Spring Boot 和 Gradle 制作我的第一个非常基本的 Docker 映像。 当我尝试运行它时,我收到以下错误:@ 987654323@

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

这是我的主课

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()

这是我的 Dockerfile :

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 建议在this tutorial

我知道观看 youtube 教程并不总是最聪明的方式,但我发现找到一个关于所有这些如何协同工作的直截了当的解释让人不知所措。我浏览过类似的帖子,但都有非常具体的构建,使用 pom。 xml 文件或几年前发布的。

【问题讨论】:

如果您尝试在构建后直接在系统上运行 jar,会发生什么情况? 命令提示符返回Error: Unable to access jarfile moescrud.jar。我将重建 jar 并再试一次! 这可能与权限错误或在您的系统上使用不兼容的 java 版本有关。但这可能与您的 docker 问题不是同一个问题。 【参考方案1】:

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

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

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

春季开机方式

你可以使用命令./gradlew bootJar构建一个可执行的jar

也可以添加gradle配置:

springBoot 
  exectuable = true

注意:我对此配置没有太多经验,但documentation 提供了更广泛的概述。

阴影

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

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

【讨论】:

感谢您分享@CrudeCode!我刚刚在我的项目中杀死了一些婴儿,并将尝​​试一下。 (对于它的价值,我没有 15 分来支持您的答案,否则我已经这样做了。对于阅读本文的人,这些是非常有用的文档,如果您也遇到困难,我建议您检查一下!) 测试后,如果它可以解决您的问题,您可以随时accept my answer。 :) 我接受了您的回答作为解决方案。仅供参考,我删除了以上所有内容,并采用了 composer.jar 方法。老实说,我希望我早点知道作曲家。再次感谢您投入时间使用粗代码!非常感谢。

以上是关于Docker:图像无法运行:在 META-INF/spring.factories 中找不到自动配置类的主要内容,如果未能解决你的问题,请参考以下文章

用于 php 的 docker 映像无法在 Windows 10 的浏览器上运行

错误:使用 gradle 运行 JMH 时无法找到资源:/META-INF/BenchmarkList

由于出现此错误,无法运行 docker 容器:无法访问 jarfile app.jar

META-INF/persistence.xml 无法打开,因为它不存在

Proguard 警告“无法写入资源 [META-INF/MANIFEST.MF](重复的 zip 条目)”

无法连接到在 docker 中运行的 MySQL