我想从 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 版本的插件,因为<configuration />
应该跟在<executions />
之后,而不是放在其中。我花了很长时间才找到这个简单的语法错误。 Maven 的错误输出真的没那么有用。
如果我们想在部署阶段之后运行脚本,我们需要提供什么阶段或目标??
Maven 阶段在此处列出:maven.apache.org/guides/introduction/…
在配置块中使用<workingDirectory>$basedir/scripts/</workingDirectory>
,而不是在<executable>
中提供完整路径也可能是个好主意
“权限被拒绝”,我们如何从 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'的定义中指定以下内容:mvn exec:exec
时,mvn 将在多模块构建的所有项目(包括父级)上运行它。但是父 pom 没有任何期望定义 executable
的插件配置,因此出现错误消息。
加入这个讨论。如果您在 execution
块内指定 configuration
,则如果作为组 (mvn install
) 的一部分运行,它将起作用,但如果直接使用 mvn exec:exec
运行,则会引发 specify the following: <configuration>
错误。【参考方案3】:
解决了。问题是,可执行文件在 Linux 中以不同的方式工作。如果要运行 .sh
文件,应将 exec-maven-plugin 添加到 pom.xml
文件的 <plugins>
部分。
<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 pom.xml 中更改 shell 脚本输出以使用