我有几个Maven项目,说a
, b
, c
,从一个单亲继承(让我们称之为parent
),并且也正在模块(不同的项目比的parent
,让我们叫它super
)。
这些项目都有一个pom
的包装。 每个项目都有特定的配置,但他们也有一个共同的部分。 更speficic,每个项目中的两个JMeter测试配置文件:一个专门用于给定的项目,另一个是常见的,对所有项目相同。
问题是-我应该如何配置的POM所以这个常见的配置文件在项目之间共享?
一种解决方法可能是将所有这些合并成super
,以及使用配置文件。 然而,在这种情况下,我将不得不为每个配置手工做一个单独的版本(而现在就可以建造super
)。
有类似的问题,像这一个 ,但他们处理的jar
插件,这是不相关的这种情况。
结构,以供参考:
我已经使用了Maven的远程资源-插件,出于类似的目的。 创建类型罐子的一个单独的资源项目(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>
在子模块,定义资源模块属性(这是模块):
<properties>
<module.file>a</module.file>
</properties>
适应这种满足你的使用情况。
---- ----编辑
如果配置放入父POM,父POM可能会失败取决于由孩子提供什么样的配置来构建。 当我们正在建设的共享基础/父项目,我们不希望要求所有应该由子项目(inheriters)提供的属性的定义。 因此,我们建立共享项目绕过任何只适用于儿童时激活此配置文件。
要做到这一点,添加一个空文件pom-packaging.marker
父项目的BASEDIR。 然后,此配置文件添加到父POM。 当父项目建成后,Maven会找到标记文件,启用的配置,并禁用所有包含在配置文件中执行的。 当一个孩子项目建成,标记文件不存在,所以在POM的主要部分的配置生效。
我用与强制实施插件这种技术也 - 父定义应适用于从父继承项目实施者的规则,但是当它是建立在不能满足的规则。 如果插件提供了一个“跳过”属性,你可以启用在此配置文件,而不是在插件配置使用阶段为无。
<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
(也许在同一水平的家长吗?),然后将其包含在父母的dependencyManagement
与范围部分import
。 然后,每个孩子的项目可以通过继承得到它。 这似乎有点小题大做,使整个项目为一个单一的文件,但我不会有这样的问题。
我还没有实际使用的树尝试过这种pom
-packaged项目,所以你可能要了一下周围玩,但我认为这种方法是合理的。 有一个(非常广泛的)这里的例子:
进口依赖