Spring-boot内部jar文件加载顺序?(嵌入式Tomcat)

Vla*_*lad 4 java tomcat spring-boot

我有一个带有嵌入式 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/等)


更新:许多响应者表示,它按照它们在 fat jar 中出现的确切顺序获取内罐(因此至少 QA 和 PROD 对于同一个 fat jar 应该表现相同的方式,这与非 spring-boot .war 应用程序不同)。

现在我想知道在创建/打包罐子的过程中我们是否有任何机制来保存/强制/指定内部罐子的顺序?(maven/gradle/...)

And*_*son 7

中的 jar始终按照它们在 jar 中出现的顺序添加到 Spring Boot\xe2\x80\x99s 类加载器BOOT-INF/lib中。这意味着,如果您在多个 jar 中声明了相同的类文件或资源,则无论操作系统、Java 版本等如何,相同的类文件或资源始终会在应用程序的多次运行中获胜。即使您正在使用Spring Boot 支持在运行时自动解压某些 jar

\n

Spring Boot 还在它构建的每个 jar 中打包了一个BOOT-INF/classpath.idx索引文件。它列出了所有嵌套的 jar,“按照它们应添加到类路径的顺序”。如果您解压缩 jar 文件,以便BOOT-INF/lib文件系统对 jar 文件进行排序,如果您继续使用 Spring BootJarLauncher来启动应用程序,它将遵循索引中的顺序

\n

Spring Boot 包含测试,例如这些测试,用于验证类路径的顺序,无论是在使用 启动应用程序时java -jar还是使用java org.springframework.boot.loader.JarLauncher.

\n

  • 我已经充实了一些内容。FWIW,我是 Spring Boot 团队的成员,我们不打算停止遵守“BOOT-INF/lib”中 jar 的顺序。我们知道类路径的顺序可能很重要,这就是为什么我们确保它是可预测和可重复的。 (2认同)