Можно ли вызвать или выполнить цель Maven в Ant script?
Скажем, у меня есть цель Ant, называемая "распространять", и внутри которой мне нужно вызвать цель компиляции maven из другого pom.xml.
Можно ли вызвать или выполнить цель Maven в Ant script?
Скажем, у меня есть цель Ant, называемая "распространять", и внутри которой мне нужно вызвать цель компиляции maven из другого pom.xml.
Пример использования задачи 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>
Поскольку ни один из решений не работал у меня, это то, что я придумал:
Предполагая, что вы работаете в 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>
Вы также можете посмотреть maven ant tasks, который теперь удалился, как описано ниже. Это позволяет запускать определенные цели maven из ant build script. Вы также можете посмотреть этот вопрос SO.
Вы можете использовать задачу 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
Здесь есть полное решение:
<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
Я использовал этот ответ от @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>
Я использую следующую цель для запуска целей 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"/>
Вы можете использовать задачу exec и вызвать mvn compile
в качестве команды терминала. Это не идеально, поскольку у вас не будет никакого контроля над исполнением, но в остальном я не думаю, что есть способ выполнить цель Maven.
От ответа Тьяго, я должен добавить это, чтобы оно работало.
<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>
plexus
кажется, является более старым решением для встраивания Maven.
Взгляните на проект Apache Maven Embedder.
В этом абзаце статьи описывается встраивание Maven в код Java без локально установленного исполняемого файла Maven.
Установка Создайте каталог 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>