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,其中包含您的应用程序需要 运行 独立运行的所有依赖项。
我正在制作我的第一个非常基本的 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
也可以添加gradle配置:
springBoot {
exectuable = true
}
注意:我对这个配置没有太多经验,但 documentation 给出了更广泛的概述。
阴影
您还可以使用名为 shadow 的 gradle 插件。
有了它,您可以构建一个 uber / fat jar,其中包含您的应用程序需要 运行 独立运行的所有依赖项。