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


105

我想用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。它不可读。
zengr 2010年

12
我的意思不是无礼,但您确实需要学习如何提出问题,我们不是通灵的。你做了什么?你得到了什么?预期的结果是什么?
Pascal Thivent

Answers:


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

1
如果要在部署阶段之后运行脚本,我们需要提供什么阶段或目标?
露西

3
Maven的阶段在这里列出:maven.apache.org/guides/introduction/...
艾德·兰德尔

2
使用<workingDirectory>${basedir}/scripts/</workingDirectory>in配置块,而不是提供完整路径<executable>也可能是一个好主意
akn

35

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

$ mvn exec:执行
[INFO]正在扫描项目...
[INFO] ----------------------------------------------- -------------------------
[INFO]大楼Q3491937
[INFO]任务段:[exec:exec]
[INFO] ----------------------------------------------- -------------------------
[INFO] [exec:exec {执行:default-cli}]
[INFO]手提电脑
[INFO] ----------------------------------------------- -------------------------
[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编译
[INFO]正在扫描项目...
[INFO] ----------------------------------------------- -------------------------
[INFO]大楼Q3491937
[INFO]任务段:[编译]
[INFO] ----------------------------------------------- -------------------------
[INFO] [resources:resources {execution:default-resources}]
[INFO]使用'UTF-8'编码复制过滤的资源。
[INFO]跳过不存在的resourceDirectory / home / pascal / Projects / Q3491937 / src / main / resources
[INFO] [编译器:编译{执行:默认编译}]
[INFO]没有要编译的-所有类都是最新的
[INFO] [exec:exec {执行:部分执行}]
[INFO]手提电脑
[INFO] ----------------------------------------------- -------------------------
[INFO]成功建立
[INFO] ----------------------------------------------- -------------------------
...

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


[错误]内置错误[信息] ------------------------------------------ ------------------------------ [INFO]一个或多个必需的插件参数对于'exec:exec'是无效/缺失的[ 0]在插件“ exec-maven-plugin”的定义内,指定以下内容:<configuration> ... <executable> VALUE </ executable> </ configuration> -OR-在命令行上,指定:-Dexec。可执行文件=值',我现在收到此错误。
NareshKumar 2010年

2
@ gnash-85:我仍然不知道你在做什么。我使用了提供的确切代码段,并且没有出现上述问题。请更新您的问题,以显示如何调用Maven(以及如果更改了某些内容,当前配置是什么)。
Pascal Thivent

我已经将相同的代码放在子模块中。我正在尝试从父pom.xml执行mvn exec:exec。我得到这个错误。但是当我单独执行它时,它正在工作。
NareshKumar

5
@ gnash-85:正常。在mvn exec:exec父级上调用时,mvn将在多模块构建的所有项目(包括父级)上运行它。但是父pom没有为期望executable定义的插件进行任何配置,因此出现错误消息。
Pascal Thivent

2
添加到此讨论。如果您configuration在代码execution块中指定您的代码,则如果作为组(mvn install)的一部分运行,它将起作用,但specify the following: <configuration>如果直接与一起运行,则会引发错误mvn exec:exec
roo2 '16

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脚本的Windows用户而言,这就是关键!
鲁克

6

2个选项:

  1. 您想从Maven执行命令而不绑定任何阶段,只需键入命令并运行Maven,您只想让Maven运行某些东西,不管我们是否在compile / package /中,...说我想npm start与Maven 一起运行,可以通过以下方法实现:

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

谢谢!Tomer Ben David。它帮助了我。正如我所说的那样,在演示文件夹中进行pip安装

<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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.