Mavenのpom.xmlからシェルコマンドを実行したい


105

LinuxシェルコマンドをMavenで実行したい。これが私が試したものです:

<plugin>  
  <groupId>org.codehaus.mojo</groupId> 
  <artifactId>exec-maven-plugin</artifactId> 
  <version>1.1.1</version> 
  <executions>
    <execution>
      <goals>
        <goal>exec</goal> 
      </goals>
    </execution>
  </executions>
  <configuration>
    <executable>hostname</executable> 
  </configuration>
</plugin>

質問を整理し、pom.xmlをフォーマットしてください。読めません。
zengr

12
私は失礼なことをするつもりはありませんが、質問をする方法を本当に学ぶ必要があります。私たちは精神的ではありません。あなたは何をした?何を手に入れましたか?期待される結果は何ですか?
Pascal Thivent、2010

回答:


148

これが私のために働いているものです:

<plugin>
  <artifactId>exec-maven-plugin</artifactId>
  <groupId>org.codehaus.mojo</groupId>
  <executions>
    <execution><!-- Run our version calculation script -->
      <id>Version Calculation</id>
      <phase>generate-sources</phase>
      <goals>
        <goal>exec</goal>
      </goals>
      <configuration>
        <executable>${basedir}/scripts/calculate-version.sh</executable>
      </configuration>
    </execution>
  </executions>
</plugin>


11
これは、プラグインの(少なくとも)バージョン1.5.0では機能しないことを付け加えておきます。プラグインの<configuration />後に続く必要があり、<executions />そこに配置されないためです。この単純な構文上の間違いを見つけるのにかなり時間がかかりました。Mavenのエラー出力はそれほど役に立ちません。
joergl 2016

1
展開フェーズ後にスクリプトを実行する場合、どのフェーズまたは目標を提供する必要がありますか?
ルーシー、

3
Mavenのフェーズは次のとおり
Ed Randall

2
<workingDirectory>${basedir}/scripts/</workingDirectory>フルパスを指定する代わりに、構成ブロックで使用する<executable>ことも良いアイデアかもしれません
akn

35

ここでの問題は、何が期待されているのかわからないことです。現在の設定では、コマンドラインでプラグインを呼び出すだけで機能します。

$ mvn exec:exec
[情報]プロジェクトをスキャンしています...
[情報] ----------------------------------------------- -------------------------
[情報]建物Q3491937
[INFO]タスクセグメント:[exec:exec]
[情報] ----------------------------------------------- -------------------------
[情報] [exec:exec {実行:default-cli}]
[INFO]ラップトップ
[情報] ----------------------------------------------- -------------------------
[INFO]成功したビルド
[情報] ----------------------------------------------- -------------------------
...

グローバルconfigurationが使用され、hostnameコマンドが実行されます(laptopホスト名です)。つまり、プラグインは期待どおりに動作します。

ビルドの一部としてプラグインを実行たい場合は、特定のフェーズでゴールをバインドする必要があります。たとえば、次のようにバインドしますcompile

  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.1.1</version>
    <executions>
      <execution>
        <id>some-execution</id>
        <phase>compile</phase>
        <goals>
          <goal>exec</goal>
        </goals>
      </execution>
    </executions>
    <configuration>
      <executable>hostname</executable>
    </configuration>
  </plugin>

その後:

$ mvn compile
[情報]プロジェクトをスキャンしています...
[情報] ----------------------------------------------- -------------------------
[情報]建物Q3491937
[情報]タスクセグメント:[コンパイル]
[情報] ----------------------------------------------- -------------------------
[INFO] [resources:resources {execution:default-resources}]
[情報] 'UTF-8'エンコーディングを使用して、フィルタリングされたリソースをコピーします。
[情報]存在しないresourceDirectory / home / pascal / Projects / Q3491937 / src / main / resourcesをスキップします
[INFO] [compiler:compile {execution:default-compile}]
[INFO]コンパイルするものはありません-すべてのクラスが最新です
[INFO] [exec:exec {execution:some-execution}]
[INFO]ラップトップ
[情報] ----------------------------------------------- -------------------------
[INFO]成功したビルド
[情報] ----------------------------------------------- -------------------------
...

