将maven属性传递给春天

时间:2012-02-15 21:44:21

标签: java spring maven

我知道这可能是一个愚蠢的问题,但我无法弄清楚我的生活。基本上我使用maven来设置我的dataSource用户名,密码和驱动程序类名。当我查看有效的Pom.xml时,它看起来很好,如下所示

<dataSource.driverClassName>oracle.jdbc.driver.OracleDriver</dataSource.driverClassName>
<dataSource.username>someUsername</dataSource.username>
<dataSource.password>somePassword</dataSource.password>

我在声明spring数据源时尝试使用此信息。代码如下所示。

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${dataSource.driverClassName}"/>
    <property name="url" value="${dataSource.url}"/>
    <property name="username" value="${dataSource.username}"/>
    <property name="password" value="${dataSource.password}"/>
</bean>

然后我将数据源传递给jdbcTemplate,但是当我使用模板在我的代码中运行sql语句时,我得到一个错误,说明找不到名为$ {dataSource.driverClassName}的驱动程序。这显然是因为传递了字符串常量而不是变量。我错过了什么?

谢谢

4 个答案:

答案 0 :(得分:7)

概述

在不添加Java类的情况下配置Maven Resources插件的简单方法是定义resource filter。出于示例的目的,我们将使用spring-config.xml中定义的属性配置pom.xml

的pom.xml

pom.xml文件定义了一个属性,如下所示:

<project>
  <properties>
    <environment.deploy>local</environment.deploy>
  </properties>
  ...

然后,在build部分中,定义将替换变量的资源(文件)的位置。在以下示例中,仅更新文件spring-config.xml

  <build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
            <includes>
                <include>spring-config.xml</include>
            </includes>
        </resource>
    </resources>
  </build>
</project>

pom.xml的语法功能强大,可用于替换多个文件中的值,例如:

<resources>
  <resource>
    <directory>src/main/resources</directory>
    <filtering>true</filtering>
    <includes>
      <include>**/*included_filename.xml</include>
    </includes>
  </resource>
</resources>

排除也是可能的:

<excludes>**/*excluded_filename.xml</excludes>

如果只有一个文件需要应用变量,请设置不同的resource,例如:

<resources>
    <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
        <includes>
            <include>spring-config.xml</include>
        </includes>
    </resource>
    <resource>
        <directory>src/main/resources</directory>
        <filtering>false</filtering>
        <includes>
            <include>**/*</include>
        </includes>
    </resource>
</resources>

这将确保捆绑所有文件,但仅更改spring-config.xml

弹簧-config.xml的

位于src/main/resources,相对于项目的根目录,可以使用Maven加载的属性。例如:

<beans ...>
  <bean ...>
    <property name="deploymentEnvironment">
        <list>
            <value>${environment.deploy}</value>
        </list>
    </property>
</bean>

在构建过程中,Maven会替换目标value文件中的spring-config.xml

<beans ...>
  <bean ...>
    <property name="deploymentEnvironment">
        <list>
            <value>local</value>
        </list>
    </property>
</bean>

外部属性

对于真正具有冒险精神的人来说,Maven属性也可以从external files加载。

答案 1 :(得分:3)

我认为你不能这样做,我的意思是,从pom.xml到spring应用程序上下文xml。

将您的属性放在属性文件中,例如:

dataSource.username=${dataSource.username}
dataSource.driverClassName=${dataSource.driverClassName}
dataSource.username=${dataSource.username}
dataSource.password=${dataSource.password}

然后,使用PropertyConfigurationPlaceholder加载属性文件,并在spring applicationt上下文文件中使属性可用。

答案 2 :(得分:2)

Spring希望在.properties文件中找到这些值。

使用这些值注入PropertyConfigurationPlaceholder,Spring会找到它们。

http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/beans/factory/config/PropertyPlaceholderConfigurer.html

查看下面的示例3.8.2.1:

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html

答案 3 :(得分:2)

Maven无法将任何数据传输到应用程序,因为maven在编译时工作,而参数a在运行时进行评估。

但你可以使用maven过滤器。在maven处理资源时用一些值标记一些标记。