use*_*498 7 java spring spring-boot
我正在构建一个软件系统,使用Spring Boot与企业软件系统进行交互.我的系统依赖于该企业系统中的一些jar和*.ini文件,因此我无法在Maven中打包所有依赖项.我希望能够将Spring Boot作为带有嵌入式Tomcat的可执行jar运行.我还希望能够通过命令行设置类路径.所以类似于:
java -classpath /home/sleeper/thirdparty/lib -jar MyApp.jar
Run Code Online (Sandbox Code Playgroud)
但是,-classpath和-jar不能共存.我试过"-Dloader.path".它能够加载文件夹下的所有jar文件,但不能加载其他内容,例如文件夹中的*.ini文件.
那么有没有办法让-classpath与带有嵌入式Tomcat的Spring可执行jar一起工作?
提前感谢您的帮助.
如果您只想添加外部库,则可以使用该loader.path属性.
java -Dloader.path="your-lib/" -jar your-app.jar
Run Code Online (Sandbox Code Playgroud)
UPDATE
如果还需要从类路径中读取其他文件,则必须创建/更改应用程序的清单文件.
让我们假设您正在从类中初始化Spring Boot上下文de.app.Application.你MANIFEST.MF应该看起来如下:
Manifest-Version: 1.0
Main-Class: de.app.Application
Class-Path: /home/sleeper/thirdparty/lib/
Run Code Online (Sandbox Code Playgroud)
而你可以简单地启动你的应用程序java -jar MyApp.jar.
有关MANIFEST.MF的更多信息,请参阅使用清单文件:基础知识.
您提到您需要从外部文件夹加载 *.ini 文件。我不得不做类似的事情,从外部文件夹加载 CSV 文件。
我的文件结构看起来像这样
./myapp.jar
./config/file.csv
Run Code Online (Sandbox Code Playgroud)
我使用 ResouceLoader 将文件加载为:
Resource res = resourceLoader.getResource("classpath:file.csv");
File csvFile = res.getFile();
Run Code Online (Sandbox Code Playgroud)
启动脚本:
java -Dloader.path="config" -jar your-app.jar
Run Code Online (Sandbox Code Playgroud)
资源未按预期从“config”文件夹加载。经过一番研究,我发现我必须更改我的 Maven 插件配置才能使用 ZIP 布局。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<layout>ZIP</layout>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
这将指示 Spring Boot 使用 PropertiesLauncher,它允许从“loader.path”加载外部资源。
有关更多详细信息,请参阅这篇出色的文章。
java -cp C:\\jar-path\\your-jar-1.2.0.jar -Dloader.main=package-and-main class -Dloader.path=external dependency jar path org.springframework.boot.loader.PropertiesLauncher -Dspring.profiles.active=profile etc -default,test --spring.config.location=external properties file name\nRun Code Online (Sandbox Code Playgroud)\n\n如果要定义外部存储器的使用
\n\n java -ms8g -mx8g -cp\nRun Code Online (Sandbox Code Playgroud)\n\nSpring Boot\xe2\x80\x99s org.springframework.boot.loader.PropertiesLauncher 附带一个 JVM 参数,可让您覆盖名为 loader.main 的逻辑主类:
\n\n告诉 PropertiesLauncher 它应该拾取在 \xe2\x80\x9clib\xe2\x80\x9d 中找到的所有库
\n\nSpring Boot\xe2\x80\x99s org.springframework.boot.loader.PropertiesLauncher 附带一个 JVM 参数,可让您覆盖名为 loader.main 的逻辑主类:
\n\n java -cp bootApp.jar -Dloader.main=org.khan.DemoApplication org.springframework.boot.loader.PropertiesLauncher\nRun Code Online (Sandbox Code Playgroud)\n\n如果您使用 Spring 配置文件,那么您需要先设置配置文件
\n\n set SPRING_PROFILES_ACTIVE=default,test\nRun Code Online (Sandbox Code Playgroud)\n\n或窗口运行类型 envi 并添加
\n\n spring_profiles_active\n default,test\nRun Code Online (Sandbox Code Playgroud)\n\n然后指定目录,即搜索 application.properties 的位置
\n\n在Linux上:
java -cp MyApp.jar:/home/sleeper/thirdparty/lib -Dloader.main=myMainApplicationClass org.springframework.boot.loader.PropertiesLauncher
Run Code Online (Sandbox Code Playgroud)
在Windows上:
java -cp MyApp.jar;/home/sleeper/thirdparty/lib -Dloader.main=myMainApplicationClass org.springframework.boot.loader.PropertiesLauncher
Run Code Online (Sandbox Code Playgroud)
这样可以避免混淆清单或Spring Boot Maven插件配置,就像其他答案一样。它将使用PropertiesLauncher启动您的应用程序,该属性允许您在loader.main中指定主类。如前所述,由于某种原因,如果将PropertiesLauncher与loader.path一起使用,它将不会将资源文件添加到类路径中。通过使用-cp而不是-jar可以解决此问题。
编辑正如Pianosaurus在评论中提到的,请使用“:”代替“;”。在Linux上的类路径中作为分隔符
| 归档时间: |
|
| 查看次数: |
27741 次 |
| 最近记录: |