能否从Maven运行Bash脚本?

40

为了创建我的应用程序配置,我需要运行Bash脚本。有没有可能在Maven中集成执行Bash脚本,也许有一些插件可以使用?


2
可能是I want to execute shell commands from maven's pom.xml的重复问题。 - Spotlight
7个回答

26

使用Bash Maven Plugin是否有帮助?(免责声明:我是创始人,请发送反馈意见)

<build>
    <plugins>
        <plugin>
            <!-- Run with:
                mvn bash:run
                mvn install
            -->
            <groupId>com.atlassian.maven.plugins</groupId>
            <artifactId>bash-maven-plugin</artifactId>
            <version>1.0-SNAPSHOT</version>
            <executions>
                <execution>
                    <id>test</id>
                    <phase>integration-test</phase>
                    <goals>
                        <goal>run</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <script>
                    # Here you can execute shell commands
                    echo "Tomcat will start"
                    /opt/apache-tomcat/bin/startup.sh
                </script>
            </configuration>
        </plugin>
    </plugins>
</build>

你需要将此Maven插件安装到你自己的Maven仓库中。

就像Konstantin所说:当你执行shell脚本时,你不再具备可移植性。


我已经添加了一个例子。你还需要知道什么?你认为我的回答很没用,所以我得到了-2分吗? - Adrien
4
@Adrien 为什么?为什么?为什么?你为什么要用Bash脚本污染pom.xml文件?如果可以避免,为什么要调用bash来使构建不具备可移植性?如果你必须在Linux系统上调用bash,为什么不只是在src/main/scripts/下调用maven-exec-plugin插件的脚本呢?我认为你的Bash maven插件不太可能被广泛使用(也许你只是出于学习体验而编写它...那好吧,但不要推荐其他人使用它)。也许你可以解释一下为什么它比其他选项更好? - Jared
4
  1. 有时候用Bash写脚本比使用Maven/AntRun快30倍(一个原因是,我们可以从命令行运行Bash脚本,但我们不能在Maven中运行单个执行标识)。
  2. 使用maven-exec-plugin运行Bash脚本会将代码移到另一个文件中,这对pom.xml的清晰度不利。然而,最好还是遵循编写可移植的pom.xml文件的最佳实践,所以最好使用maven-antrun-plugin。
- Adrien
4
@Adrien,我相信这不是Maven的设计方式 :) 插件/构件的作者应该将其部署到Maven Central,并让他人从那里使用。 - yegor256
2
@yegor256 这就是开源的设计理念:最有动力的人为每个人改进事物(并获得荣誉)。顺便说一句,我不在Atlassian了,所以我必须分叉插件,所以你最好自己做。 - Adrien
显示剩余2条评论

20
你可以这样做,查看答案:

我想从Maven的pom.xml文件中执行shell命令

但这并不是一个好建议,因为这会产生不太可移植的构建。你首先为什么需要这样做呢?使用此插件通常表示项目构建中存在某些奇怪的需求。


2
同意。如果您确实需要在POM中进行自定义配置,请考虑使用基于Java的脚本语言Groovy(更具可移植性)。http://docs.codehaus.org/display/GMAVEN/Executing+Groovy+Code - Mark O'Connor
2
@gmaven已经停止使用(可能是因为您的评论)。 - Jared

7

看起来更像:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.8</version>
    <executions>
        <execution>
            <id>generateSources</id>
            <phase>generate-sources</phase>
            <configuration>
                <tasks>
                    <exec executable="/bin/bash">
                        <arg value="myFirst.sh" />
                        <arg value="inputOne" />
                    </exec>
                    <exec executable="/bin/bash">
                        <arg value="src/mySecond.sh" />
                        <arg value="inputTwo" />
                    </exec>
                </tasks>
            </configuration>
            <goals>
                <goal>run</goal>
            </goals>
        </execution>
    </executions>
</plugin>

使用myFirst.sh脚本:

echo "call to myFirst.sh, message ${1}"

6

问题已解决。问题在于可执行文件在bash中以不同的方式工作。这段代码是有效的。将其写入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>

3
如果可能的话,我建议使用运行在JVM内部的脚本语言,并在项目中捕获依赖项或在maven存储库中捕获依赖项。这样您的构建就是平台无关的,而且您的依赖项也被捕获了(即使您失去了构建机器并意识到您的bash脚本只适用于该机器)。我在这篇文章中展示了使用jacl的示例。还有很好的使用javascript和groovy的antrun示例(虽然可能有更直接的方法直接调用它们)。

没有什么是平台无关的。即使要运行Maven,也必须先安装Maven。顺便说一下,Java也需要被安装才能运行。 - ingyhere

3

要尝试使用命令,您可以使用exec: exec

$ mvn exec:exec -q -Dexec.executable=echo -Dexec.args="your   arguments"
your arguments

$ mvn exec:exec -q -Dexec.executable=echo -Dexec.args="'your   arguments'"
your   arguments

这展示了:

  • 传递参数:如果您需要传递多个参数:只需用空格分隔它们
  • 如果您需要传递带有空格的参数:将其用引号括起来,就像在bash脚本/终端中所做的那样
  • -q 用于关闭mvn日志

3
使用maven-antrun-plugin插件。这样,你可以比使用exec-maven-plugin更容易地顺序执行多个可执行文件。示例:
* 这里最重要的是 <exec> 标签。
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <executions>
        <execution>
            <phase>generate-sources</phase>
            <configuration>
                <tasks>
                    <exec executable="my1.sh">
                        <arg value="input1"/>
                    </exec>
                    <exec executable="my2.sh">
                        <arg value="input2"/>
                    </exec>
                </tasks>
            </configuration>
            <goals>
                <goal>run</goal>
            </goals>
        </execution>
    </executions>
</plugin>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接