0

我的问题类似于此处描述的问题(我没有明确覆盖类路径): Spring application.yml not detected when running with -classpath

我有一个 SpringBoot 应用程序,该应用程序生成具有重新打包目标的可执行app.jar。我在backend.jar的根上下文中有application.yml ,它是app.jar的依赖项。我可以通过 MainClass 从 IDEA 成功运行应用程序:

SpringApplication.run(MyApp.class, args);

我可以从终端成功运行应用程序:

java -jar app.jar

但是,当我像CloudFoundry那样在本地运行它时,应用程序无法从 application.yml 进行配置:

unzip app.jar
java org.springframework.boot.loader.JarLauncher

Spring 将启动并提供静态内容,但在第一次尝试访问需要配置数据的任何内容时失败。

我已经阅读了文档,但我无法弄清楚类路径有什么问题。从 MANIFEST.INF 我假设java -jar app.jar执行与上面第三个示例中相同的类。

感谢您的想法。

4

1 回答 1

0

原来这是一个类路径问题(呃!)。

我们在依赖项 Y 中有一个“被遗忘的”空 application.yml,在依赖项 X 中有一个实际有效的 application.yml。与类类似,类加载器仅加载类路径上第一次出现的资源。

在启用 spring 调试日志并检查ClasspathLoggingApplicationListener输出后,可以看到 fatjar 中依赖项的类路径顺序对于所描述的用例而言是不同的。

对于java -jar嵌套的 JAR 命令似乎是散列的。对于JarLauncher,它是按字母顺序排列的。

使这一点保持一致的现有请求:https ://github.com/spring-projects/spring-boot/issues/9128

于 2017-09-20T12:08:09.463 回答