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

Shell 在maven构建中定义特定于机器的资源的最佳实践?,shell,maven,environment-variables,Shell,Maven,Environment Variables,在maven构建中是否有标准的方法来提供特定于环境的资源 例如,我们希望我们的构建将在应用程序中使用的本地服务的特定IP地址不同的环境中运行 一种选择是将其设置为shell环境变量,但不清楚这是否会传播到运行单元测试的surefire jvm 另一种选择是在pom.xml子类文件中提供此信息,但这会带来其他负担(每个开发人员都需要维护自己的pom文件),这当然会破坏任何类型的自动生成环境。下面的示例演示如何使用生成配置文件来获取不同的属性值集 例子 您可以使用-p参数激活其中一个构建配置文件 $

在maven构建中是否有标准的方法来提供特定于环境的资源

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

一种选择是将其设置为shell环境变量,但不清楚这是否会传播到运行单元测试的surefire jvm


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

下面的示例演示如何使用生成配置文件来获取不同的属性值集

例子 您可以使用-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

4.0.0
com.demo
演示
1.0-快照
maven antrun插件
1.7
编译
跑
测试1
1
测试2
2

以下示例显示了如何使用生成配置文件拾取不同的属性值集

例子 您可以使用-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

4.0.0
com.demo
演示
1.0-快照
maven antrun插件
1.7
编译
跑
测试1
1
测试2
2

Surefire尽最大努力确保分叉JVM尽可能与用户环境中的各种变化隔离开来。如果希望传递thin,则需要使用配置选项定义分叉JVM的系统属性

其他人提到了个人资料。通常,使用概要文件来注入特定于环境的细节是一个糟糕的计划,甚至是一个Maven反模式。只有一种情况是这样的配置文件不是反模式(注意,我没有升级到模式,只是移出了反模式类别),在这种情况下,您的配置文件调整了测试环境,并且您没有将
tests.jar
附加到反应器。在这种情况下,“调整过的”工件将不会脱离其模块而导致“不好的事情”(例如,当存储库中的工件部署到repo时,不确定哪个配置文件处于活动状态,或者构建是否使用来自本地repo或具有不同配置文件的远程repo的工件)

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


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

Surefire尽最大努力确保分叉JVM尽可能与用户环境中的变化隔离开来。如果希望传递thin,则需要使用配置选项定义分叉JVM的系统属性

其他人提到了个人资料。通常,使用概要文件来注入特定于环境的细节是一个糟糕的计划,甚至是一个Maven反模式。只有一种情况是这样的配置文件不是反模式(注意,我没有升级到模式,只是移出了反模式类别),在这种情况下,您的配置文件调整了测试环境,并且您没有将
tests.jar
附加到反应器。在这种情况下,“调整过的”工件将不会脱离其模块而导致“不好的事情”(例如,当存储库中的工件部署到repo时,不确定哪个配置文件处于活动状态,或者构建是否使用来自本地repo或具有不同配置文件的远程repo的工件)

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

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