plugin - Lanzar una secuencia de comandos de lote de Windows utilizando el complemento Maven exec bloquea la compilaciĆ³n aunque la secuencia de comandos usa "inicio"
exec maven project (5)
Estoy tratando de realizar una prueba de integración de la implementación de mi aplicación en la parte superior de un contenedor personalizado. Como mi contenedor es personalizado, no puedo usar el complemento Maven Cargo para configurar el contenedor.
Mi contenedor:
- Tiene que iniciarse a través de un archivo bat adecuado, que se encuentra en la ruta de la máquina donde se ejecutan las pruebas.
- Se puede cerrar de forma manual ya que tengo un solo módulo maven que contiene todas mis pruebas de integración, incluso si un día me gustaría saber cómo cerrar el proceso después de que se completen mis pruebas.
Mi problema es que tengo que ejecutar mi contenedor en un proceso diferente, porque necesita seguir funcionando mientras se realizan mis pruebas. Además, tengo una API en mis pruebas que me permite esperar a que el contenedor esté listo (una especie de búsqueda con tiempo de espera).
He agregado las siguientes líneas a mi pom.xml
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.1</version>
<executions>
<execution>
<phase>pre-integration-test</phase>
<goals>
<goal>exec</goal>
</goals>
</execution>
</executions>
<configuration>
<executable>scripts/start-agent.bat</executable>
</configuration>
</plugin>
Esto llamará a una secuencia de comandos, que contiene solo
empezar llamada gs-agent.bat
Sin embargo, el plugin mvn exec se queda trabado y mis pruebas no se ejecutan. De acuerdo con lo que se sugiere en ¿Cómo ejecuto un archivo por lotes desde mi aplicación Java? , He modificado mi pom.xml de la siguiente manera:
<configuration>
<executable>cmd</executable>
<arguments>
<argument>/C</argument>
<argument>start</argument>
<argument>gs-agent.bat</argument>
</arguments>
</configuration>
Pero esto no parece resolver el problema:
De acuerdo con la documentación del plugin ejecutivo maven:
exec:exec execute programs and Java programs in a separate process.
exec:java execute Java programs in the same VM.
Lea la documentación completa sobre exec: exec aquí
El código Fallow funciona para mí
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.3</version>
<executions>
<execution>
<phase>generate-sources</phase>
<configuration>
<tasks>
<exec dir="${project.basedir}" executable="Script.bat" failonerror="true">
</exec>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
Fuente https://maven.apache.org/guides/mini/guide-using-ant.html
En mi caso tuve problemas con npm y ng ... el problema subyacente era exec-maven-plugin
estaba tratando de ejecutar los scripts sh (que no tenían extensiones).
Renombrar
C:/Users/User/AppData/Roaming/npm/ng
a C:/Users/User/AppData/Roaming/npm/ng.sh
y
C:/apps/nodejs/npm
a C:/apps/nodejs/npm.sh
resuelve el problema.
el plugin exec no puede hacer esto, y también encontré el problema: http://jira.codehaus.org/browse/MEXEC-87
En el problema de jira vinculado anteriormente, hay una mención y un enlace de un fork para el complemento de exec que tendría la funcionalidad.
Aparte de eso, creo que necesitarás usar un plugin antrun por el momento.
Aquí hay un ejemplo tomado de la configuración de trabajo y ejecutado con mvn verify
. Esto debe estar en los <plugins>
, no <pluginManagement>
(exec podría residir en pluginmanagement muy bien).
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.6</version>
<executions>
<execution>
<phase>pre-integration-test</phase>
<configuration>
<target>
<exec executable="cmd.exe"
spawn="true">
<arg value="/c"/>
<arg value="D:/myfolder/test.bat"/>
</exec>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
Tenga en cuenta que spawn="true"
es la clave aquí si no desea que se bloquee la ejecución, como se especifica en la pregunta. Si quiere que se bloquee y vea la salida de inmediato, configúrelo en falso.
Vea esta pregunta: ¿Cómo ejecuto un archivo por lotes desde mi aplicación Java?
Los archivos por lotes de Windows no son ejecutables. Son scripts que son ejecutados por el ejecutable cmd
.
Más información
El código fuente del complemento Exec revela que Apache Commons Executor se usa para ejecutar realmente la línea de comando.
Hay mucha lectura que puede hacer aquí, es decir, en la documentación del ejecutor Apache Commons y sus problemas JIRA , pero la versión corta es: esto no es un problema con "Maven", es un problema con la naturaleza dependiente de la plataforma de ejecutando un comando exec()
.
Ya he abordado este tipo de problema anteriormente, y la solución que siempre intento es deconstruir el script .bat
en sus comandos reales y lanzarlo directamente desde el complemento de exec
, en lugar de llamar al script.