Ant to Maven - несколько целей сборки - PullRequest
51 голосов
/ 25 января 2010

У меня есть сборка Ant, которая в настоящее время конвертируется в Maven. Тем не менее, сборка Ant имеет 2 цели сборки - одну, которая собирает все приложение, и другую, которая создает JAR-файл из некоторых из этих файлов (только из нескольких). В Ant легко иметь несколько целей сборки, чтобы справиться с этим, но я пытаюсь определить лучший способ справиться с этим в Maven.

Я мог бы разделить подмножество файлов на второй проект, и он будет иметь свой собственный POM. Тогда первый проект может зависеть от этого. Однако, поскольку подмножество файлов настолько мало (меньше 10), может показаться излишним иметь совершенно новый проект для этого.

Есть ли другие способы справиться с этим?

Ответы [ 3 ]

72 голосов
/ 26 января 2010

Это можно сделать с помощью профилей ...

Если вы действительно хотите использовать два отдельных профиля и настроить плагин JAR для включения и исключения шаблонов имен классов и пакетов, вы можете легко сделать это, добавив что-то подобное в свой POM:

<profiles>
  <profile>
    <id>everything</id>
    <build>
      <plugins>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <configuration>
            <classifier>everything</classifier>
            <includes>
              <include>**/*</include>
            </includes>
          </configuration>
        </plugin>
      </plugins>
    </build>
  </profile>
  <profile>
    <id>only-library</id>
    <build>
      <plugins>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <configuration>
            <classifier>only-library</classifier>
            <excludes>
              <exclude>**/Main*</exclude>
            </excludes>
          </configuration>
        </plugin>
      </plugins>
    </build>
  </profile>
</profiles>

В сторону: если это кажется слишком сложной конфигурацией, поддержка Polyglot Maven для Groovy POM почти готова. Это значительно сократит счетчик строк.

Вы должны поместить это в конец файла pom.xml (без элемента проекта), и он добавит два профиля. Первый профиль «все» на самом деле просто для демонстрации конфигурации. Этот профиль "все" является ненужным, потому что он просто дублирует поведение выполнения цели jar плагина JAR по умолчанию. Второй профиль «only-library» исключает любой класс в любом пакете, который начинается с текста «Main». Чтобы вызвать эти профили:

mvn package -Peverything
mvn package -Ponly-library

Я проверил это на примере приложения, поставляемого с Глава 6 Maven на примере , и при выполнении любой из этих команд будет получен файл JAR в $ {basedir} / target с классификатором. Поскольку цель jar плагина JAR связана с фазой пакета в жизненном цикле maven по умолчанию, эти два профиля будут изменять конфигурацию для этого плагина.

Или вы можете сделать это с помощью двух плагинов JAR ...

Если вам нужно создать два JAR-файла без использования профилей. Вы можете связать цель jar плагина JAR с фазой жизненного цикла пакета несколько раз и использовать разные конфигурации для каждого настроенного выполнения. Если вы конфигурируете два отдельных выполнения, каждое выполнение имеет блок конфигурации для конкретного выполнения, поэтому вы можете предоставить уникальный идентификатор и шаблон включения / исключения для каждого выполнения.

Вот элемент сборки, который вы бы использовали, чтобы добавить оба пользовательских JAR-файла в фазу жизненного цикла «package». Выполнение этого в проекте с упаковкой «jar» приведет к тому, что цель jar будет выполнена три раза. Один раз в качестве привязки жизненного цикла по умолчанию, а затем дважды для двух пользовательских классифицированных JAR-файлов.

  <build>
    <plugins>
      <plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <executions>
          <execution>
            <id>only-library</id>
            <goals><goal>jar</goal></goals>
            <phase>package</phase>
            <configuration>
              <classifier>only-library</classifier>
              <excludes>
                <exclude>**/Main*</exclude>
              </excludes>
            </configuration>
          </execution>
          <execution>
            <id>everything</id>
            <goals><goal>jar</goal></goals>
            <phase>package</phase>
            <configuration>
              <classifier>everything</classifier>
              <includes>
                <include>**/*</include>
              </includes>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

Если вы не говорите о включении разных наборов классов в каждый артефакт, вам следует использовать сборки Maven. Если вы хотите узнать подробности сборок, в конце этого ответа от Maven приведена глава: Полная справка. Честно говоря, я не думаю, что эта конкретная глава является хорошей вводной ссылкой; На самом деле, у меня было много сообщений о том, что эта глава почти не читается (и мы работаем над этим). Если вы хотите использовать сборки, я бы порекомендовал документацию Maven Assembly Plugin . В левом навигационном меню вы увидите список примеров дескрипторов сборки.

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

Хотя вы можете сделать это с помощью профилей, вам будет легче разделить проект на два (на самом деле три). В долгосрочной перспективе будут проблемы, с которыми вы будете сталкиваться по мере масштабирования вашего приложения. Вы будете нести ответственность за составление этого ручного списка классов и пакетов, которые будут включены в каждый из ваших классифицированных JAR-файлов.

Существуют минимальные накладные расходы на создание простого родительского проекта, который ссылается на два отдельных модуля. Если вы посмотрите на бесплатную книгу Maven by Example, мы покажем, как осуществить переход между одномодульным и многомодульным проектом. Главы 3-5 посвящены проектам с одним модулем, а Глава 6 показывает, как можно объединить эти компоненты с одним модулем в большой многомодульный проект.

Для получения дополнительной информации:

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

Плагин Maven JAR: http://maven.apache.org/plugins/maven-jar-plugin/jar-mojo.html

Мультимодульные проекты Maven: Глава 6 Maven на примере и Раздел 3.6.2 Maven: Полная справка .

Жизненный цикл Maven (jar связан с упаковкой, если ваш пакет - "jar"): Раздел 3.5.2 Maven на примере "Основные понятия" и Глава4 из Maven: полный справочник

сборок Maven: сначала сайт Плагин сборки Maven , затем глава 8 Maven: полный справочник для некоторыхтяжелые (почти слишком тяжелые) детали.

22 голосов
/ 25 января 2010

Ваша первая мысль верна. Разделите 2 части на 2 проекта.

Философия Maven заключается в том, что каждый проект должен создавать один-единственный артефакт (кувшин, война, что угодно)

Возможно, вы могли бы взломать что-нибудь вместе, чтобы у вас был только один проект maven, строящий 2 атрибутики, но это был бы взлом.

Вы можете вызвать муравья из maven, так что если вы действительно хотите это сделать, тогда я предлагаю вам начать смотреть на плагин maven ant. Идентификатор артефакта "maven-antrun-plugin"

5 голосов
/ 25 января 2010

У вас есть 2 варианта:

Еслиподмножество - это всего лишь набор ресурсов, и я бы не стал выделять его в отдельный модуль.

Если проект всегда зависит от подмножества, которое упаковано единообразным образом, то подмножество является хорошим кандидатом настать модулем .

Если подмножество переупаковывается в несколько разных «разновидностей», то я бы определил сборки для каждого «аромата» и уточнил имена артефактов «классификатором», см. координаты maven .

Наконец, вы можете использовать профили, чтобы определить, какие сборки будут производиться, ваш профиль по умолчанию может создавать только первоначальный «аромат» артефакта, который требуется во время разработки.
«Полный» профиль может создавать все варианты «аромата»артефакта для окончательного развертывания после завершения разработки.

...