我有一个Sping Boot 应用程序,我使用layertools jarmode在层中提取并运行:
MyApp
│
└───BOOT-INF
|
└-lib
| my-jar-here-that-i-manually-added.jar
│
└───META-INF
| ...
│
└───org
| ...
我如何让Sping Boot 自动从其目录中加载我的外部/手动添加的jar?
我手动添加的jar是一个用maven-assembly-plugin
构建的UberJar,我希望它被spring拾取并扫描。它里面有一个spring.factories
文件。
1条答案
按热度按时间laawzig21#
我认为关于Sping Boot 的工作原理和Java类加载的工作原理存在一些误解。
Sping Boot 查看所有声明的依赖项,并将它们捆绑到一个jar中,沿着它们自己的自定义类加载器;这将成为JVM可以加载的内容的一部分,但这不是确定的,记住这一点至关重要。
当JVM启动时,它开始通过类加载器按需加载类;在这种情况下,它将使用springs自定义类加载器。因此,spring Boot 不会“加载”jar-它以一种方便的方式使它们可用于JVM- 1 fat jar。
我的答案有几种方法可以完成你想做的事情;1是实验性的,因为我从来没有尝试过
1.将你的jar声明为一个实际的依赖项,让spring/maven/gradle正常地完成它的工作-这是我的建议。而且,即使你没有一个专用的工件存储库,你也可以配置maven和gradle将特定的文件路径视为“repo”。所以,这不是一个限制。
1.从字面上看,只需将文件放在target(maven)或lib(gradle)目录中。我不知道Sping Boot 是否只是在假设它们是正确的情况下清空dir中的所有jar,或者只删除实际声明为依赖项的jar。如果我实现它,我只会拉入声明的依赖项。
1.在运行spring Boot jar时,通过添加额外的arg直接将其添加到classpath中:
--classpath mything.jar
我推荐选择1,然后是选择3。这取决于你想达到什么目的,以及你能得到什么