Использование Maven из Ant - PullRequest
18 голосов
/ 31 марта 2009

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

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

Есть предложения? (кроме как смириться)

Ответы [ 9 ]

13 голосов
/ 01 апреля 2009

Существует новый набор заданий Ant, которые используют Меркурий. Mercury - это переработанный код, который станет основой взаимодействия Maven 3 с репозиториями Maven (и OSGi), который реализуется Олегом Гусаковым. Меркурий хорошо протестирован, и вы можете начать использовать его в проектах 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. Вы также можете начать определять различные хранилища, от которых зависит Меркурий. Этот 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"/>

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

11 голосов
/ 01 апреля 2009

Пока работают ртутные задачи, я ими не пользовался. У меня был хороший успех с их предшественниками, 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>

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

10 голосов
/ 01 апреля 2009

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

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

5 голосов
/ 01 апреля 2009

Просто используйте Задачи Maven Ant . Их можно скачать на странице Normal Maven .

4 голосов
/ 15 января 2010

См. Это: Почему вы должны использовать задачи Maven Ant вместо Maven или Ivy

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

2 голосов
/ 10 марта 2012

В моем случае я просто хочу, чтобы 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>
2 голосов
/ 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>

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

Наслаждайтесь ....

1 голос
/ 18 апреля 2013

Скачать Задачи Maven Ant , затем использовать это:

<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>
0 голосов
/ 11 июля 2009

Я сейчас работаю над той же проблемой. Я установил все необходимые библиотеки в моем локальном репозитории Maven и оттуда положил в нашу компанию Maven Repo. Это еще не совсем правильно. Некоторые тесты не проходят, и это хорошо работает в моем тестовом прогоне 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...