Подтвердить что ты не робот

Как вызвать цель Maven в Ant script?

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

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

4b9b3361

Ответ 1

Пример использования задачи exec с использованием Maven, выполняемого из CLI 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>

Ответ 2

Поскольку ни один из решений не работал у меня, это то, что я придумал:

Предполагая, что вы работаете в 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>

Ответ 3

Вы также можете посмотреть maven ant tasks, который теперь удалился, как описано ниже. Это позволяет запускать определенные цели maven из ant build script. Вы также можете посмотреть этот вопрос SO.

Ответ 4

Вы можете использовать задачу 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

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

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

Ответ 6

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

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

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

Ответ 7

Я использую следующую цель для запуска целей 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"/>

Ответ 8

Вы можете использовать задачу exec и вызвать mvn compile в качестве команды терминала. Это не идеально, поскольку у вас не будет никакого контроля над исполнением, но в остальном я не думаю, что есть способ выполнить цель Maven.

Ответ 9

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

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

Ответ 10

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

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

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

Ответ 11

Maven Ant Задачи GitHub легко запустить Maven с целями Ant.

Установка Создайте каталог lib в корне вашего проекта и поместите в него двоичные файлыmaven-ant-tasks.jar , файл 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 vs taskdef.

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

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

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

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

    Все taskdef настраиваются в 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>