web-dev-qa-db-fra.com

Comment appeler un objectif Maven dans un script Ant?

Est-il possible d'appeler ou d'exécuter un objectif Maven dans un script Ant?

Supposons que j'ai une cible appelée "distribuer" et à l'intérieur de laquelle je dois appeler un objectif "compiler" maven à partir d'un autre pom.xml.

31
Dunith Dhanushka

Voici un exemple d'utilisation d'une tâche d'exécution utilisant Maven à partir de la CLI de Windows:

<target name="buildProject" description="Builds the individual project">
    <exec dir="${source.dir}\${projectName}" executable="cmd">
        <arg value="/C"/>
        <arg value="${env.MAVEN_HOME}\bin\mvn.bat"/>
        <arg line="clean install" />
</exec>
</target>
21
mateusz.fiolka

Comme aucune des solutions ne fonctionnait pour moi, voici ce que j'ai proposé:

En supposant que vous utilisez Windows:

<target name="mvn">
    <exec dir="." executable="cmd">
        <arg line="/c mvn clean install" />
    </exec>
</target>

ou sous UNIX:

<target name="mvn">
    <exec dir="." executable="sh">
        <arg line="-c 'mvn clean install'" />
    </exec>
</target>

ou si vous voulez que cela fonctionne sous UNIX et Windows:

<condition property="isWindows">
    <os family="windows" />
</condition>

<condition property="isUnix">
    <os family="unix" />
</condition>

<target name="all" depends="mvn_windows, mvn_unix"/>

<target name="mvn_windows" if="isWindows">
    <exec dir="." executable="cmd">
        <arg line="/c mvn clean install" />
    </exec>
</target>

<target name="mvn_unix" if="isUnix">
    <exec dir="." executable="sh">
        <arg line="-c 'mvn clean install'" />
    </exec>
</target>
30
Adam Siemion

Vous pouvez aussi regarder maven ant tasks qui est maintenant retiré, comme indiqué ci-dessous. Cela vous permet d'exécuter des objectifs Maven spécifiques à partir de votre script ant build. Vous pouvez aussi regarder cette SO question .

11
Raghuram

Vous pouvez utiliser une tâche Java (cet exemple est similaire à @ mateusz.fiolka answer mais fonctionne également sous Linux).

<target name="mvn-install">
    <property environment="env" />
    <path id="classpath">
        <fileset dir="${env.M2_HOME}/boot">
            <include name="plexus-classworlds-*.jar" />
        </fileset>
    </path>
    <property name="mvn.mainclass" value="org.codehaus.plexus.classworlds.launcher.Launcher" />

    <Java classname="${mvn.mainclass}" classpathref="classpath" fork="true" failonerror="true">
        <jvmarg value="-Dclassworlds.conf=${env.M2_HOME}/bin/m2.conf" />
        <jvmarg value="-Dmaven.home=${env.M2_HOME}" />
        <arg value="install" />
    </Java>
</target>

testé avec maven 3.0.5

6
tbrugz

Ici, il y a une solution complète:

<target name="mvn_windows_setup" if="isWindows">
    <property name="mvn.executable" value="cmd" />
    <property name="mvn.args" value="/c" />
</target>

<target name="mvn_unix_setup" if="isUnix">
    <property name="mvn.executable" value="sh" />
    <property name="mvn.args" value="-c" />
</target>

<target name="run-mvn-goals" depends="mvn_windows_setup, mvn_unix_setup">

    <exec dir="${basedir}" executable="${mvn.executable}">
        <arg line="${mvn.args} 'mvn ${p_goals}'" />
    </exec>

</target>

<!-- EXAMPLES OF HOW TO USE -->

<!-- let's say you want to run mvn clean install -->
<target name="mvn-clean-install">

    <antcall target="run-mvn-goals">
        <param name="p_goals" value="clean install"/>
    </antcall>
</target>

<!-- or maybe you want to clean, package but skipping tests -->
<target name="mvn-clean-package-notests">

    <antcall target="run-mvn-goals">
        <param name="p_goals" value="clean package -DskipTests"/>
    </antcall>
</target>

