Использование Maven из Ant

Существуют ли плагины ant, которые обертывают maven, чтобы я мог использовать его функции управления зависимостями, чтобы загружать для меня jar-файлы и помещать их в папку lib моей сборки ant?

Моя конкретная проблема заключается в том, что я использую плагин Crap4j для Hudson, но пока он не поддерживает Maven. Поскольку это небольшой проект, maven - это излишество, но я не хочу обходиться без mvn dependency:copy-dependcies, если мне это не нужно.

Какие-либо предложения? (кроме того, чтобы сосать это)


person Allain Lalonde    schedule 31.03.2009    source источник


Ответы (9)


Если вы считаете, что Maven является излишним в вашем проекте, вы можете/должны попробовать Apache Ivy: это очень мощная библиотека управления зависимостями, похожая на Maven.

Если вы размещаете проект в Интернете, взгляните также на Ivy Roundup, это хранилище определений Ivy для различных библиотек.

person Vladimir    schedule 31.03.2009
comment
После некоторой с трудом выигранной конфигурации я запустил это как шарм. Огромное спасибо. - person Allain Lalonde; 02.04.2009

Существует новый набор задач Ant, использующих Mercury. Mercury — это рефакторинг кода, который станет основой взаимодействия Maven 3 с репозиториями Maven (и OSGi), реализуемого Олегом Гусаковым. Mercury хорошо протестирован, и вы можете начать использовать его в проектах Ant уже сегодня. Взгляните на некоторые из практических документов, которые написал Олег:

http://people.apache.org/~ogusakov/sites/mercury-ant/mercury-ant-tasks/howto.html

Вот простой пример использования Mercury в файле Ant build.xml. Следующий файл сборки создает путь к классам, который зависит от версии 3.0 артефакта asm:

<javac srcdir="src/main/java"
       destdir="target/classes">
  <classpath> 
    <deps>
      <dependency name="asm:asm:3.0"/>
    </deps>
  </classpath>
</javac>

Существует множество дополнительных функций, таких как поддержка проверки подписей PGP или дайджестов MD5. Вы также можете начать определять различные репозитории, от которых зависит Mercury. Этот XML позволяет определить ссылку на репозиторий, такой как Nexus, в дополнение к использованию локального каталога в качестве репозитория:

<repo id="myCentral" 
 url="http://localhost:8081/nexus/contengs/groups/public"/>
<repository dir="/my/local/repo"/>

<javac srcdir="src/main/java"
       destdir="target/classes">
  <classpath> 
    <deps>
      <dependency name="asm:asm:3.0"/>
    </deps>
  </classpath>
</javac>

Если вам нужно сослаться на репозиторий, требующий аутентификации, Mercury поддерживает сохранение имени пользователя и пароля:

<repo id="myCentral" 
 url="http://localhost:8081/nexus/contengs/groups/public">
  <auth name="foo" pass="bar"/>
</repo>

<javac srcdir="src/main/java"
       destdir="target/classes">
  <classpath> 
    <deps>
      <dependency name="asm:asm:3.0"/>
    </deps>
  </classpath>
</javac>

Наиболее привлекательной является возможность публикации артефакта в репозитории из файла сборки Ant. Если вы работаете в организации любого масштаба, вам следует задуматься о развертывании артефактов в менеджере репозитория, таком как Nexus. С Mercury вы можете начать развертывание артефактов в менеджере репозитория без необходимости использования Maven. Вот файл сборки, который определяет аутентифицированный репозиторий и записывает артефакт:

<repo id="myCentral" 
 url="http://localhost:8081/nexus/contengs/groups/public">
  <auth name="foo" pass="bar"/>
</repo>

<write repoid="myCentral"
       name="t:t:1.0"
       file="${basedir}/target/t.jar"/>

Меркурий готов к использованию, и вы можете ожидать от Олега много разработок в будущем. Если вы хотите начать его использовать, лучше всего посмотреть на Страница Олега с практическими рекомендациями. (Примечание: эта информация скоро будет включена в Полное руководство)

