Java Spring类路径:Spring在类路径

时间:2017-08-02 17:22:32

标签: java spring classpath

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

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

脚本如下:

/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;

问题是:

Spring 在&#34; classpath *中看到只有jar文件:/?

当我使用下面的代码查看 Spring的类路径中的内容时:

ResourcePatternResolver patternResolver = new PathMatchingResourcePatternResolver(new DefaultResourceLoader());
Resource[] resources = new Resource[0];
try {
    resources = patternResolver.getResources("classpath*:*");
} catch (IOException e) {
    e.printStackTrace();
}

for (Resource resource : resources) {
   System.out.println("spring context classpath : " +resource.getDescription());
}

在类路径中看到application.properties。在类路径中看起来像jar中的文件是可见的。

但如果我像这样使用ClassLoader进行打印:

ClassLoader cl = ClassLoader.getSystemClassLoader();

URL[] urls = ((URLClassLoader)cl).getURLs();

for (URL url: urls) {
    System.out.println("classloader classpath : " + url.getFile());
}

我在类路径中看到了这个:

/online/sand/oap/oap_dw/run/client_api/application.properties

为什么这两种印花之间存在差异?

如何在Spring类路径中包含此application.properties文件?

1 个答案:

答案 0 :(得分:0)

要查找属性文件,只需指定不带属性filename的目录。 java期望类路径上的jar或目录,而不是文件。

尝试     ... -cp /online/sand/lib/client-api-1.0.0.jar:/online/sand/oap_pub/lib/*:/online/sand/oap/oap_dw/run/client_api/ team.online。 client.api.MasterProcessor ...

BTW:如果字符串的一部分被双引号括起,则不会展开星号。如果jar文件名中没有空格,只需删除双引号。