我如何告诉 Spring Boot 将一些 类 放在 jar 的根目录而不是 BOOT-INF?

How can I tell Spring Boot to place some of the classes at the root of the jar instead of BOOT-INF?

我正在尝试在我的 Spring 引导(版本 2.6.3)应用程序中设置自定义日志 Handler。结果是 ClassNotFound 如另一个问题

中所述

根据该问题的答案,我似乎需要将我的 Handler 及其所有依赖项放入可执行 jar 的根目录中。

在 Maven 构建期间是否有直接的方法来完成此操作,即不是通过自己提取和重新打包 jar post-build?

此问题是由 Spring Boot 1.4 引入的 BOOT-INF fat jar 结构导致的。

目前没有直接的解决方案,而且一些 Spring 引导维护者似乎不同意存在问题,因此情况改变可能需要很长时间:

解决方法 #1

我必须做两件事才能让我的应用程序再次使用自定义日志处理程序。 1) 使用 Maven Shade 打包日志处理程序及其所有依赖项,以及 2) 在命令行中使用 PropertiesLauncher class 启动应用程序,而不是使用 java -jar:

java -cp executable.jar:logger-shaded.jar -Dloader.main=mypackage.myapp org.springframework.boot.loader.PropertiesLauncher

executable.jarlogger-shaded.jarmypackage.myapp 是我的项目特有的占位符,因此请相应地进行调整。

解决方法 #2

如果处理程序是从配置 class 或 main() 中的代码加载的,而不是在通过 java.util.logging.config.file 加载的文件中指定的,如对答案的评论中所述在 中,然后一切都按预期工作。实际上,我更喜欢这个解决方案 #1,因为它会导致更小的部署,但它确实需要编写更多代码行。