person Tim O'Brien    schedule 31.03.2009
comment
На сегодняшний день он все еще не обновлен, и версия является SNAPSHOT альфа-1. - person Brice; 01.01.2012
comment
Это нормально, но я не думаю, что вы можете выполнить чистую установку mvn. - person Ring; 08.02.2013

Хотя ртутные задачи работают, я их не использовал. У меня был хороший успех с их предшественниками, maven-ant-tasks. Их довольно просто запустить, если у вас уже есть под рукой POM.

<project name="blah" xmlns:artifact="antlib:org.apache.maven.artifact.ant">
  <!-- If you drop the maven-ant-tasks in ~/.ant/lib, you don't need these two bits. -->
  <taskdef uri="antlib:org.apache.maven.artifact.ant"
           resource="org/apache/maven/artifact/ant/antlib.xml"
           classpathref="ant.classpath" />
  <path id="ant.classpath">
    <fileset dir="${ant.tasks.dir}">
      <include name="*.jar" />
    </fileset>
  </path>
  <target name="resolve" description="--> retrieve dependencies with maven">
      <!-- Resolve dependencies -->
      <artifact:dependencies filesetId="dependency.fileset">
          <pom file="pom.xml" />
      </artifact:dependencies>
      <!-- Copy all dependencies to the correct location. -->
      <copy todir="${web.dir}/WEB-INF/lib">
          <fileset refid="dependency.fileset" />
          <!-- This mapper strips off all leading directory information -->
          <mapper type="flatten" />
      </copy>
  </target>
</project>

Мне нравится хранить свои банки задач ant внутри проекта, поэтому я добавил taskdef и path. Но если вы хотите поместить maven-ant-tasks-2.0.9.jar в ~/.ant/lib, вам не нужно объявлять этот материал. Я думаю.

person Dominic Mitchell    schedule 01.04.2009
comment
Вы правы насчет размещения файла maven-ant-task.jar. Эти две строки нужны вам только в том случае, если они есть внутри вашего проекта, а не в папке lib вашего муравья. Вот как я однажды решил проблему stackoverflow.com/a/32950670/1793718 - person Lucky; 19.01.2016

Просто используйте Maven Ant Tasks. Их можно загрузить на обычной странице загрузки maven.

person whaley    schedule 01.04.2009
comment
+1 - это 2012 год, и maven-ant-tasks - лучший способ, который я нашел для использования управления зависимостями через ant. Я всерьез пытался использовать ivy несколько лет назад, но в конце концов отказался от него и просто использовал maven-ant-tasks для проектов, предназначенных только для муравьев, и maven, когда это было возможно. Ivy — это (был) просто повторная реализация основной идеи maven без каких-либо дополнительных преимуществ, кроме другого имени (которого для многих было достаточно для продажи). Однако сегодня все больше проектов просто (да, просто) используют maven и прибегают к ant только в крайних случаях (imo). Если код будет (повторно) использоваться, усовершенствуйте проект как можно скорее. - person michael; 31.07.2012

Обратитесь к этому: Почему следует использовать Maven Ant Tasks вместо Maven или Ivy

Я бы не рекомендовал Айви по причинам, указанным в ссылке выше.

person Peter Thomas    schedule 15.01.2010
comment
Аргументы против Айви фальшивые. Если вы действительно хотите использовать Maven, то не используйте Ivy. Сказать, что Maven лучше, чем Ivy, потому что Ivy не похожа на Maven, интересно. Я уверен, что никто не купится на это. - person Steven Devijver; 14.11.2011

Запустить цель Maven из Ant очень просто.

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

Используя это, вы можете запускать любые цели Maven из Ant...

Наслаждаться....

person Dhaval Patel    schedule 11.07.2011
comment
Это не кроссплатформенность, и для этой цели лучше подходят задачи Maven Ant. - person gouessej; 22.11.2014
comment
@dhawal Я пробовал это, но получаю [exec] Система не может найти указанный путь. [исполнение] Результат: 1 - person pankaj; 05.07.2016

В моем случае я просто хочу, чтобы ejb jar был в репозитории, чтобы я мог использовать его в другом проекте с maven в качестве зависимости, поэтому:

