在开始解释我的问题之前,值得一提的是,虽然我正在尝试将 Maven Jib 插件与 Spring Boot 和 Kubernetes 结合使用,但即使我尝试使用普通的 docker,问题也是一样的。
我使用 Kubernetes configMap 创建了 application.yml 文件并将其作为外部文件挂载到 Pod ( /config/application.yml
)。我一直面临的问题是我的应用程序无法找到该application.yml
文件并抛出一个典型的异常:
ERROR [main] org.springframework.boot.SpringApplication: Application run failed
org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [com.example.Application]; nested exception is java.io.FileNotFoundException: class path resource [application.yml] cannot be opened because it does not exist
通过使用不同的参数,我尝试了不同的方法来使用 Jib,如下所示。
<container>
<extraClasspath>/config/*</extraClasspath>
<args>
<arg>--spring.config.location=file:/config/application.yml</arg>
</args>
<jvmFlags>
<jvmFlag>-Dspring.config.location=classpath:/,classpath:/config/,file:./,file:./config/,file:/config/</jvmFlag>
</jvmFlags>
</container>
他们都没有为我工作。我也尝试使用SPRING_CONFIG_NAME
环境变量并将其设置file:/config/application.yml
为 pod,但仍然是同样的问题。
我可以验证配置文件是否存在于指定位置并且没有权限问题(据我所知)。
application.yml
有趣的是,当我在默认类路径中只创建一个空文件时,(src/main/resources)
它通过了第一次验证并且应用程序成功加载(使用来自 的实际值/config/application
),所以无论是什么问题,它都会受到之前 Spring Boot 初始验证的影响甚至将应用程序文件传递给相应的类。