带有Classpath的Spring Boot可执行jar

时间:2016-09-27 05:42:13

标签: java spring spring-boot

我正在构建一个软件系统,使用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一起工作?

提前感谢您的帮助。

5 个答案:

答案 0 :(得分:9)

如果您只想添加外部库,可以使用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: /home/sleeper/thirdparty/lib/

您只需使用java -jar MyApp.jar启动应用即可。

有关MANIFEST.MF的更多信息,请参阅Working with Manifest Files: The Basics

答案 1 :(得分:4)

您提到需要从外部文件夹加载* .ini文件。我必须做类似的事情,从外部文件夹加载CSV文件。

我的文件结构看起来像这样

./myapp.jar  
./config/file.csv

我使用ResouceLoader将文件加载为:

Resource res = resourceLoader.getResource("classpath:file.csv");
File csvFile = res.getFile();

启动脚本:

java -Dloader.path="config" -jar your-app.jar

资源未从" config"文件夹按预期。经过一些研究,我发现我必须更改我的Maven插件配置才能使用ZIP布局。

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <layout>ZIP</layout>
    </configuration>
</plugin>

这将指示Spring Boot使用PropertiesLauncher,它允许从&#34; loader.path&#34;加载外部资源。

有关更多详细信息,请参阅此优秀article

答案 2 :(得分:3)

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

答案 3 :(得分:2)

  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

如果要定义外部存储器的使用

        java -ms8g -mx8g -cp

java -cp

-Dloader.main

Spring Boot的org.springframework.boot.loader.PropertiesLauncher带有JVM参数,可让您覆盖名为loader.main的逻辑主类:

-Dloader.path

告诉PropertiesLauncher它应该获取在“ lib”中找到的所有库

org.springframework.boot.loader.PropertiesLauncher

Spring Boot的org.springframework.boot.loader.PropertiesLauncher带有JVM参数,可让您覆盖名为loader.main的逻辑主类:

          java -cp bootApp.jar -Dloader.main=org.khan.DemoApplication  org.springframework.boot.loader.PropertiesLauncher

-Dspring.profiles.active

如果您使用的是Spring配置文件,则需要先设置配置文件

     set SPRING_PROFILES_ACTIVE=default,test

或窗口运行类型envi并添加

      spring_profiles_active
       default,test

-spring.config.location

指定目录,然后在其中搜索application.properties

答案 4 :(得分:1)

只是添加一个没有 PropertiesLauncher 或太多参数的简单解决方案。

1 - 构建标准的可执行 springboot jar (my-spring-boot-app.jar)

2 - 然后不使用 -jar 选项并使用 JarLauncher 类作为主类运行它

java -cp "/path/to/jars/*:/path/to/app/my-spring-boot-app.jar" org.springframework.boot.loader.JarLauncher

(相对路径也完全有效)

就这些