虽然我已经在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
理解这一点的任何输入都会有很大的帮助。
答案 0 :(得分:1)
如Oracle网站所述:py.test
变量是告诉应用程序(包括JDK工具)在哪里查找用户类的一种方法。
CLASSPATH
特指这个位置,无论它是什么,所以它将开始寻找Spring从该位置开始定义的那些资源,直到找到第一个匹配为止。
此外,如果您将其作为Maven中的属性,则可以使用正确的插件和配置替换该值;当你想要一个可以与那些classpath:
文件中的许多值一起用于不同环境的构建时,这并不是很有用。
您可以将其他前缀用作.properties
,file:
等。但你只是想知道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