在maven构建中定义机器特定资源的最佳实践?

时间:2013-02-27 19:05:42

标签: shell maven environment-variables

是否有标准方法在maven构建中配置特定于环境的资源?

例如 - 我们希望我们的构建将在应用程序中使用的本地服务的特定IP地址不同的环境中运行。

一种选择是将它设置为一个shell环境变量,但不清楚它是否会传播到运行单元测试的万无一失的jvm。

另一种选择是在pom.xml子类文件中提供此信息,但这带有其他包袱(每个开发人员都需要维护自己的pom文件),这当然会破坏任何类型的自动构建环境。

2 个答案:

答案 0 :(得分:1)

以下示例显示了如何使用构建配置文件来获取不同的属性值集。

实施例

您可以使用 -P 参数激活其中一个构建配置文件

$ mvn -Ptest1 compile
..
[INFO] --- maven-antrun-plugin:1.7:run (default) @ demo ---
[INFO] Executing tasks

main:
     [echo] arbitrary.property=1.0
..

切换配置文件会获取与第二个配置文件关联的属性值:

$ mvn -Ptest2 compile
..
[INFO] --- maven-antrun-plugin:1.7:run (default) @ demo ---
[INFO] Executing tasks

main:
     [echo] arbitrary.property=2.0
..

的pom.xml

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.demo</groupId>
    <artifactId>demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
    </properties>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-antrun-plugin</artifactId>
                <version>1.7</version>
                <executions>
                    <execution>
                        <phase>compile</phase>
                        <configuration>
                            <target>
                                <echo message="arbitrary.property=${arbitrary.property}"/>
                            </target>
                        </configuration>
                        <goals>
                            <goal>run</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    <profiles>
        <profile>
            <id>test1</id>
            <properties>
                <arbitrary.property>1.0</arbitrary.property>
            </properties>
        </profile>
        <profile>
            <id>test2</id>
            <properties>
                <arbitrary.property>2.0</arbitrary.property>
            </properties>
        </profile>
    </profiles>
</project>

答案 1 :(得分:0)

Surefire尽最大努力确保分叉的JVM尽可能与用户环境中的变化隔离开来。如果你想通过thins,你需要使用systemPropertyVariables配置选项来定义分叉JVM的系统属性。

其他人提到了个人资料。通常使用配置文件来注入环境特定的细节是一个糟糕的计划,甚至是Maven Anti-pattern。有一个且只有一个案例是这样的配置文件不是一个反模式(注意我没有推广到一个模式,只是移出反模式类别),这是你的配置文件调整测试环境您没有将tests.jar附加到反应堆。在这种情况下,“调整”工件不会逃避其模块以导致“坏事”(例如,当存储库中的工件部署到存储库时,或者构建是否使用来自存储库的工件时,关于什么配置文件处于活动状态的不确定性本地仓库或具有不同配置文件的远程仓库)

我会在CLI上使用系统属性,并使用systemPropertyVariables配置选项将其传递给集成测试。

如果你想要更多“maven方式”的东西,你可能需要一个maven插件来启动要测试的服务,但对于非基于Java的服务来说这可能非常困难。有关如何使用基于java的服务执行此类操作的示例,请参阅cassandra-maven-plugin