如何将JAR添加到Spring Boot分层lib/ dir并加载它?



我有一个Spring Boot应用程序,我使用layertools jarmode提取图层并运行:

MyApp 
│
└───BOOT-INF
|
└-lib
|  my-jar-here-that-i-manually-added.jar
│   
└───META-INF
|   ...
│   
└───org
|   ...

我如何使Spring Boot自动从其目录加载外部/手动添加的jar ?

我手动添加的jar是用maven-assembly-plugin构建的UberJar,我希望它被spring拾取和扫描。里面有一个spring.factories文件。

我认为对于Spring Boot的工作原理和java类加载的工作原理存在一些误解。

Spring boot查看所有声明的依赖项,并将它们与自己的自定义类加载器一起打包到一个jar中;jar-of-jars。然后,这将成为JVM可加载的内容的一部分,但它不是决定性的,记住这一点至关重要。

当JVM启动时,它开始通过类加载器按需加载类;在这种情况下,它将使用spring自定义类加载器。所以,弹簧引导不会加载jar -它使它们以一种方便的方式提供给JVM - 1 fat jar.

我的答案有几种方法可以让你完成你想做的事情;我是实验性的,因为我从来没有尝试过。

  1. 将你的jar声明为一个实际的依赖,让spring/maven/gradle正常工作——这是我的建议。而且,即使您没有专用的工件存储库,您也可以配置maven和gradle来将特定的文件路径视为"报告"。所以,这不是一个限制。
  2. 直接将文件放到目标(maven)或lib (gradle)目录中。我不知道Spring引导是否只是在假设它们是正确的情况下清空目录中的所有jar,还是只清空实际声明为依赖项的jar。如果我要实现它,我只会拉入声明的依赖。
  3. 当你运行spring启动jar时,直接添加一个额外的参数:--classpath mything.jar

我推荐选项1,然后是选项3。这取决于你想要达到什么目标,以及你能获得什么