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

新手上路,请多包涵

我正在使用 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 一起工作?

原文由 user1670498 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 613
2 个回答

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

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


更新

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

假设您正在从类 de.app.Application 初始化 Spring Boot 上下文。您的 MANIFEST.MF 应该如下所示:

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

您只需使用 java -Dloader.path="your-lib/" -jar MyApp.jar 启动您的应用程序。

有关 MANIFEST.MF 的更多信息,请参阅 使用清单文件:基础知识

原文由 Paul Wasilewski 发布,翻译遵循 CC BY-SA 4.0 许可协议

在 Linux 上:

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

在 Windows 上:

 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 类路径中的分隔符

原文由 Mihail Kostira 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题