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

Posted

技术标签:

【中文标题】我想从 Maven 的 pom.xml 执行 shell 命令【英文标题】:I want to execute shell commands from Maven's pom.xml 【发布时间】:2011-03-30 08:21:27 【问题描述】:

我想用 Maven 执行 Linux shell 命令。这是我尝试过的:

<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。它不可读。 我并不是要粗鲁,但您确实需要学习如何提问,我们不是通灵者。你做了什么?你得到了什么?预期的结果是什么? 无意冒犯@PascalThivent,但那些了解 Maven 和 pom.xml 的人都知道 OP 指的是什么。 :) 所以如果有人不知道 Maven 或 pom.xml,那么他们可能应该跳过这个问题。这对我来说很明显,可能还有很多喜欢这个问题的人。 【参考方案1】:

以下是对我有用的:

<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>

【讨论】:

我想补充一点,这不适用于(至少)1.5.0 版本的插件,因为&lt;configuration /&gt; 应该跟在&lt;executions /&gt; 之后,而不是放在其中。我花了很长时间才找到这个简单的语法错误。 Maven 的错误输出真的没那么有用。 如果我们想在部署阶段之后运行脚本,我们需要提供什么阶段或目标?? Maven 阶段在此处列出:maven.apache.org/guides/introduction/… 在配置块中使用&lt;workingDirectory&gt;$basedir/scripts/&lt;/workingDirectory&gt;,而不是在&lt;executable&gt; 中提供完整路径也可能是个好主意 “权限被拒绝”,我们如何从 Maven 设置权限?【参考方案2】:

这里的问题是我不知道预期是什么。使用您当前的设置,在命令行上调用插件就可以了:

$ mvn 执行:执行 [INFO] 正在扫描项目... [信息] ------------------------------------------------------------ ------------------------- [INFO] 楼 Q3491937 [INFO] 任务段:[exec:exec] [信息] ------------------------------------------------------------ ------------------------- [信息] [执行:执行执行:默认-cli] [信息] 笔记本电脑 [信息] ------------------------------------------------------------ ------------------------- [信息] 构建成功 [信息] ------------------------------------------------------------ ------------------------- ...

使用全局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 编译 [INFO] 正在扫描项目... [信息] ------------------------------------------------------------ ------------------------- [INFO] 楼 Q3491937 [INFO] 任务段:[编译] [信息] ------------------------------------------------------------ ------------------------- [信息] [资源:资源执行:默认资源] [INFO] 使用 'UTF-8' 编码复制过滤的资源。 [INFO] 跳过不存在的资源目录 /home/pascal/Projects/Q3491937/src/main/resources [信息] [编译器:编译执行:默认编译] [INFO] 无需编译 - 所有类都是最新的 [INFO] [exec:exec execution: some-execution] [信息] 笔记本电脑 [信息] ------------------------------------------------------------ ------------------------- [信息] 构建成功 [信息] ------------------------------------------------------------ ------------------------- ...

请注意,您可以在 execution 中指定 configuration

【讨论】:

[错误] 构建错误 [信息] ---------------------------------- -------------------------------------- [INFO] 一个或多个必需的插件参数无效/缺少'exec:exec' [0] 在插件'exec-maven-plugin'的定义中指定以下内容: ... VALUE -OR- 在命令上行,指定:'-Dexec.executable=VALUE' 我现在收到此错误。 @gnash-85:我仍然不知道你在做什么。我使用了提供的确切 sn-p you 并且没有问题,如上所示。请更新您的问题以显示您如何调用 Maven(以及如果您更改了某些内容,您当前的配置是什么)。 我已将相同的代码放在子模块中。我正在尝试从父 pom.xml 执行 mvn exec:exec。我得到这个错误。但是当我单独执行它时它正在工作。 @gnash-85:这很正常。当您在父级上调用mvn exec:exec 时,mvn 将在多模块构建的所有项目(包括父级)上运行它。但是父 pom 没有任何期望定义 executable 的插件配置,因此出现错误消息。 加入这个讨论。如果您在 execution 块内指定 configuration,则如果作为组 (mvn install) 的一部分运行,它将起作用,但如果直接使用 mvn exec:exec 运行,则会引发 specify the following: &lt;configuration&gt; 错误。【参考方案3】:

解决了。问题是,可执行文件在 Linux 中以不同的方式工作。如果要运行 .sh 文件,应将 exec-maven-plugin 添加到 pom.xml 文件的 &lt;plugins&gt; 部分。

<plugin>
  <artifactId>exec-maven-plugin</artifactId>
  <version>3.0.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>

【讨论】:

谢谢!对于喜欢 shell 脚本的 Windows 用户来说,这是关键! 你如何设置那个sh文件的执行权限?【参考方案4】:

2 个选项:

    你想从 maven 执行一个命令而不绑定到任何阶段,你只需键入命令并 maven 运行它,你只是想 maven 运行一些东西,你不在乎我们是否在编译/package/... 假设我想用 maven 运行 npm start,您可以通过以下方式实现:

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>
    您想在特定阶段从 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>

【讨论】:

【参考方案5】:

谢谢!汤姆·本·大卫。它帮助了我。正如您提到的那样,我正在演示文件夹中进行 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>

【讨论】:

【参考方案6】:

这对我也有用。后来,我最终切换到maven-antrun-plugin 以避免Eclipse 中的警告。我更喜欢尽可能使用默认插件。示例:

<plugin>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>3.0.0</version>
    <executions>
        <execution>
            <id>get-the-hostname</id>
            <phase>package</phase>
            <configuration>
                <target>
                    <exec executable="bash">
                        <arg value="-c"/>
                        <arg value="hostname"/>
                    </exec>
                </target>
            </configuration>
            <goals>
                <goal>run</goal>
            </goals>
        </execution>
    </executions>
</plugin>

【讨论】:

第二行右括号中的一个小错字应该是 【参考方案7】:

接受的答案在 2021 年版本 3.0.0 中不起作用。 execution 标记内的 configuration 标记会产生一条消息,“参数 'exectuable' 丢失或无效。”

解决方案是将configuration 标记移到executions 标记之外。

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

【讨论】:

以上是关于我想从 Maven 的 pom.xml 执行 shell 命令的主要内容,如果未能解决你的问题,请参考以下文章

如何在 maven repo 下获取所有 pom.xml

如何在 maven pom.xml 中更改 shell 脚本输出以使用

我想从 Github Actions 中的 pom.xml 获取项目版本

Maven工程pom.xml文件秒变gradle工程的命令

Maven安装:? - 如何创建一个发布候选?

在 Maven 中成功构建仍然在 Eclipse 中显示错误