我有一个Maven项目,其中包括一个Maven插件(Liquibase Maven插件),它暴露了不同的目标。其中两个目标(update和diff)需要不同的参数,这些参数之间存在冲突(因为两者的语义不同),因此我需要在两个目标执行中为Maven提供不同的属性。
我就是这么做的
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<version>3.4.1</version>
<!-- This configuration is used for every goal except "diff" -->
<configuration>
<propertyFile>src/main/resources/liquibase.properties</propertyFile>
<promptOnNonLocalDatabase>false</promptOnNonLocalDatabase>
</configuration>
<executions>
<execution>
<id>default-cli</id>
<goals>
<goal>diff</goal>
</goals>
<!-- This configuration is used for the "diff" goal -->
<configuration>
<propertyFile>src/main/resources/liquibaseDiff.properties</propertyFile>
<promptOnNonLocalDatabase>false</promptOnNonLocalDatabase>
</configuration>
</execution>
</executions>
</plugin>
但是,这个配置是错误的,因为对于每个目标(diff,更新其他目标),只使用liquibaseDiff.properties
文件。
在Maven中是否有办法为不同的目标传递不同的配置?
插件的配置可以在两个不同的位置完成:
- 所有执行的全局。全局配置是用
<plugin>
下的<configuration>
元素完成的。此配置将被所有执行继承。 - /执行。这是使用
<execution>
下的<configuration>
元素完成的。
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<version>3.4.1</version>
<configuration>
<!-- put the configuration here that is common to all executions -->
</configuration>
<executions>
<execution>
<id>diff</id>
<goals>
<goal>diff</goal>
</goals>
<configuration>
<!-- put the specific configuration of the diff goal here, this will inherit from the global configuration -->
</configuration>
</execution>
<execution>
<id>update</id>
<goals>
<goal>update</goal>
</goals>
<configuration>
<!-- put the specific configuration of the update goal here, this will inherit from the global configuration -->
</configuration>
</execution>
</executions>
</plugin>
默认继承行为是根据元素名称合并配置元素的内容。如果子POM具有特定的元素,则该值将成为有效值。如果子POM没有元素,但是父POM有,则父POM的值将成为有效值。
在冲突的情况下,您可以使用combine.children
和combine.self
控制Maven执行的默认继承。引用Maven文档:
combine.children="append"
将按此顺序将父元素和子元素连接起来。另一方面,combine.self="override"
完全抑制父配置。
除此之外,您还需要注意,当在命令行上执行Maven命令时,如果直接调用目标(例如
mvn liquibase:diff
),它将创建一个id为default-cli
的新执行。因此,由于上面目标diff
的特定配置是在id为diff
的执行中完成的,因此不会使用它。这实际上是正常的,因为相同插件的相同目标可能出现在不同配置的多个执行块中:如果在命令行上执行,没有附加信息,应该使用哪一个?通常,这种情况可以通过两种方式解决:
在命令行上执行一个特定的执行,即您配置的那个。这在Maven 3.3.1中是可能的,您将执行
mvn liquibase:diff@diff
上面命令中的
@diff
是指在POM中配置的执行的唯一<id>
。将您的执行绑定到Maven生命周期的特定阶段,并让它与生命周期的正常流一起执行。这通常是首选的解决方案。在上面的例子中,我们可以,例如,在
diff
执行的执行块中添加<phase>test</phase>
;然后Maven将在构建过程中运行测试阶段时执行它。