Java 在maven构建时替换测试属性值

Java 在maven构建时替换测试属性值,java,maven-3,Java,Maven 3,我有一个test.properties文件,位于:$PROJECT_HOME/src/test/resources中,内容如下: hostname=${host} 我还有一个main.properties文件,位于:$PROJECT_HOME/src/main/resources中,内容相同 然后我在我的项目的pom文件中指定了以下几行 <properties> <host>localhost</host> </properties>

我有一个test.properties文件,位于:$PROJECT_HOME/src/test/resources中,内容如下:

hostname=${host}
我还有一个main.properties文件,位于:$PROJECT_HOME/src/main/resources中,内容相同

然后我在我的项目的pom文件中指定了以下几行

<properties>
    <host>localhost</host>
</properties>

<build>  
  <resources>
    <!-- Filter resource files -->
    <resource>
      <directory>src/main/resources</directory>
      <filtering>true</filtering>
    </resource>
  </resources>
  ....
</build>

本地服务器
src/main/resources
真的
....
执行mvn clean安装后,我看到目标文件夹中的main.properties被替换为localhost值。但是,我的test.properties中的属性不是

我的第一个想法是调整资源,如下所示:

<properties>
    <host>localhost</host>
</properties>

<build>  
  <resources>
    <!-- Filter resource files -->
    <resource>
      <directory>src/main/resources</directory>
      <filtering>true</filtering>
    </resource>
    <resource>
      <directory>src/test/resources</directory>
      <filtering>true</filtering>
    </resource>
  </resources>
  ....
</build>

本地服务器
src/main/resources
真的
src/测试/资源
真的
....
现在构建时,test.properties文件将替换为localhost值,但会放在目标中的classes文件夹中。在测试类中,仍然存在没有替换值的test.properties文件

是否有方法也替换test classes文件夹中的值? 我的想法是使用localhost值在本地服务器上工作,而不将其指定为参数,并在对测试服务器执行集成测试时使用备用主机覆盖此值。在本例中,我在我们的持续集成系统上指定了值-Dhost=。

这应该会起作用(尽管test.properties不会出现在您的classes文件夹中,测试类会同时包含test.properties和main.properties,并带有替换的值,我认为这是您想要的,但不确定)


src/main/resources
真的
src/测试/资源
真的

另外,您可能希望有两个属性,
${host}
(在host.properties中引用)和
${test.host}
(在test.properties中引用),否则,如果在集成构建期间指定
-Dhost
,它将替换host.properties和test.properties中的值。通过这种方式,您可以指定
-Dtest.host
来更改用于集成测试的主机,但不更改部署时设置的主机。

如果您使用的是Spring Framework,则应签出
@PropertySources
注释。它允许您指定几个
@PropertySource
注释来为您加载属性文件。谢谢,这正是我所需要的!只需一句话,在testResources中,只允许使用testResource元素,而不是示例中提到的资源元素。谢谢,整理了我的答案。
<resources>
    <!-- Filter resource files -->
    <resource>
      <directory>src/main/resources</directory>
      <filtering>true</filtering>
    </resource>
</resources>
<testResources>
    <!-- Filter test resource files -->
    <testResource>
      <directory>src/test/resources</directory>
      <filtering>true</filtering>
    </testResource>
</testResources>