我正在尝试配置Spring bean的属性以显示Maven工件的版本。我需要在加载bean时配置属性(而不是在运行时)。
的applicationContext.xml :
<bean id="myBean" class="com.domain.ClassName">
<property name="version" value="${???????}" />
</bean>
com.domain.ClassName :
private String version;
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
有办法做到这一点吗?更一般地说,有一种简单的方法可以从Spring xml上的POM xml访问属性吗?
谢谢
答案 0 :(得分:2)
你应该看一下maven资源插件。 见: http://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html
基本上,我们的想法是,在构建应用程序时,您将过滤一些项目文件,将某些文本替换为您想要的内容(在您的情况下,您希望将pom.xml
中声明的版本放入{ {1}})
这里的关键是要明白,在构建时,它将在您将在运行时使用的spring配置文件中进行一些替换。
答案 1 :(得分:2)
这里有一个如何通过pom.xml中的maven资源插件引入构建版本/分支和修订的示例 (通常你想在不同的配置文件中有不同的值,例如local,prod,test ......等):
<properties>
<!-- in my case injected by jenkins build job -->
<build.version>dev</build.version>
<build.branch>master</build.branch>
<build.revision>0.0.32</build.revision>
</properties>
您的version.properties属性文件就是这样:
build_version=${build.version}
build_branch=${build.branch}
build_revision=${build.revision}
资源过滤(maven正在处理您的资源时,占位符由pom-property值替换)
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>conf/version.properties</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
context.xml中的Bean和属性占位符配置:
<context:property-placeholder location="classpath:conf/version.properties"/>
<bean id="buildVersion" class="de.your.package.cfg.BuildVersion">
<property name="buildBranch" value="${build_branch}"/>
<property name="buildVersion" value="${build_version}"/>
<property name="buildRevision" value="${build_revision}"/>
</bean>
你的bean看起来像这样:
@Component
public class BuildVersion {
private String buildBranch;
private String buildVersion;
private String buildRevision;
public String getBuildRevision() {
return buildRevision;
}
public void setBuildRevision(String buildRevision) {
this.buildRevision = buildRevision;
}
public String getBuildVersion() {
return buildVersion;
}
public void setBuildVersion(String buildVersion) {
this.buildVersion = buildVersion;
}
public String getBuildBranch() {
return buildBranch;
}
public void setBuildBranch(String buildBranch) {
this.buildBranch = buildBranch;
}
}
因此,您的替换流程来自maven build profile - &gt;属性文件 - &gt; spring bean代码(而不是maven配置文件,您的输入可以来自命令行参数,如-Dbuild.version =&#34; dev&#34;或其他...)。
替代xml-configuration,您可以使用@Value和注释将spring上下文中的值注入到bean中:
@Component
public class BuildVersion {
@Value("${build_branch:default_value}")
private String buildBranch;
...
public String getBuildBranch() {
return buildBranch;
}
...
}
您需要一个xml上下文配置或配置了PropertySource的配置bean:
@Configuration
@PropertySource({"classpath:conf/version.properties"})
public class ApplicationContext(){
...
}
答案 2 :(得分:0)
由于Spring和Maven都可以读取属性文件,我建议您将要共享的数据提取到此公共文件,并从两个配置中独立使用。