需要了解资源位置和变量值集中的类路径

Need in understanding classpath in resource location and variable value set

虽然我在java工作了一段时间,但有很多小事我一直忽略,有时成为生产力的瓶颈。我很难理解这个:

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

<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" 是什么意思?谁设置类路径的值?类路径是否也能够提供资源文件的位置?

假设 deploy.set --> 本地,那么 t运行 会变成:

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

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

任何有助于理解这一点的意见都会有很大帮助。

如 Oracle 网站所述:CLASSPATH 变量是一种告诉应用程序(包括 JDK 工具)到哪里寻找用户 类.

那个 classpath: 特别指的是那个位置,不管它是什么,所以它将开始从那个位置开始寻找那些由 Spring 定义的资源,直到找到第一个匹配项.

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

您可以使用其他前缀,如 file:http: 等。但你只是想知道 classpath:.

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

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

在启动 tomcat 的 shell 中设置 deploy.env=whatever 或在启动 tomcat.

的用户环境中设置

mvn clean install -Ddeploy.env=local 这里 deploy.env 系统 属性 在构建时可用。这不会替换您的 spring 配置的值。

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

Spring documentation to learn more Some explanation on my blog post