带有Classpath的Spring Boot可执行jar

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一起工作?

提前感谢您的帮助.

Pau*_*ski 9

如果您只想添加外部库,则可以使用该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的更多信息,请参阅使用清单文件:基础知识.

  • 经过大量研究,似乎“类路径:/home/sleeper/thirdparty/lib/”不会加载文件夹下的任何jar文件。要引用 jar 文件,我们需要明确地引用每个单独的 jar,例如“类路径:/home/sleeper/thirdparty/lib/abc.jar /home/sleeper/thirdparty/lib/def.jar”。 (2认同)
  • 我实际上阅读了那个博客,并且我的类路径以“/”结尾。我想博客说的是,它不会加载目录中的jar文件,但会加载目录中的.class文件。 (2认同)

Pet*_*los 7

您提到您需要从外部文件夹加载 *.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”加载外部资源。

有关更多详细信息,请参阅这篇出色的文章


vaq*_*han 6

  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\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
        java -ms8g -mx8g -cp\n
Run Code Online (Sandbox Code Playgroud)\n\n

java-cp

\n\n\n\n

-Dloader.main

\n\n

Spring Boot\xe2\x80\x99s org.springframework.boot.loader.PropertiesLauncher 附带一个 JVM 参数,可让您覆盖名为 loader.main 的逻辑主类:

\n\n

-Dloader.路径

\n\n

告诉 PropertiesLauncher 它应该拾取在 \xe2\x80\x9clib\xe2\x80\x9d 中找到的所有库

\n\n

org.springframework.boot.loader.PropertiesLauncher

\n\n

Spring 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\n
Run Code Online (Sandbox Code Playgroud)\n\n

-Dspring.profiles.active

\n\n

如果您使用 Spring 配置文件,那么您需要先设置配置文件

\n\n
     set SPRING_PROFILES_ACTIVE=default,test\n
Run Code Online (Sandbox Code Playgroud)\n\n

或窗口运行类型 envi 并添加

\n\n
      spring_profiles_active\n       default,test\n
Run Code Online (Sandbox Code Playgroud)\n\n

--spring.config.location

\n\n

然后指定目录,即搜索 application.properties 的位置

\n\n\n


Mih*_*ira 5

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

  • 谢谢,这对我们有用。如果在un * x上,请记住在类路径中使用“:”作为分隔符。 (2认同)

归档时间:

查看次数:

27741 次

最近记录:

6 年,6 月 前