带有类路径的 Spring Boot 可执行 Jar

2022-09-02 19:54:21

我正在构建一个软件系统,以使用Spring Boot与企业软件系统进行交互。我的系统依赖于该企业系统中的一些jar和*.ini文件,因此我无法在Maven中打包所有依赖项。我希望能够运行Spring Boot作为嵌入式Tomcat的可执行Jar。我还希望能够通过命令行设置类路径。所以像这样:

java -classpath /home/sleeper/thirdparty/lib -jar MyApp.jar

但是,-classpath 和 -jar 不能共存。我试过“-Dloader.path”。它能够加载文件夹下的所有jar文件,但不能加载其他内容,例如文件夹中的*.ini文件。

那么有没有办法让 -classpath 与带有嵌入式 Tomcat 的 Spring 可执行 jar 一起使用呢?


答案 1

如果只想添加外部库,则可以使用该属性。loader.path

java -Dloader.path="your-lib/" -jar your-app.jar

更新

如果还需要从类路径中读取其他文件,则必须创建/更改应用程序的清单文件。

让我们假设您正在从类 中初始化 Spring Boot 上下文。您的应如下所示:de.app.ApplicationMANIFEST.MF

Manifest-Version: 1.0
Main-Class: de.app.Application
Class-Path: your-lib/

您可以简单地使用 启动您的应用程序。java -Dloader.path="your-lib/" -jar MyApp.jar

有关清单的详细信息。MF 请参阅使用清单文件:基础知识


答案 2

在 Linux 上:

java -cp MyApp.jar:/home/sleeper/thirdparty/lib -Dloader.main=myMainApplicationClass org.springframework.boot.loader.PropertiesLauncher

在视窗上:

java -cp MyApp.jar;/home/sleeper/thirdparty/lib -Dloader.main=myMainApplicationClass org.springframework.boot.loader.PropertiesLauncher

这将避免像其他答案那样弄乱清单或Spring Boot Maven插件配置。它将使用 PropertiesLauncher 启动你的应用,这允许你在 loader.main 中指定主类。如前所述,由于某种原因,如果将 PropertiesLauncher 与 loader.path 一起使用,它不会将资源文件添加到类路径中。这可以通过使用 -cp 而不是 -jar 来解决此问题。

编辑 正如 Pianosaurus 在注释中提到的,在 Linux 上的类路径中使用 “:” 而不是 “;” 作为分隔符


推荐