【发布时间】:2021-08-31 22:44:38
【问题描述】:
我有一个带有嵌入式 tomcat (tomcat-embed-core-8.5.57.jar) 的 spring-boot "fat" jar (1.5.22)。
在 jar 内部 - 在 BOOT-INF/lib 下有许多“内部”jar。
类加载器按什么顺序加载这些内部 jar?
如果我在多台计算机上运行 java -jar myFatSpringBoot.jar - 内罐会以完全相同的顺序被拾取,还是 “依赖” 取决于每台计算机上的某些东西? (FS/tmpfs/java/等)
更新:许多响应者表示它会按照它们在胖罐中出现的确切顺序来使用内罐(因此至少 QA 和 PROD 对于同一个胖罐的行为方式应该相同,不像它用于非 spring-boot .war 应用程序)。
现在我想知道在创建/包装罐子的过程中,我们是否有任何机制来保留/强制执行/指定内罐子的顺序? (maven/gradle/...)
【问题讨论】:
-
为什么这很重要?外部库的静态初始化器之间是否存在竞争条件?
-
@geanakuch - 由于 WEB-INF/lib 加载的字母数字顺序(范式与较新的 tomcats),然后有其他应用程序由于许多 jar 中的相同名称而发生意外的类冲突 - 测试在 QA 上通过了很好的测试,但在少数 PROD 主机上失败了(因为在 .war-unpack 期间顺序依赖于 FS),使得确保我们可以避免 SpringBoot 的 QA-vs-PROD 问题,更多信息请参见:stackoverflow.com/questions/67710064/…
标签: java spring-boot tomcat