<target name="runMaven" depends="deploy" description="LLama al maven.">
    <exec executable="cmd">
        <arg value="/c"/>
        <arg value="mvn.bat install:install-file -DgroupId=com.advance.fisa.prototipo.camel -DartifactId=batch-process -Dversion=1.0 -Dpackaging=jar  -Dfile=${jarDirectory}\batch-process.jar"/>
    </exec>
</target>
person cabaji99    schedule 09.03.2012

Загрузите Maven Ant Tasks и используйте это:

<target name="getDependencies">
        <path id="maven-ant-tasks.classpath" path="${basedir}${file.separator}maven${file.separator}lib${file.separator}maven-ant-tasks.jar" />
        <typedef resource="org/apache/maven/artifact/ant/antlib.xml" uri="antlib:org.apache.maven.artifact.ant" classpathref="maven-ant-tasks.classpath" />

        <artifact:dependencies filesetId="dependency.fileset" type="jar">
            <pom file="pom.xml" />
        </artifact:dependencies>

        <!--TODO take care of existing duplicates in the case of changed/upgraded dependencies-->
        <copy todir="lib">
            <fileset refid="dependency.fileset" />
            <mapper type="flatten" from="${dependency.versions}" />
        </copy>
    </target>
person Randyaa    schedule 18.04.2013

Я работаю над той же проблемой прямо сейчас. Я установил все необходимые библиотеки в свой локальный репозиторий Maven, а оттуда поместил их в репозиторий Maven компании. Он еще не совсем правильно работает. Некоторые из тестов терпят неудачу, что хорошо работает в моем тестовом прогоне Maven, но, поскольку результат теста не важен для данных о покрытии, я вполне удовлетворен.

Вот мой фрагмент Maven. Надеюсь, это поможет.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.1</version>
    <inherited>false</inherited>
    <executions>
        <execution>
            <phase>site</phase>
            <configuration>
                <tasks>
                    <property name="compile_classpath" refid="maven.compile.classpath"/>
                    <property name="runtime_classpath" refid="maven.runtime.classpath"/>
                    <property name="test_classpath" refid="maven.test.classpath"/>
                    <property name="plugin_classpath" refid="maven.plugin.classpath"/>
                    <property name="CRAP4J_HOME" value="${user.home}/Projects/crap4j"/>
                    <taskdef name="crap4j" classname="org.crap4j.anttask.Crap4jAntTask">
                        <classpath>
                            <fileset dir="${CRAP4J_HOME}/lib">
                                <include name="**/*.jar"/>
                            </fileset>
                        </classpath>
                    </taskdef>
                    <crap4j projectdir="${project.basedir}/alm-jar-server"
                            outputDir="${project.basedir}/crap4jReports"
                            dontTest="false"
                            debug="true">
                        <classes>
                            <pathElement location="${project.basedir}/target/classes"/>
                        </classes>
                        <srces>
                            <pathElement location="${project.basedir}/src/main/java"/>
                        </srces>
                        <testClasses>
                            <pathElement location="${project.basedir}/target/test-classes"/>
                        </testClasses>
                        <libClasspath>
                            <fileset dir="${user.home}/.m2/repository">
                                <include name="**/*.jar"/>
                            </fileset>
                        </libClasspath>
                    </crap4j>


                   </tasks>
            </configuration>
            <goals>
                <goal>run</goal>
            </goals>
        </execution>
    </executions>
    <dependencies>
        <dependency>
            <groupId>org.crap4j</groupId>
            <artifactId>crap4j</artifactId>
            <version>1.1.6</version>
        </dependency>
        <dependency>
            <groupId>org.kohsuke</groupId>
            <artifactId>args4j</artifactId>
            <version>2.0.1</version>
        </dependency>
        <dependency>
            <groupId>com.agitar</groupId>
            <artifactId>asmlib</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>commons-httpclient</groupId>
            <artifactId>commons-httpclient</artifactId>
            <version>3.0</version>
        </dependency>
        <dependency>
            <groupId>com.agitar</groupId>
            <artifactId>coverage</artifactId>
            <version>1.0</version>
        </dependency>
    </dependencies>
</plugin>
person Johannes    schedule 10.07.2009