Как вызвать цель Maven в Ant script?
Можно ли вызвать или выполнить цель Maven в Ant script?
Скажем, у меня есть цель Ant, называемая "распространять", и внутри которой мне нужно вызвать цель компиляции maven из другого pom.xml.
Ответы
Ответ 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>