【问题标题】:Java : How to include a .properties file that is outside of jar into classpath?Java:如何将 jar 之外的 .properties 文件包含到类路径中?
【发布时间】:2017-08-01 18:47:09
【问题描述】:

我们希望将 .properties 文件保留在 jar 之外,以便我们可以更改模块中使用的属性,而不必重新安装模块。

在 Java 8 之前,我们曾经运行一个脚本并以下面的方式包含 .properties 文件并且它可以工作。但是自从我们更新到 Java 8 后,这种在类路径中包含 .properties 文件的方式不起作用,这意味着 java 程序找不到 .properties 文件。

我运行 java 项目的脚本:

/usr/java/latest/bin/java -d64 -Xms1G -Xmx16G -XX:MaxPermSize=128m -XX:-UseGCOverheadLimit -cp "/online/sand/lib/client-api-1.0.0.jar:/online/sand/oap_pub/lib/*:/online/sand/oap/oap_dw/run/client_api/application.properties" team.online.client.api.MasterProcessor  | tee -a client_api.log

我们正在使用 Sping 上下文以这种方式获取属性文件:

<util:properties id="app_props"
                 location="classpath*:/application.properties" />

然后以这种方式使用该 appilcation.properties 文件中的一个属性(在许多不同的文件中):

@Value( "#{app_props[\"SERVICE_PATH_GET_METADATA\"]?:''}" )
private String metadataServicePath;

寻找一种方法将 .properties 文件保留在 jar 和类路径中,以便 Spring 上下文找到该文件。

除了使用它们还有其他方法吗?我们需要将属性文件从 jar 中排除

class.getClassLoader( ).getResourceAsStream( "application.properties" );

提前致谢。

【问题讨论】:

    标签: java spring classpath


    【解决方案1】:

    如果您使用基于 xml 的配置,请使用此选项

    <context:property-placeholder location="classpath:application.properties"/>
    

    然后它将从任何地方加载属性,只要它在类路径中而不是在 jar 中。您必须将其作为 $CLASSPATH:application.properties 包含在类路径中

    对于基于注解,@PropertySource("classpath:application.properties") 这里有一个样本 Java: read properties file using spring annotations

    【讨论】:

      【解决方案2】:

      我找到了一种解决方法,通过使用“::”而不是“:”来更改脚本以运行程序。

      明白了:

      ==> java 和 javac 以不同的方式处理类路径设置, 如果类路径包含双类路径分隔符(Unix 下为“::”,Windows 下为“;;”),javac 将在 / 中搜索类。

      从此链接对我来说似乎很有说服力并且有效。请看这里: https://bugs.openjdk.java.net/browse/JDK-4809833

      【讨论】:

        猜你喜欢
        • 2023-03-11
        • 1970-01-01
        • 2012-02-15
        • 2023-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-16
        相关资源
        最近更新 更多