非JAR Maven项目之间共享公共资源(Sharing common resources betw

2019-06-26 05:47发布

我有几个Maven项目,说abc ,从一个单亲继承(让我们称之为parent ),并且也正在模块(不同的项目比的parent ,让我们叫它super )。

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

问题是-我应该如何配置的POM所以这个常见的配置文件在项目之间共享?

一种解决方法可能是将所有这些合并成super ,以及使用配置文件。 然而,在这种情况下,我将不得不为每个配置手工做一个单独的版本(而现在就可以建造super )。

有类似的问题,像这一个 ,但他们处理的jar插件,这是不相关的这种情况。

结构,以供参考:

  • POM继承:

      parent | ------------- | | | abc 
  • 文件结构:

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

Answer 1:

我已经使用了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>


Answer 2:

有这个想法import范围的依赖性是,你可以把共享资源投入到一个单独的项目,然后通过一些其他的进口; 我想你可能包括以这种方式共享的配置文件。

创建带包装一个新的项目pom (也许在同一水平的家长吗?),然后将其包含在父母的dependencyManagement与范围部分import 。 然后,每个孩子的项目可以通过继承得到它。 这似乎有点小题大做,使整个项目为一个单一的文件,但我不会有这样的问题。

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

进口依赖



文章来源: Sharing common resources between non-JAR maven projects