Java 将maven属性传递给spring

Java 将maven属性传递给spring,java,spring,maven,Java,Spring,Maven,我知道这可能是个愚蠢的问题,但我一辈子都搞不懂。基本上,我使用maven设置数据源用户名、密码和驱动程序类名。当我查看有效的Pom.xml时,它看起来很好,如下所示 <dataSource.driverClassName>oracle.jdbc.driver.OracleDriver</dataSource.driverClassName> <dataSource.username>someUsername</dataSource.username>

我知道这可能是个愚蠢的问题,但我一辈子都搞不懂。基本上,我使用maven设置数据源用户名、密码和驱动程序类名。当我查看有效的Pom.xml时,它看起来很好,如下所示

<dataSource.driverClassName>oracle.jdbc.driver.OracleDriver</dataSource.driverClassName>
<dataSource.username>someUsername</dataSource.username>
<dataSource.password>somePassword</dataSource.password>
oracle.jdbc.driver.OracleDriver
someUsername
密码
我试图在声明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}的驱动程序。这显然是因为传递的是字符串常量而不是变量。我错过了什么


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

将这些值注入PropertyConfiguration占位符,Spring将找到它们

查看下面的示例3.8.2.1:


Maven无法将任何数据传输到应用程序,因为Maven在编译时工作,参数a在运行时计算


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

我认为您不能用这种方式,我的意思是,从pom.xml到spring应用程序上下文xml

将属性放入属性文件中,类似于:

dataSource.username=${dataSource.username}
dataSource.driverClassName=${dataSource.driverClassName}
dataSource.username=${dataSource.username}
dataSource.password=${dataSource.password}
然后,使用
PropertyConfigurationPlaceholder
加载属性文件,并使属性在spring应用程序上下文文件上可用。

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

pom.xml
pom.xml
文件定义了如下属性:


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


src/main/resources
真的
spring-config.xml
pom.xml
的语法功能强大,可用于替换许多文件中的值,例如:

<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>

src/main/resources
真的
**/*包含的\u filename.xml
也可以排除:

***已排除\u filename.xml
如果只有一个文件需要应用变量,请设置不同的
资源
s,例如:

<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>
在构建过程中,Maven在目标的
spring config.xml
文件中替换上面的
值:


地方的
外部属性
对于真正的冒险者,Maven properties也可以从加载。

感谢所有帮助。看起来PropertyConfiguration占位符就是我要找的。我同意这个答案。使用maven过滤在构建时更新spring配置文件中的值,从而在运行时获得正确的值。请参阅,但必须在POM中明确打开过滤,如Carlos AG的回答所示。