Как вызвать цель Maven в сценарии Ant? - PullRequest
31 голосов
/ 28 сентября 2011

Можно ли вызвать или выполнить цель Maven в сценарии Ant?

Скажем, у меня есть цель муравья, которая называется "распределить", и внутри которой мне нужно вызвать цель maven "скомпилировать" из другого файла pom.xml.

Ответы [ 11 ]

31 голосов
/ 14 апреля 2014

Поскольку ни одно из решений не помогло мне, я пришел к такому выводу:

Предполагается, что вы работаете в Windows:

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

или в UNIX:

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

или если вы хотите, чтобы он работал как в UNIX, так и в 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>
20 голосов
/ 28 сентября 2011

Пример использования задачи exec с использованием Maven, запускаемой из интерфейса командной строки 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>
11 голосов
/ 28 сентября 2011

Вы также можете посмотреть на задания maven ant , которые теперь удалены, хотя, как прокомментировано ниже. Это позволяет вам запускать конкретные задачи maven из вашего скрипта сборки ant. Вы также можете посмотреть на этот ТАК вопрос .

7 голосов
/ 11 октября 2013

Вы можете использовать задачу java (этот пример похож на ответ @ mateusz.fiolka, но также работает в 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>

протестировано с Maven 3.0.5

5 голосов
/ 14 ноября 2016

Здесь есть полное решение:

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

Вывод примерно такой ...

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
1 голос
/ 19 января 2016

Я использую следующую цель для запуска целей maven clean, install и clean install.Работает нормально.

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

Ваше свойство maven.home должно указывать на домашний каталог maven.Например,

<property name="maven.home" value="D:\\Downloads\\apache-maven-3.0.5"/>
1 голос
/ 17 декабря 2015

Я использовал этот ответ из @ Adam Siemion выше, но я не хотел, чтобы отдельные цели работали в Windows или Linux.Вместо этого я просто устанавливаю свойство в верхней части моего скрипта ant:

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

Затем в середине моего скрипта я использую оператор 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>
0 голосов
/ 14 июня 2019

Maven Ant Tasks github легко запускаемый maven с целями из Ant.

Установка Создайте каталог lib в корневом каталоге вашего проекта и поместите файл maven-ant-tasks.jar binaries , sonatype . внутри него.

<?xml version="1.0" encoding="UTF-8"?>

<project name="maven" default="build" xmlns:artifact="antlib:org.apache.maven.artifact.ant">
    <property environment="env" />

    <!-- <get src="http://search.maven.org/remotecontent?filepath=org/apache/maven/maven-ant-tasks/2.1.3/maven-ant-tasks-2.1.3.jar" dest="lib/maven-ant-tasks-2.1.3.jar"/> -->

    <path id="maven-ant-tasks.classpath" path="lib/maven-ant-tasks-2.1.3.jar" />
    <typedef resource="org/apache/maven/artifact/ant/antlib.xml" uri="antlib:org.apache.maven.artifact.ant" classpathref="maven-ant-tasks.classpath" />

    <record name="build.log" loglevel="verbose" action="start"/>
    <target name="build" description="project build ant script">
        <fail unless="env.MAVEN_HOME" message="Environment variable MAVEN_HOME was not found on your system!" />
        <artifact:mvn mavenHome="${env.MAVEN_HOME}" fork="true">
            <arg value="clean" />
            <arg value="install" />
            <arg value="-Pqa" />
        </artifact:mvn>
    </target>
</project>

Небольшая информация между этими элементами ant typedef против taskdef.

  • Typedef: Использование объявления typedef позволяет хранить библиотеку задач Ant в любом месте (например, контроль исходного кода) и указывать ее местоположение в файле сборки.

    <typedef name="urlset" classname="com.mydomain.URLSet"/>
    
  • Taskdef Добавляет определение задачи в текущий проект, чтобы эту новую задачу можно было использовать в текущем проекте.

    Использование PropertyFiles.java задачи путем ее внешнего добавления в taskdef.

    <taskdef name = "propertyfiles"
          classname = "org.apache.tools.ant.taskdefs.optional.PropertyFiles" />
    

    Все taskdef настроены в apache-ant-1.9.4\lib\ant.jar\org\apache\tools\ant\taskdefs\defaults.properties файлах свойств. Но я создал внешний класс и поместил в JAR-файл. Но вместо добавления записи в defaults.properties файл извне извещает задачу по taskdef.

    Второй способ, вы можете создать jar-файл, перечислить все tasksef в одном файле свойств и сослаться на ресурс antcontrib Вы можете поместить JAR в каталог Ant lib и установить classpath.

    <taskdef resource="net/sf/antcontrib/antcontrib.properties">
        <classpath>
            <pathelement location="${env.ANT_HOME}/lib/ant-contrib-0.6.jar"/>
        </classpath>
    </taskdef>
    
0 голосов
/ 21 мая 2019

plexus кажется более старым решением для встраивания Maven.

Взгляните на проект Apache Maven Embedder .

В этом пункте статьи описывается встраивание Maven в код Java, без локально установленного исполняемого файла Maven.

0 голосов
/ 02 апреля 2017

Из ответа Тьяго, я должен добавить это, чтобы оно заработало.

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