如何在 Spring 上下文中插入 Maven 配置文件属性
How insert Maven profile properties in Spring context
我创建了两个 Maven 配置文件,因为我想将我的应用程序部署到 heroku,
所以我有一个配置文件 dev 具有位于我的 PC 上的数据库属性,以及 prod 具有 heroku 数据库的属性。 POM.xml低于
<modelVersion>4.0.0</modelVersion>
<groupId>com.phone-book</groupId>
<artifactId>phone-book</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>controller</module>
<module>dao</module>
<module>model</module>
<module>service</module>
</modules>
<name>Phonebook web app</name>
<build>
<filters>
<filter>profiles/${build.profile.id}/config.properties </filter>
</filters>
<resources>
<resource>
<filtering>true</filtering>
<directory>controller/src/main/webapp/WEB-INF/spring</directory>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.3</version>
<executions>
<execution>
<phase>package</phase>
<goals><goal>copy</goal></goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>com.github.jsimone</groupId>
<artifactId>webapp-runner</artifactId>
<version>8.0.30.2</version>
<destFileName>webapp-runner.jar</destFileName>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>prod</id>
<properties>
<build.profile.id>prod</build.profile.id>
</properties>
</profile>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<build.profile.id>dev</build.profile.id>
</properties>
</profile>
</profiles>
我在每个 Maven 模块 profile 中创建了文件夹,其中包含文件夹 dev 和 prod
并像本教程中那样编写我的道具 https://www.petrikainulainen.net/programming/tips-and-tricks/creating-profile-specific-configuration-files-with-maven/
最后用这个参数创建 spring 上下文,见下文
<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="org.postgresql.Driver" />
<property name="url" value="${url.property}" />
<property name="username" value="${user.property}" />
<property name="password" value="${password.property}" />
<property name="initialSize" value="20" />
<property name="maxActive" value="100"/>
</bean>
但是当我制作我的应用程序时,属性不会替换,我得到类似的东西
Cannot create JDBC driver of class 'org.postgresql.Driver' for connect URL '${url.property}'
似乎您的配置文件属性与您将属性复制到的位置不一致
产品:个人资料应该是
<profile>
<id>prod</id>
<properties>
<build.profile.id>prod</build.profile.id>
</properties>
</profile>
将位置属性复制到类路径中的位置,通常应该是这样的(除非您在 Maven 中指定了不同的位置)
<resources>
<resource>
<filtering>true</filtering>
<directory>src/main/resources</directory>
</resource>
</resources>
并且您应该拥有诸如
之类的属性文件
config.properties
user.property=xxxxx
..
在 prod/dev 个文件夹中
当你 运行 时,你应该清楚地调用你的 mvn 配置文件,就像这样
mvn -P dev clean install
或
mvn -P prod clean install
正如@vbhlev 所建议的那样,您需要在 bean 中包含它 xml
<context:property-placeholder location="classpath:/config.properties" />
我没有看到您在应用程序上下文中加载具体属性文件的位置。
我认为您的应用上下文中需要类似的东西:
<context:property-placeholder location="classpath:profiles/${build.profile.id}/config.properties" />
控制器模块的过滤应该在其 pom 文件中,以便在其构建生命周期中应用。这样,在构建根时应用过滤,而不是在构建控制器模块时应用过滤。
模块应该将根 pom 设置为其父级,以便它们可以继承配置文件和属性。
我创建了两个 Maven 配置文件,因为我想将我的应用程序部署到 heroku, 所以我有一个配置文件 dev 具有位于我的 PC 上的数据库属性,以及 prod 具有 heroku 数据库的属性。 POM.xml低于
<modelVersion>4.0.0</modelVersion>
<groupId>com.phone-book</groupId>
<artifactId>phone-book</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>controller</module>
<module>dao</module>
<module>model</module>
<module>service</module>
</modules>
<name>Phonebook web app</name>
<build>
<filters>
<filter>profiles/${build.profile.id}/config.properties </filter>
</filters>
<resources>
<resource>
<filtering>true</filtering>
<directory>controller/src/main/webapp/WEB-INF/spring</directory>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.3</version>
<executions>
<execution>
<phase>package</phase>
<goals><goal>copy</goal></goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>com.github.jsimone</groupId>
<artifactId>webapp-runner</artifactId>
<version>8.0.30.2</version>
<destFileName>webapp-runner.jar</destFileName>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>prod</id>
<properties>
<build.profile.id>prod</build.profile.id>
</properties>
</profile>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<build.profile.id>dev</build.profile.id>
</properties>
</profile>
</profiles>
我在每个 Maven 模块 profile 中创建了文件夹,其中包含文件夹 dev 和 prod 并像本教程中那样编写我的道具 https://www.petrikainulainen.net/programming/tips-and-tricks/creating-profile-specific-configuration-files-with-maven/ 最后用这个参数创建 spring 上下文,见下文
<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="org.postgresql.Driver" />
<property name="url" value="${url.property}" />
<property name="username" value="${user.property}" />
<property name="password" value="${password.property}" />
<property name="initialSize" value="20" />
<property name="maxActive" value="100"/>
</bean>
但是当我制作我的应用程序时,属性不会替换,我得到类似的东西
Cannot create JDBC driver of class 'org.postgresql.Driver' for connect URL '${url.property}'
似乎您的配置文件属性与您将属性复制到的位置不一致
产品:个人资料应该是
<profile>
<id>prod</id>
<properties>
<build.profile.id>prod</build.profile.id>
</properties>
</profile>
将位置属性复制到类路径中的位置,通常应该是这样的(除非您在 Maven 中指定了不同的位置)
<resources>
<resource>
<filtering>true</filtering>
<directory>src/main/resources</directory>
</resource>
</resources>
并且您应该拥有诸如
之类的属性文件config.properties
user.property=xxxxx
..
在 prod/dev 个文件夹中
当你 运行 时,你应该清楚地调用你的 mvn 配置文件,就像这样
mvn -P dev clean install
或
mvn -P prod clean install
正如@vbhlev 所建议的那样,您需要在 bean 中包含它 xml
<context:property-placeholder location="classpath:/config.properties" />
我没有看到您在应用程序上下文中加载具体属性文件的位置。
我认为您的应用上下文中需要类似的东西:
<context:property-placeholder location="classpath:profiles/${build.profile.id}/config.properties" />
控制器模块的过滤应该在其 pom 文件中,以便在其构建生命周期中应用。这样,在构建根时应用过滤,而不是在构建控制器模块时应用过滤。
模块应该将根 pom 设置为其父级,以便它们可以继承配置文件和属性。