需要理解资源位置和变量值集

时间:2016-03-25 19:09:16

标签: java maven web-applications classpath

虽然我已经在java工作了一段时间,但是我忽略了许多小事情,这些事情有时会成为生产力的瓶颈。我很难理解这一点:

这是bean.xml中的一个,它放在最终的.war文件中(在使用spring框架构建的Web应用程序中)。

<context:property-placeholder 
    location="classpath:/${deploy.env}/com.example.config/db.properties"
    ignore-resource-not-found="false" />

我有以下怀疑:

1)在构建代码时,我确实喜欢传递deploy.env的值

mvn clean install -Ddeploy.env=local

我在调试模式下运行mvn,可以看到这个设置为本地。现在,问题是,在生成的.war中,它仍然是$ {deploy.env}(参见上面的代码段)。在最终的.war中这不会被取代吗?如果没有,那么我们如何传递我们打算设置的值?

2)"classpath:/${deploy.env}/com.example.config/db.properties"是什么意思?谁设置了classpath的值? classpath是否也能提供资源文件的位置?

假设deploy.set - &gt;本地,所以这将转换为:

classpath:"/local/com.example.config/db.properties"

这是否意味着db.properties将出现在:/local/com.example.config/db.properties

理解这一点的任何输入都会有很大的帮助。

2 个答案:

答案 0 :(得分:1)

如Oracle网站所述:py.test变量是告诉应用程序(包括JDK工具)在哪里查找用户类的一种方法。

CLASSPATH特指这个位置,无论它是什么,所以它将开始寻找Spring从该位置开始定义的那些资源,直到找到第一个匹配为止。

此外,如果您将其作为Maven中的属性,则可以使用正确的插件和配置替换该值;当你想要一个可以与那些classpath:文件中的许多值一起用于不同环境的构建时,这并不是很有用。

您可以将其他前缀用作.propertiesfile:等。但你只是想知道http:

答案 1 :(得分:1)

deploy.env是运行时JVM可用的环境变量或系统属性。

当您的战争在容器中运行时,classpath:/${deploy.env}/com.example.config/db.properties将在运行时解决。

在shell中设置deploy.env=whatever,从启动tomcat的位置开始,或者在启动tomcat的用户环境中设置。{/ p>

mvn clean install -Ddeploy.env=local这里deploy.env系统属性在构建时可用。这不会取代spring config的值。

classpath是战争中捆绑的所有类和库以及tomcat库的地方。 spring属性配置器将在位置的类路径中查找db.properties文件,例如/local/com.example.config

Spring documentation to learn more Some explanation on my blog post