繁体   English   中英

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

[英]Spring Boot Executable Jar with Classpath

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

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

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

您提到您需要从外部文件夹加载 *.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,它允许从“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

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

        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

或窗口运行类型env并添加

      spring_profiles_active
       default,test

--spring.config.location

指定目录然后搜索 application.properties

只是添加一个没有 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

(相对路径也完全有效)

就这样

嘿@user1670498 我知道这是一个非常古老的问题,但似乎在 Spring Boot 项目中添加依赖项的标准方法是将这些 Jar 文件放入BOOT-INF/lib 这将导致在生成的jarwar文件中复制该依赖项,并同时更新classpath.idx

你可以在这里查看官方文档

精度文献说:

应用程序类应放置在嵌套的 BOOT-INF/classes 目录中。 依赖项应该放在嵌套的 BOOT-INF/lib 目录中

BWT 我已经用外部 Jar 文件做到了,一切都好了。

对我有用的一种解决方案是将带有外部类的 jar 插入到MANIFEST.MFClass-Path 这是因为-jar开关忽略了-classpath选项和CLASSPATH环境变量。
程序:

  1. maven-jar-plugin安装到 POM 中;
  2. 添加行:
    <configuration>
        <archive>
            <manifestEntries>
                <Class-Path>/my/external/jar/absolute/path.jar</Class-Path>
            </manifestEntries>
        </archive>
    </configuration>

使用java -jar myapp.jar构建和运行。 它的清单将包含以下行:

Class-Path: /my/external/jar/absolute/path.jar

这样外部 jar 将在运行时而不是在编译时被搜索(它不会被复制到BOOT_INF/lib )。

资料来源:

帖子 1

帖子 2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM