java - 将 Maven 属性传递给 Spring

标签 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} 的驱动程序。这显然是因为传递的是字符串常量而不是变量。我错过了什么?

谢谢

最佳答案

概述

在不添加 Java 类的情况下配置 Maven 资源插件的简单方法是定义 resource filter .出于示例的目的,我们将使用 pom.xml 中定义的属性配置 spring-config.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 被更改。

spring-config.xml

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

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

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

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

外部属性

对于真正喜欢冒险的人,Maven 属性也可以从 external files 加载。 .

关于java - 将 Maven 属性传递给 Spring,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9301920/

相关文章:

java - 最低android API级别

java - 已部署的 war 文件未在 tomcat 管理器中启动

spring - 使用spring-test-mvc进行单元测试REST Controller

maven - 无法访问net.sf.ehcache.CacheManager,找不到net.sf.ehcache.CacheManager的类文件

maven - 使用 Maven 生成的带有依赖项和其他一些文件的 jar 创建一个 tar

java - 运行应用程序时无法实例化 Activity

java - 外部文件中的系统属性?

java - 重新创建 arrayList 元素是否昂贵?

java - REQ : Retrieving properties in my java app. 由 "PropertyPlaceholderConfigurer"收集 - 属性作为键/值存储在数据库中

maven - 有没有办法在多个单独的模块上执行 "mvn clean install",当所有模块都有不同的不能更改的父项时?