需要了解资源位置和变量值集中的类路径
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
虽然我在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