La sortie est quelque chose comme ça ...

Buildfile: /home/.../build.xml
deploy-complete:
deploy-complete:
mvn_windows_setup:
mvn_unix_setup:
run-mvn-goals:
     [exec] [INFO] Scanning for projects...
     [exec] [INFO]                                                                         
     [exec] [INFO] ------------------------------------------------------------------------
     [exec] [INFO] Building wpm 0.0.1-SNAPSHOT
     [exec] [INFO] ------------------------------------------------------------------------
     [exec] [INFO] 
     [exec] [INFO] --- maven-clean-plugin:2.6.1:clean (default-clean) @ wpm ---
     ...
     ...
     ...
       [exec] [INFO] BUILD SUCCESS
     [exec] [INFO] ------------------------------------------------------------------------
     [exec] [INFO] Total time: 28.817 s
     [exec] [INFO] Finished at: 2016-11-14T14:01:34-05:00
     [exec] [INFO] Final Memory: 84M/872M
     [exec] [INFO] ------------------------------------------------------------------------
BUILD SUCCESSFUL
Total time: 31 seconds
5
thiagoh

J'ai utilisé cette réponse de @Adam Siemion ci-dessus, mais je ne voulais pas de cibles distinctes pour Windows ou Linux. Au lieu de cela, je viens de définir la propriété vers le haut de mon script ant:

<condition property="isAntRunningOnWindows">
    <os family="windows" />
</condition>

Puis, au milieu de mon script, j'utilise une instruction if-then-else:

<if>
    <equals arg1="${isAntRunningOnWindows}" arg2="true" />
    <then>
        <echo message="OS is Windows" />
        <exec dir="." executable="cmd">
            <arg line="/c mvn clean package" />
        </exec>
    </then>
    <else>
        <echo message="OS is Linux/Unix" />
        <exec dir="." executable="sh">
            <arg line="-c 'mvn clean package'" />
        </exec>
    </else>
</if>
1
11101101b

J'utilise la cible suivante pour exécuter les objectifs maven clean, install et clean install. Fonctionne bien.

<project name="Maven run goals" basedir="."  
         xmlns:artifact="antlib:org.Apache.maven.artifact.ant"
         xmlns:rsel="antlib:org.Apache.tools.ant.types.resources.selectors">

    <target name="maven clean">
        <artifact:mvn mavenHome="${maven.home}" fork="true">
            <arg value="clean" />
        </artifact:mvn>
    </target>

    <target name="maven install">
        <artifact:mvn mavenHome="${maven.home}" fork="true">
            <arg value="install" />
        </artifact:mvn>
    </target>

    <target name="maven clean-install">
        <artifact:mvn mavenHome="${maven.home}" fork="true">
            <arg value="clean" />
            <arg value="install" />
        </artifact:mvn>
    </target>

</project>

Votre propriété maven.home doit pointer vers le répertoire personnel de maven. Par exemple,

<property name="maven.home" value="D:\\Downloads\\Apache-maven-3.0.5"/>
1
Lucky

Vous pouvez utiliser exec task et appeler mvn compile en tant que commande de terminal. Ce n’est pas idéal car vous n’avez aucun contrôle sur l’exécution, mais sinon, je ne pense pas qu’il soit possible d’exécuter un objectif Maven.

0
Simeon

De Thiagoh répondre, je dois ajouter ceci pour que cela fonctionne.

 <condition property="isWindows">
                    <os family="windows" />
 </condition>

 <condition property="isLinux">
                    <os family="unix" />
 </condition>

<target name="mvn_windows_setup" if="isWindows">
    <property name="mvn.executable" value="cmd" />
    <property name="mvn.args" value="/c" />
</target>

<target name="mvn_unix_setup" if="isLinux">
    <property name="mvn.executable" value="sh" />
    <property name="mvn.args" value="-c" />
</target>

<target name="run-mvn-goals" depends="mvn_windows_setup, mvn_unix_setup">

    <exec dir="${basedir}" executable="${mvn.executable}">
        <arg line="${mvn.args} 'mvn ${p_goals}'" />
    </exec>

</target>
0