web-dev-qa-db-ja.com

Mavenビルド中にサブモジュールをスキップする

特定の環境ではサブモジュールをスキップできる必要があります。

問題のモジュールには統合テストが含まれており、実行に30分かかります。したがって、CIサーバー上でビルドするときにそれを組み込みたいのですが、開発者がローカルでビルドする(そしてテストを実行する)ときは、そのモジュールをスキップします。

プロファイル設定でこれを行う方法はありますか?私はいくつかのグーグルを行ったが、ここで他の質問/回答を見たが、良い解決策を見つけられなかった。

1つのオプションは、そのサブモジュールを親pom.xmlから完全に削除し、CIサーバーに別のプロジェクトを追加してそのモジュールをビルドするだけだと思います。

提案?

130
denishaskin

もちろん、これはプロファイルを使用して実行できます。親pom.xmlで次のようなことができます。

  ...
   <modules>
      <module>module1</module>
      <module>module2</module>  
      ...
  </modules>
  ...
  <profiles>
     <profile>
       <id>ci</id>
          <modules>
            <module>module1</module>
            <module>module2</module>
            ...
            <module>module-integration-test</module>
          </modules> 
      </profile>
  </profiles>
 ...

CIでは、ciプロファイル、つまりmvn -P ci clean installでmavenを実行します

139
Raghuram

Mavenバージョン3.2.1はこの機能を追加しました。-plスイッチ( ショートカット for --projectsリスト)を!または-(- source )特定のサブモジュールを除外します。

mvn -pl '!submodule-to-exclude' install
mvn -pl -submodule-to-exclude install

キャラクターをバッシュする際には注意してください!は特殊文字なので、単一引用符で囲む必要があります(私がしたように)か、バックスラッシュ文字でエスケープする必要があります。

複数のモジュールを除外する構文は、インクルードと同じです

mvn -pl '!submodule1,!submodule2' install
mvn -pl -submodule1,-submodule2 install

EDITWindowsは一重引用符を好まないようですが、bashでは必要です。 Windowsでは、二重引用符を使用します(@awilkinsonに感謝)

mvn -pl "!submodule1,!submodule2" install
180

-plコマンドライン引数を指定することにより、どのリアクタプロジェクトをビルドするかを決定することが可能です:

$ mvn --help
[...]
 -pl,--projects <arg>                   Build specified reactor projects
                                        instead of all projects
[...]

次のいずれかの形式のパラメーターのコンマ区切りリストを受け入れます。

  • pOMを含むフォルダーの相対パス
  • [groupId]:artifactId

したがって、次の構造が与えられます。

project-root [com.mycorp:parent]
  |
  + --- server [com.mycorp:server]
  |       |
  |       + --- orm [com.mycorp.server:orm]
  |
  + --- client [com.mycorp:client]

次のコマンドラインを指定できます。

mvn -pl .,server,:client,com.mycorp.server:orm clean install

すべてを構築します。リスト内の要素を削除して、必要なモジュールのみをビルドします。


編集: blackbuild が指摘したように、Maven 3.2.1の時点で 新しい-elフラグがあります これは、-plが行うことと同様に、リアクターからプロジェクトを除外します。

37
skuro

マルチモジュールプロジェクトの概念は、プロジェクトの相互依存セグメントのニーズに対応するためのものです。このようなクライアントは、EJBやデータアクセスルーチンなどに依存するサービスに依存します。 couldこの方法で継続的インテグレーション(CI)テストをグループ化します。 CIのテストは、アプリケーションロジックの変更に対応する必要があると言って、それを合理化します。

プロジェクトが次のように構成されているとします:

project-root
  |
  + --- ci
  |
  + --- client
  |
  + --- server

project-root/pom.xmlはモジュールを定義します

<modules>
  <module>ci</module>
  <module>client</module>
  <module>server</module>
</modules>

ci/pom.xmlは、次のようなプロファイルを定義します。

... 
<profiles>
  <profile>
    <id>default</id>
    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>
    <plugin>
       <artifactId>maven-surefire-plugin</artifactId>
       <configuration>
         <skip>true</skip>
       </configuration>
     </plugin>
  </profile>
  <profile>
    <id>CI</id>
    <plugin>
       <artifactId>maven-surefire-plugin</artifactId>
       <configuration>
         <skip>false</skip>
       </configuration>
     </plugin>
  </profile>
</profiles>

これにより、CIという名前のプロファイルがアクティブな場合を除き、Mavenはこのモジュールのテストをスキップします。 CIサーバーにmvn clean package -P CIを実行するように指示する必要があります。 Maven Webサイトには プロファイリングメカニズムの詳細な説明 があります。

4
Sri Sankaran

現在(1.1.1バージョンから)ピットに「スキップ」フラグがあります。

したがって、次のようなことができます:

    <profile>
        <id>pit</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.pitest</groupId>
                    <artifactId>pitest-maven</artifactId>
                    <configuration>
                        <skip>true</skip>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>

あなたのモジュールで、ピットはスキップします

[情報] --- pitest-maven:1.1.3:mutationCoverage(default-cli)@ module-Selenium --- [情報]プロジェクトをスキップしています

2
twillouer