web-dev-qa-db-ja.com

exec-maven-pluginを使用して、Windowsでシェルスクリプトを実行します

Exec-maven-pluginを使用して3つのパラメーターでシェルスクリプトを実行するpomがあります。実行時mvn clean install -X -e、そのステップでエラーで失敗します、

[DEBUG] Toolchains are ignored, 'executable' parameter is set to C:\dev\intellij\projects\project-in-question\driver/src/main/scripts/dependencies.sh
[DEBUG] Executing command line: [C:\dev\intellij\projects\project-in-question\driver\src\main\scripts\dependencies.sh, C:\dev\intellij\projects\project-in-question\driver\target/project-in-question.dependencies, C:\dev\intellij\projects\project-in-question\driver\target, third-parameter]  

[ERROR] Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.3.2:exec (dependencies) on project project-in-question: Command execution failed.: Cannot run program "C:\dev\intellij\projects\project-in-question\driver\src\main\scripts\dependencies.sh" (in directory "C:\dev\intellij\projects\project-in-question\driver"): CreateProcess error=193, %1 is not a valid Win32 application -> [Help 1]
org.Apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.3.2:exec (dependencies) on project project-in-question: Command execution failed.

Pom.xmlの関連部分:

        ...
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.3.2</version>
            <executions>
                <execution>
                   ...
                </execution>
                <execution>
                    <id>dependencies</id>
                    <phase>compile</phase>
                    <goals>
                        <goal>exec</goal>
                    </goals>
                    <configuration>
                        <workingDirectory>${project.basedir}</workingDirectory>
                        <executable>${project.basedir}/src/main/scripts/dependencies.sh</executable>
                        <arguments>
                            <argument>${project.build.directory}/${project.artifactId}.dependencies</argument>
                            <argument>${project.build.directory}</argument>
                            <argument>project-in-question</argument>
                        </arguments>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

これは、私が(1つだけ)Windows 10 x64で実行していて、他のユーザーがMacで実行しているオペレーティングシステムに関連しているように感じます。 Cygwinでこのコマンドを実行すると、正常に完了し、正しいパラメーターを使用してシェルスクリプトが実行されます。 cmd.exeを使用しても、このスクリプトを実行できます。

しかし、Mavenを使用してプロジェクトを構築すると、毎回失敗します。シェルスクリプトを空にしたので、文字通り次のもので構成されていました。

#!/bin/sh
echo "hello world"

実際の元のシェルスクリプトは3つのパラメーターを取りますが、%1が有効なWin32アプリケーションではないというまったく同じエラーメッセージが表示されます。このスクリプトは引数を取りませんし、参照もしません。 「HelloWorld」をエコーするだけです。

さまざまなパラメーターのスラッシュが混在していることに気づきましたが、それが原因かどうかはわかりません。 MavenからWindowsでシェルスクリプトを実行しようとすることと関係があるようです。

誰かがこれを手伝って、何が起こっているのか説明できますか?追加の詳細が必要な場合は、お知らせください。詳細をお知らせします。

6
liltitus27

コマンドラインは*:

[dependencies.sh, project-in-question.dependencies, target, third-parameter]

しかし、Windowsではdependencies.shは実行可能ファイルではありません。 cygwinで実行するには、次のように実行する必要があります*:

[c:\cygwin\bin\run.exe, dependencies.sh, project-in-question.dependencies, target, third-parameter]

さて、他の人はpom.xmlをそれに変更することに満足しないだろうと思います。


考えられる解決策の1つは、 " Windows Subsystem For Linux "をインストールすることです。


別の解決策は、次のようなものを含むdependencies.sh.batを作成することです。

c:\cygwin\bin\run.exe dependencies.sh %*

ただし、このソリューションでは、Windowsが最初に.batファイルを選択するように、コンピューターのdependencies.shの名前を変更する必要があります。


別の妥協案は、実行をに変更することかもしれません

<executable>sh</executable>
  <arguments>
    <argument>-c</argument>
    <argument>${project.basedir}/src/main/scripts/dependencies.sh ${project.build.directory}/${project.artifactId}.dependencies ${project.build.directory} project-in-question</argument>

そして、あなたのシステムでは、PATHにsh.batがあります。

c:\cygwin\bin\run.exe sh %*

*読みやすくするためにフォルダを省略しました

5

実行可能ファイルとしてcmdを使用してみて、その後に/Cを最初の引数として、シェルスクリプトのパス名を次の引数として、その後に残りの引数を指定します。

            <executable>cmd</executable>
            <arguments>
                <argument>/C</argument>
                <argument>${project.basedir}/src/main/scripts/dependencies.sh</argument>
2
Jörg

Cygwinはcygwin\bin実行可能ファイルを提供するため、%PATH%パスをWindowsbash.exe環境変数に追加します。次に、。pomをプラットフォームに依存しないように変更します。

           ...
                    <execution>
                        <id>dependencies</id>
                        <phase>compile</phase>
                        <goals>
                            <goal>exec</goal>
                        </goals>
                        <configuration>
                            <workingDirectory>${project.basedir}</workingDirectory>
                            <executable>bash</executable>
                            <arguments>
                                <argument>${project.basedir}/src/main/scripts/dependencies.sh</argument>
                                <argument>${project.build.directory}/${project.artifactId}.dependencies</argument>
                                <argument>${project.build.directory}</argument>
                                <argument>project-in-question</argument>
                            </arguments>
                        </configuration>
                    </execution>
           ...

@Samuel Kirschnerが上記で指摘したように、Cygwinの代わりにWindows Subsystem for Linux(WSL)を使用することもできます。これは、Windows%PATH%でbash実行可能ファイルを自動的に提供し、。pomで動作します。 =指定された構成

0
Francois B