将Maven工件版本配置为Spring属性

时间:2015-03-20 13:55:54

标签: java xml spring maven

我正在尝试配置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访问属性吗?

谢谢

3 个答案:

答案 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都可以读取属性文件,我建议您将要共享的数据提取到此公共文件,并从两个配置中独立使用。

Maven Properties Plugin

Spring Boot and properties