Quiero ejecutar comandos de shell desde pom.xml de Maven

105

Quiero ejecutar comandos de shell de Linux con Maven. Esto es lo que probé:

<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>
NareshKumar
fuente
limpie su pregunta y formatee el archivo pom.xml en su pregunta. No es legible.
zengr
12
No quiero ser grosero, pero realmente necesitas aprender a hacer preguntas, no somos psíquicos. ¿Qué hiciste? ¿Qué obtuviste? ¿Cuál es el resultado esperado?
Pascal Thivent

Respuestas:

148

Esto es lo que me ha funcionado:

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

Curtis
fuente
11
Me gustaría agregar que esto no funciona con (al menos) la versión 1.5.0 del complemento, ya que <configuration />debería seguir <executions />y no colocarse allí. Me tomó bastante tiempo encontrar este simple error sintáctico. La salida de error de Maven realmente no es tan útil.
joergl
1
¿Qué fase u objetivo debemos proporcionar si queremos ejecutar el script después de la fase de implementación?
Lucy
3
Las fases de Maven se enumeran aquí: maven.apache.org/guides/introduction/…
Ed Randall
2
Usar <workingDirectory>${basedir}/scripts/</workingDirectory>en el bloque de configuración, en lugar de proporcionar la ruta completa, <executable>también podría ser una buena idea
akn
35

El problema aquí es que no sé qué se espera . Con su configuración actual, invocar el complemento en la línea de comando simplemente funcionaría:

$ mvn exec: exec
[INFO] Escaneado de proyectos ...
[INFO] ----------------------------------------------- -------------------------
[INFO] Edificio Q3491937
[INFO] segmento de tarea: [exec: exec]
[INFO] ----------------------------------------------- -------------------------
[INFO] [exec: exec {ejecución: default-cli}]
[INFO] portátil
[INFO] ----------------------------------------------- -------------------------
[INFO] CONSTRUYE EXITOSO
[INFO] ----------------------------------------------- -------------------------
...

Se configurationusa el global , hostnamese ejecuta el comando ( laptopes mi nombre de host). En otras palabras, el complemento funciona como se esperaba.

Ahora, si desea que un complemento se ejecute como parte de la compilación , debe vincular un objetivo en una fase específica. Por ejemplo, para enlazarlo en 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>

Y entonces:

$ mvn compilar
[INFO] Escaneado de proyectos ...
[INFO] ----------------------------------------------- -------------------------
[INFO] Edificio Q3491937
[INFO] segmento de tareas: [compilar]
[INFO] ----------------------------------------------- -------------------------
[INFO] [recursos: recursos {ejecución: recursos predeterminados}]
[INFO] Uso de codificación 'UTF-8' para copiar recursos filtrados.
[INFO] omitir el directorio de recursos no existente / home / pascal / Projects / Q3491937 / src / main / resources
[INFO] [compilador: compilar {ejecución: compilación predeterminada}]
[INFO] Nada para compilar: todas las clases están actualizadas
[INFO] [exec: exec {ejecución: alguna-ejecución}]
[INFO] portátil
[INFO] ----------------------------------------------- -------------------------
[INFO] CONSTRUYE EXITOSO
[INFO] ----------------------------------------------- -------------------------
...

Tenga en cuenta que puede especificar un configurationdentro de un execution.

Pascal Thivent
fuente
[ERROR] ERROR DE CONSTRUCCIÓN [INFO] ------------------------------------------ ------------------------------ [INFO] Uno o más parámetros obligatorios del complemento no son válidos o faltan para 'exec: exec' [ 0] Dentro de la definición del complemento 'exec-maven-plugin', especifique lo siguiente: <configuration> ... <executable> VALUE </executable> </configuration> -O- en la línea de comando, especifique: '-Dexec. ejecutable = VALOR 'Recibo este error ahora.
NareshKumar
2
@ gnash-85: Todavía no tengo idea de lo que estás haciendo. Usé el fragmento exacto que proporcionó y no tuve ningún problema como se muestra arriba. Actualice su pregunta para mostrar cómo invoca maven (y cuál es su configuración actual si cambió algo).
Pascal Thivent
He puesto el mismo código en un módulo secundario. Y estoy tratando de ejecutar mvn exec: exec desde el pom.xml principal. Y me sale este error. Pero cuando lo ejecuto individualmente, está funcionando.
NareshKumar
5
@ gnash-85: Eso es normal. Cuando invoca mvn exec:execen el padre, mvn lo ejecutará en todos los proyectos de la compilación de múltiples módulos, incluido el padre. Pero el pom principal no tiene ninguna configuración para el complemento que espera executableque se defina, de ahí el mensaje de error.
Pascal Thivent
2
Añadiendo a esta discusión. Si especifica su configurationdentro del executionbloque, funcionará si se ejecuta como parte de un grupo ( mvn install) pero arrojará el specify the following: <configuration>error si se ejecuta directamente con mvn exec:exec.
roo2
19

Resuelto. El problema es que el ejecutable funciona de manera diferente en Linux. Si desea ejecutar el archivo .sh, debe escribir de la siguiente manera. Escríbalo en 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>
james25
fuente
2
¡Gracias! Para mí, como usuario de Windows que prefiere los scripts de shell, ¡esa fue la clave!
Ruik
6

2 opciones:

  1. Quieres ejecutar un comando de maven sin enlazar a ninguna fase, simplemente escribe el comando y maven lo ejecuta , solo quieres que maven ejecute algo, no te importa si estamos en compilación / paquete / ... digamos que quiero correr npm startcon maven, puedes lograrlo con lo siguiente:

mvn exec:exec -Pstart-node

Para eso necesitas la siguiente sección de 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. Desea ejecutar un comando arbitrario de maven mientras se encuentra en una fase específica , por ejemplo, cuando estoy en la fase de instalación que quiero ejecutar npm install, puede hacerlo con:

mvn install

Y para que eso funcione, necesitaría la siguiente sección:

  <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>
Tomer Ben David
fuente
1

¡Gracias! Tomer Ben David. Me ayudó. como estoy haciendo pip install en la carpeta de demostración como mencionaste npm 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>
Eric
fuente