6

私はいくつかのMavenプロジェクトを持っています。たとえば、、、、a単一bc親から継承し(と呼びましょうparent)、モジュールでもあります(とは異なるプロジェクトの、parentと呼びましょうsuper)。

これらのプロジェクトにはすべてpomパッケージがあります。これらの各プロジェクトには特定の構成がありますが、共通の部分もあります。より具体的にするために、各プロジェクトには2つのJMeterテスト構成ファイルがあります。1つは特定のプロジェクトに特化したもので、もう1つはすべてのプロジェクトに共通で同一のものです。

問題は、この共通の構成ファイルがプロジェクト間で共有されるように、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-packaging.markerを親プロジェクトのbasedirに追加します。次に、このプロファイルを親POMに追加します。親プロジェクトがビルドされると、Mavenはマーカーファイルを見つけ、プロファイルを有効にし、プロファイルに含まれるすべての実行を無効にします。子プロジェクトがビルドされると、マーカーファイルが存在しないため、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。子プロジェクトのそれぞれは、継承によってそれを受け取ることができます。プロジェクト全体を1つのファイルだけで作成するのはやり過ぎのように思えるかもしれませんが、問題はありません。

私は実際にパッケージ化されたpomプロジェクトのツリーでこれを試したことがないので、少し遊んでみる必要があるかもしれませんが、私が思うアプローチは健全だと思います。ここに(非常に広範な)例があります:

依存関係のインポート

于 2012-07-13T08:32:58.303 に答える