web-dev-qa-db-fra.com

Lancer un script batch Windows en utilisant le plugin Maven exec bloque la construction même si le script utilise "start"

J'essaie d'effectuer une dégustation d'intégration du déploiement de mon application sur le dessus d'un conteneur personnalisé. Étant donné que mon conteneur est personnalisé, je ne peux pas utiliser le plug-in Maven Cargo pour configurer le conteneur.

Mon conteneur:

  • Doit être démarré par un fichier bat approprié, qui se trouve dans le chemin de la machine sur laquelle les tests sont exécutés. 
  • Peut être fermé manuellement car je n'ai qu'un seul module maven contenant tous mes tests d'intégration, même si un jour j'aimerais savoir comment arrêter le processus une fois mes tests terminés.

Mon problème est que je dois exécuter mon conteneur dans un processus différent, car il doit continuer à s'exécuter pendant l'exécution de mes tests. De plus, j'ai une API dans mes tests qui me laisse attendre que le conteneur soit prêt (une sorte de recherche avec timeout).

J'ai ajouté les lignes suivantes à mon 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>

Cela appellera un script, qui ne contient que

lancer l'appel gs-agent.bat

Cependant, le plugin mvn exec est bloqué et mes tests ne sont pas exécutés. Selon ce qui est suggéré dans Comment exécuter un fichier de commandes à partir de mon application Java? , j'ai modifié mon fichier pom.xml comme suit:

 <configuration>
                <executable>cmd</executable>
                <arguments>
                    <argument>/C</argument>
                    <argument>start</argument>
                    <argument>gs-agent.bat</argument>
                </arguments>
            </configuration>

Mais cela ne semble pas résoudre le problème:

Maven halted

19
Edmondo1984

Voir cette question: Comment exécuter un fichier de commandes à partir de mon application Java?

Les fichiers batch Windows ne sont pas exécutables. Ce sont des scripts exécutés par l'exécutable cmd.

Plus d'information

Le plugin Exec code source indique que Apache Commons Executor est utilisé pour exécuter la ligne de commande. 

Vous pouvez lire beaucoup ici, par exemple dans la documentation d'Apache Commons Executor et leurs/ JIRA , mais la version courte est la suivante: ce n'est pas un problème avec "Maven", c'est un problème avec la plate-forme -dépendante de l'exécution d'une commande exec()

J'ai déjà abordé ce type de problème et la solution que je trouve toujours consiste à décomposer le script .bat en ses commandes réelles et à le lancer directement à partir du plugin exec, plutôt que d'appeler le script.

6
noahlz

le plugin exec n'est pas capable de le faire, et j'ai trouvé le problème aussi: http://jira.codehaus.org/browse/MEXEC-87

Dans le numéro de Jira (lien ci-dessus), il est mentionné et un lien d'un plug-in fork pour exec qui aurait la fonctionnalité. 

Autre que cela, je pense que vous aurez besoin d'utiliser un plugin antrun pour le moment. 

Voici un exemple tiré de la configuration de travail et exécuté avec mvn verify. Cela doit être dans le <plugins>, pas le <pluginManagement> (l'exécutif pourrait résider dans le gestionnaire de plugins très 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>

Notez que spawn="true" est la clé ici si vous ne voulez pas que l'exécution soit bloquée, comme spécifié dans la question. Si vous souhaitez qu'il bloque et voit immédiatement la sortie, définissez-la sur false.

18
eis

Dans mon cas, j'avais des problèmes avec npm et ng .. le problème sous-jacent était que exec-maven-plugin essayait d'exécuter les scripts sh (qui n'avaient aucune extension). 

Renommer 

C:\Users\User\AppData\Roaming\npm\ng à C:\Users\User\AppData\Roaming\npm\ng.sh

et

C:\apps\nodejs\npm à C:\apps\nodejs\npm.sh

résolu le problème.

1
Anand Rockzz

Le code suivant fonctionne pour moi 

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

Source https://maven.Apache.org/guides/mini/guide-using-ant.html

0
Vsegar