Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Allain LalondeОтветов: 9

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

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

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

maven-2ant

Ответы

Ответ 1 · рейтинг 10 · Vladimir

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

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

Ответ 2 · рейтинг 13 · Tim O'Brien

Существует новый набор задач 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"/>

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

Ответ 3 · рейтинг 11 · Dominic Mitchell

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

Ответ 4 · рейтинг 5 · whaley

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

Ответ 5 · рейтинг 4 · Peter Thomas

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

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

Ответ 6 · рейтинг 2 · Dhaval Patel

Запустить цель 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...

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

Ответ 7 · рейтинг 2 · cabaji99

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

Ответ 8 · рейтинг 1 · Randyaa

Загрузите 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>

Ответ 9 · Johannes

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы