我可以将来自 Maven 的属性(在 settings.xml 中定义的密码)注入到我的 Spring 容器中吗?
Posted
技术标签:
【中文标题】我可以将来自 Maven 的属性(在 settings.xml 中定义的密码)注入到我的 Spring 容器中吗?【英文标题】:Can I inject properties from Maven (passwords defined in settings.xml) into my Spring container? 【发布时间】:2011-05-05 16:00:40 【问题描述】:我通过在 ~/.m2/settings.xml 中为我的部署插件定义的属性定义服务器密码(不过,可以在任何地方,包括 pom.xml)。我想为我的集成测试使用相同的属性。有办法吗?
如果没有,有没有一种方便的方法可以在 Maven 和 TestNG 之间共享属性?
我想编写一个很好的测试套件,它可以在不同的持续集成服务器上运行,指向不同的远程主机(开发、测试、登台和生产),而无需修改代码。
我在 settings.xml 中定义远程服务的凭据:
<properties>
<my.host>http://my.company.com</my.host>
<my.username>my-un</my.username>
<my.password>my-pw</my.password>
</properties>
我希望能够使用以下方法在我的单元/集成测试 (src/test/resources) 中引用属性:
<?xml version="1.0" encoding="UTF-8"?>
<beans....
<bean class="java.lang.String" id="un">
<constructor-arg value="$my.username"/>
</bean>
<bean class="java.lang.String" id="pw">
<constructor-arg value="$my.password"/>
</bean>
</beans>
有什么选择吗?有没有其他人尝试过这个?我正在编写很多需要在我的测试中授权的 REST 测试。
谢谢!
【问题讨论】:
【参考方案1】:当然。 Maven resource filtering 是要走的路。
这是一个示例配置(匹配*-context.xml
的文件将被过滤,其他则不会):
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/*-context.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<excludes>
<exclude>**/*-context.xml</exclude>
</excludes>
</resource>
</resources>
</build>
另一种方法是使用 Properties Maven Plugin 到 write all project properties to a file 并使用 the PropertyPlaceholderConfigurer
mechanism 从 Spring 引用该文件。
Maven 配置:
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>properties-maven-plugin</artifactId>
<version>1.0-alpha-2</version>
<executions>
<execution>
<phase>generate-test-resources</phase>
<goals>
<goal>write-project-properties</goal>
</goals>
<configuration>
<outputFile>$project.build.testOutputDirectory/mavenproject.properties</outputFile>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
弹簧配置:
<context:property-placeholder location="classpath:mavenproject.properties"/>
【讨论】:
+1 正是我阅读文档后所寻找的。最初忽略认为“过滤”是另一回事。 根据您的工作流程,存在风险,这些属性,尤其是密码,会显示在您的构建中,例如在 CI 环境中。【参考方案2】:好吧,@seanizer 是在正确的轨道上,但这可以简化,因为您已经可以在 maven 中设置属性。将它们设置在您的 pom 和 Spring 配置中,您需要做的就是访问它们,因此只需像这样更改您的配置即可完成。
<beans....
<context:property-placeholder />
<bean class="java.lang.String" id="un">
<constructor-arg value="$my.username"/>
</bean>
<bean class="java.lang.String" id="pw">
<constructor-arg value="$my.password"/>
</bean>
</beans>
该位置不是必需的,因为您感兴趣的属性现在已由 maven 设置为系统属性。 PropertyPlaceholderConfigurer 将与那些以及在文件中定义的任何内容一起使用,在这种特定情况下不需要。请注意,您必须包含 context 的架构。
我会将它们从您当前的位置移走,尽管这是一个全局设置,您的 pom 是特定于项目的,所以我认为这是它所属的位置。
【讨论】:
【参考方案3】:当 Maven 使用特定配置文件构建您的项目时,您可以让 Maven 将特定值替换到您的 xml 文件中。因此,例如,您将在您的 maven pom 中设置一个测试 prfile,并且当您使用该配置文件构建时,您的 jar 中的 xml 文件将具有所需的属性。以this 为例。
【讨论】:
【参考方案4】:您可以在属性文件中定义您的值,并在 pom.xml 中使用 $my-pw-key
引用它们,并使用插件 properties-maven-plugin
创建属性文件
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>properties-maven-plugin</artifactId>
<version>1.0.0</version>
<executions>
<execution>
<phase>initialize</phase>
<goals>
<goal>read-project-properties</goal>
</goals>
<configuration>
<files>
<file>$basedir/src/main/resources/env.properties</file>
</files>
</configuration>
</execution>
</executions>
</plugin>
属性文件 (env.properties
)
my-pw-key=abc&123 #your password here
然后运行maven mvn initialize package
(初始化从属性文件加载值)
【讨论】:
以上是关于我可以将来自 Maven 的属性(在 settings.xml 中定义的密码)注入到我的 Spring 容器中吗?的主要内容,如果未能解决你的问题,请参考以下文章