【问题标题】:Problem with loading a third party jar inside a spring boot application在 Spring Boot 应用程序中加载第三方 jar 的问题
【发布时间】:2020-07-20 20:06:21
【问题描述】:

我正在创建一个 Spring Boot 应用程序,出于商业原因,我需要导入一个第 3 方 jar,它还从名为 application.properties 的文件中读取一些配置参数。

我已经在 spring boot application.properties 文件中定义了我的应用和第 3 方 jar 所需的所有配置。

当我从 Eclipse 运行这个应用程序时,一切都很好,但是当我使用命令从外部运行它时,jar 内的代码找不到 application.properties 文件并引发异常;

java -jar myapp.jar

当我将其更改为以下命令并将 application.properties 文件放在 jar 之外时,它可以工作;

java -Xbootclasspath/a: -jar myapp.jar

如果不从 jar 外部放置 application.properties 文件,如何使其工作?

一些附加信息; 第 3 方 jar 是作为我的 maven 依赖项包含的 lib jar。在第 3 方代码中有一个地方正在加载 application.properties 文件,但会引发异常。

    Properties cfg = new Properties();
    FileInputStream is = null;

    URL url = DemoApplication.class.getResource("/");
    if (null != url) {

        String configPath = url.getFile()+ "application.properties";
        try {
            is = new FileInputStream(configPath);
            cfg.load(is); // It fails here
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

例外:

file:/D:/Temp/target/myapp.jar!/BOOT-INF/classes!/application.properties FAILED load config.java.io.FileNotFoundException: file:\D:\Temp\target\myapp.jar!\BOOT-INF\classes!\application.properties (The filename, directory name, or volume label syntax is incorrect) 

【问题讨论】:

  • 有助于查看异常
  • 异常如下:file:/D:/Temp/target/myapp.jar!/BOOT-INF/classes!/application.properties FAILED load config.java.io.FileNotFoundException: file: \D:\Temp\target\myapp.jar!\BOOT-INF\classes!\application.properties(文件名、目录名或卷标语法不正确)
  • 它是一个 maven 项目,我确实使用 mv install 来生成包。包没问题,失败是因为外部jar读取属性文件
  • 第三方 jar 是如何启动的?第三方 jar 是您的 Spring Boot 应用程序的 mavendependency 吗?或者它是单独开始的。以及您如何尝试读取第三方应用程序中的属性。也许提供一些代码。
  • 第三方 jar 是作为依赖项包含在我的项目中的外部库,我已编辑问题以包含代码 sn-p 在加载 application.properties 文件时失败的地方。

标签: java spring spring-boot


【解决方案1】:

如果是maven项目,尝试使用(mvn package)命令,然后运行目标文件夹下生成的jar

【讨论】:

    【解决方案2】:

    如果您的第三方应用程序是 myApp 的 maven 依赖项,您可以从类路径加载它:

    Properties cfg = new Properties();
    cfg.load(DemoApplication.class.getClassLoader().getResourceAsStream("application.properties"));
    

    【讨论】:

    • 对不起,我不太明白你的意思。 MyApp 正在加载第 3 方 jar;这反过来正在加载 application.properties 文件。我无法更改 3rd Party jar 的代码
    • 在我看来这是一个错误的设计。如果这是一个封闭的模块,它应该有它自己的配置文件,您必须将其放置在所需的位置(类路径、文件系统等)。你如何调用你的第三方应用程序?
    • 是的,不幸的是,第 3 方 jar 配置文件与我的应用程序属性文件发生冲突。但我无法控制 3rd Party jar,我必须将其包含在内。如果我能以某种方式让第 3 方 jar 从 jar 中读取 application.property 文件,我的问题将得到解决。
    • 再次。你怎么称呼第三方jar
    • 它有一些API,我创建类的实例并调用API
    【解决方案3】:

    第 3 方 jar 使用 FileInputStream,其 URL 以派生自 Class.getResource(...) 的内容开头。

    这永远不会与 jar 文件一起使用。

    可以跳过FileInputStream,而是使用Class.getResourceAsStream(...):

    InputStream is = DemoApplication.class.getResourceAsStream("/application.properties")
    

    【讨论】:

    • 不幸的是,我无法更改它的第 3 方 jar 代码。
    • 那么它们在其他应用程序中是如何做到的呢?他们总是必须在类路径中添加一个本地目录才能读取这样的属性文件。这不是你能解决的问题。
    • 其他使用这个 Lib 的应用程序是基于 spring 的应用程序,而不是 spring-boot ,它们将它们的包部署为 war 文件,并且它们没有遇到这个问题。
    猜你喜欢
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 2021-01-07
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多