6

我有几个 Maven 项目,比如说,,,a继承自一个父项(我们称之为),并且也是模块(与不同的项目,我们称之为)。bcparentparentsuper

这些项目都有一个pom包装。这些项目中的每一个都有特定的配置,但它们也有一个共同的部分。更具体一点,每个项目有两个 JMeter 测试配置文件:一个专门用于给定项目,另一个对所有项目通用且相同。

问题是 - 我应该如何配置 POM,以便在项目之间共享这个通用配置文件?

一种解决方法是将它们全部合并到super, 并使用配置文件。但是,在这种情况下,我必须手动为每个配置单独构建(而现在我只能构建super)。

有类似的问题,比如这个,但它们处理的是jar插件,这与这种情况无关。

结构,供参考:

  • POM 继承:

        parent
          |
    -------------
    |     |     |
    a     b     c
    
  • 文件结构:

    super
    |
    |-a
    |
    |-b
    |
    |-c
    
4

2 回答 2

7

我出于类似目的使用了maven-remote-resources-plugin 。创建一个 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 将找到标记文件,启用配置文件,并禁用配置文件中包含的所有执行。子项目构建时,marker文件不存在,所以POM主体部分的配置才会生效。

我也将这种技术与 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>
于 2012-07-13T04:29:00.347 回答
0

范围依赖的想法import是您可以将共享资源放入一个单独的项目中,然后由许多其他项目导入;我在想你可以通过这种方式包含你的共享配置文件。

您创建一个带有包装的新项目pom(可能与父项目处于同一级别?),然后将其包含在父项目的dependencyManagement范围import中。然后,您的每个子项目都可以通过继承接收它。只为一个文件制作整个项目似乎有点矫枉过正,但我​​不会有问题。

我实际上并没有用pom-packaged 项目树尝试过这个,所以你可能需要玩一下,但我认为这种方法是合理的。这里有一个(非常广泛的)示例:

导入依赖

于 2012-07-13T08:32:58.303 回答