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


160

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

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

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

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

提案?


なぜMaven Wayではないのですか?それは私にとって完全に有効な主張です。
MaDa

うーん。今、私は人々がこれに反対しているように見える場所を見つけることができません...それで、私はこれが「The Maven Way」ではないように見える私の主張を取り除くために私の元の質問を更新しました。
denishaskin

回答:


149

もちろん、これはプロファイルを使用して行うことができます。親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プロファイルでmavenを実行します、すなわちmvn -P ci clean install


4
正解です。Mavenドキュメントからこれを見つけるのになぜそんなに多くの問題があったのか分かりません。私が行う1つの提案は、統合テストをデフォルトで実行することを好むため、activeByDefaultそのプロファイルに追加し、skip-integration-testsそれらをスキップできるように別の空のプロファイル(例:)を追加する必要があるということです。
denishaskin

7
すべての共有のものを複製せずにこれを行う方法はありますか?
JonnyRaa 2014年

7
maven-release-pluginを使用すると、プロファイルスイッチの背後に隠されているサブモジュールのバージョン番号が更新されないように見えるので注意してください。プロジェクトの他の部分とは異なるバージョン番号のサブモジュールを使用することができます...
Ardesco

8
残念ながら、プロファイルを使用して、pomのメインの<modules>部分で前述したモジュールを除外することはできません。JIRAのissues.apache.org/jira/browse/MNG-5230(およびpom構造全体)は、もう少し慎重に考えれば、完全に十分に実装できたはずです。
エド・ランドール

2
このソリューションは本当に機能しますか?少なくとも私はそれを機能させることができません。@EdRandallと同じ問題があるようです
Gerros

231

Mavenのバージョン3.2.1を使用すると、使用することができ、この機能を追加した-plスイッチ(ショートカット--projectsを持つリスト)、!または-ソースを特定のサブモジュールを除外します)。

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

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

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

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

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

mvn -pl "!submodule1,!submodule2" install

27
重要:ネストされたサブモジュールを除外する場合は、認定バージョンを使用する必要がありますmvn -pl !com.acme:nestedmodule1
LeonardBrüningsDec

3
-plオプションには、artifactIdの前に '[groupId]:'が必要なので、mvn -pl '!:submodule-to-exclude' install
Honsen

4
mvn -pl '!path/to/submodule/directory'groupIdとArtifactIdを使用せずに、を使用することもできます。私の答えは場合に動作submodule1し、submodule2現在のディレクトリに配置されています。
Alexandre DuBreuil 2018年

また、あなたが使用している場合ていることは何も価値がある-pl中でmvn install、あなたは可能性が高いためにそれを使用する必要がありますmvn deployだけでなく
majikman

39

-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

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


編集:ブラックビルドが指摘したように、Maven 3.2.1以降では-elプロジェクトと同様に、リアクターからプロジェクトを除外する新しいフラグ-plあります。


2
ありがとう。これは私にはうまくいきました。また、「-am」(別名「--also-make」)を追加して、指定したモジュールに必要なプロジェクトをビルドすることもできます。
GaZ 2013

1
すごい!私はmvn install -pl .、モジュールを構築せずにローカルリポジトリにのみ親pomをインストールするために使用しました。
Marcin 2013

また、jira.codehaus.org / browse / MNG-5230もご覧ください。これで、reactorからプロジェクトを除外できます。
ブラックビルド2014年

1
codehaus.orgが終了してからのMNG-5230リンク:issues.apache.org/jira/browse/MNG-5230
エドランドール

残念ながら、それは推移的に機能しません。つまり、top / mod1 / mod2があり、上からビルドする場合、-pl '!mod2'はエラーを発生させます。
zakmck

4

マルチモジュールプロジェクトの概念は、プロジェクトの共依存セグメントのニーズに対応するためにあります。このようなクライアントは、EJBやデータアクセスルーチンなどのサービスに依存しています。あなたは可能性あなたの継続的インテグレーション(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サイトでは、プロファイリングメカニズムについて詳しく説明しています。


2

現在(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 --- [情報]プロジェクトをスキップしています

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.