configuration内部を指定できることに注意してくださいexecution


[エラー]ビルドエラー[情報] ------------------------------------------ ------------------------------ [INFO] 1つ以上の必要なプラグインパラメータが無効であるか、 'exec:exec'にありません[ 0]プラグイン 'exec-maven-plugin'の定義内で、次のように指定します。 executable = VALUE 'このエラーが発生します。
NareshKumar

2
@ gnash-85:私はあなたが何をしているのかまだ分かりません。私はあなたが提供した正確なスニペットを使用し、上記のように問題はありませんでした。質問を更新して、mavenを呼び出す方法(および何かを変更した場合の現在の構成)を表示してください。
Pascal Thivent、2010

同じコードを子モジュールに入れました。そして、私は親pom.xmlからmvn exec:execを実行しようとしています。そして、私はこのエラーを受け取ります。しかし、私がそれを個別に実行すると、それは機能しています。
NareshKumar

5
@ gnash-85:それは正常です。mvn exec:exec親を呼び出すと、mvnは、親を含むマルチモジュールビルドのすべてのプロジェクトでそれを実行します。しかし、親pomには、executableが定義されることを期待するプラグインの設定がないため、エラーメッセージが表示されます。
Pascal Thivent、2010

2
この考察に追加します。ブロックconfiguration内を指定した場合execution、グループ(mvn install)の一部としてspecify the following: <configuration>実行すると機能しますが、で直接実行するとエラーがスローされmvn exec:execます。
roo2 2016年

19

解決しました。問題は、実行可能ファイルがLinuxでは別の方法で機能していることです。.shファイルを実行したい場合は、以下のように記述してください。pom.xmlに書き込んでください

    <plugin>
        <artifactId>exec-maven-plugin</artifactId>
    <version>1.6.0</version>
        <groupId>org.codehaus.mojo</groupId>
        <executions>
            <execution><!-- Run our version calculation script -->
                <id>Renaming build artifacts</id>
                <phase>package</phase>
                <goals>
                    <goal>exec</goal>
                </goals>
                <configuration>
                    <executable>bash</executable>
            <commandlineArgs>handleResultJars.sh</commandlineArgs>
                </configuration>
            </execution>
        </executions>
    </plugin>

2
ありがとう!シェルスクリプトを好むWindowsユーザーとしての私にとって、それが鍵でした!
Ruik

6

2つのオプション:

  1. フェーズにバインドせずにmavenからコマンドを実行したい場合は、コマンドを入力してmavenがそれを実行するだけmavenが何かを実行したいだけの場合は、コンパイル/パッケージ/ ... npm startmavenで実行したい場合は、以下で達成できます。

mvn exec:exec -Pstart-node

そのためには、以下のmavenセクションが必要です

  <profiles>
    <profile>
      <id>start-node</id>
      <build>
        <plugins>
          <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.3.2</version>
            <executions>
              <execution>
                <goals>
                  <goal>exec</goal>
                </goals>
              </execution>
            </executions>
            <configuration>
              <executable>npm</executable>
              <arguments><argument>start</argument></arguments>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>

  </profiles>
  1. 特定のフェーズにいるときにmavenから任意のコマンド実行したい。たとえば、インストールフェーズにいるときに実行したいnpm install場合は、次のように実行できます。

mvn install

そしてそれが機能するためには、以下のセクションが必要です:

  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.3.2</version>
    <executions>

      <execution>
        <id>npm install (initialize)</id>
        <goals>
          <goal>exec</goal>
        </goals>
        <phase>initialize</phase>
        <configuration>
          <executable>npm</executable>
          <arguments>
            <argument>install</argument>
          </arguments>
        </configuration>
      </execution>

1

ありがとう!元ベン・デイビッド。それは私を助けました。あなたがnpm installについて言及したように、私はデモフォルダにpip installをしているので

<groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.3.2</version>
            <executions>
              <execution>
                <goals>
                  <goal>exec</goal>
                </goals>
              </execution>
            </executions>
            <configuration>
              <executable>pip</executable>
              <arguments><argument>install</argument></arguments>                            
             <workingDirectory>${project.build.directory}/Demo</workingDirectory>
            </configuration>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.