我有几个Maven项目,比如a
、b
、c
,它们继承自单亲(我们称之为parent
),也是模块(与parent
不同的项目,我们称其为super
)。
这些项目都有一个pom
包。这些项目中的每一个都有特定的配置,但它们也有一个共同的部分。更具体地说,每个项目都有两个JMeter测试配置文件:一个专用于给定项目,另一个通用于所有项目。
问题是-我应该如何配置POM,以便在项目之间共享这个公共配置文件
一个解决方法是将它们全部合并到super
中,并使用配置文件。然而,在这种情况下,我必须手动为每个配置进行单独的构建(而现在我只能构建super
)。
也有类似的问题,比如这个问题,但它们涉及jar
插件,这与本例无关。
结构,供参考:
-
POM继承:
parent | ------------- | | | a b c
-
文件结构:
super | |-a | |-b | |-c
我使用maven远程资源插件也有类似的目的。创建一个jar类型的单独资源项目(com.company:resourceProj)。将JMeter资源文件放在/src/main/resources
中。
/src/main/resources/common.properties (your filenames obviously)
/src/main/resources/a.properties
etc.
按照示例中的说明创建捆绑包。
现在,将此配置添加到您的父POM中(如果需要,请在测试配置文件中):
<properties>
<shared.resources.dir>${project.build.directory}/shared-resources</shared.resources.dir>
</properties>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-remote-resources-plugin</artifactId>
<executions>
<execution>
<id>load-resources</id>
<phase>initialize</phase>
<goals>
<goal>process</goal>
</goals>
<configuration>
<resourceBundles>
<resourceBundle>com.company:resourceProj:version</resourceBundle>
</resourceBundles>
<attached>false</attached>
<outputDirectory>${shared.resources.dir}</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
现在,告诉Maven这些是测试资源。如果您的测试资源元素在模块之间是一致的,这也可以进入父级,如果它们不同,则进入模块POM。(根据我使用Maven 3的经验,在子项目中定义的资源优先于父项目;它们不会合并。)
<testResources>
<testResource>
<directory>${shared.resources.dir}</directory>
<includes>
<include>common.properties</include>
<include>${module.file}.properties</include>
</includes>
</testResource>
<!-- any other test resources here -->
</testResources>
在子模块中,定义资源模块属性(这是模块a):
<properties>
<module.file>a</module.file>
</properties>
根据您的用例进行调整。
----编辑----
如果配置被放入父POM中,则父POM可能无法构建,这取决于子POM提供的配置。当我们构建共享的基础/父项目时,我们不希望要求定义子项目(继承人)应该提供的所有属性。因此,我们在构建共享项目时激活此配置文件,以绕过仅适用于儿童的任何内容。
为此,请将一个空文件pom-packaging.marker
添加到父项目的basedir中。然后将此配置文件添加到父POM中。当构建父项目时,Maven将找到标记文件,启用概要文件,并禁用概要文件中包含的所有执行。当构建子项目时,标记文件不存在,因此POM主要部分中的配置将生效。
我在Enforcer插件中也使用了这种技术——父插件定义了应该应用于从父插件继承的项目的Enforcer规则,但在构建时无法满足这些规则。如果插件提供了"跳过"属性,您可以在该配置文件中启用该属性,而不是在插件配置中使用phase=none。
<profile>
<id>pom-packaging</id>
<activation>
<file>
<exists>pom-packaging.marker</exists>
</file>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-remote-resources-plugin</artifactId>
<executions>
<execution>
<id>load-resources</id>
<phase>none</phase> <!-- disables this execution -->
</execution>
</executions>
</plugin>
.... other plugin executions here ....
</plugins>
</build>
</profile>
import
作用域依赖项的想法是,您可以将共享资源放入一个单独的项目中,然后由其他一些项目导入;我想你可以用这种方式包含你的共享配置文件。
您创建了一个带有封装pom
的新项目(可能与父项目处于同一级别?),然后将其包含在具有范围import
的父项目的dependencyManagement
部分中。然后,您的每个子项目都可以通过继承来接收它。只为一个文件制作一个完整的项目似乎有些过头了,但我对此不会有任何问题。
实际上,我还没有在pom
打包项目的树上尝试过这种方法,所以你可能需要考虑一下,但我认为这种方法是合理的。这里有一个(非常广泛的)例子:
导入依赖项