Ant to Maven-несколько целей сборки


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

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

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

3   51  

3 ответа:

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

философия maven заключается в том, что каждый проект должен построить один и только артефакт (jar, war, whatever)

вы могли бы взломать что-нибудь вместе, так что у вас есть только один Maven-проекта Дом 2 atrifacts, но это будет Хак.

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

вы можете сделать это с профилями...

Если вы действительно хотите использовать два отдельных профиля и настроить плагин 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>

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

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

mvn package -Peverything
mvn package -Ponly-library

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

или, вы могли бы сделать это с двумя jar плагин исполнения...

Если вам нужно создать две банки без использования профилей. Вы можете привязать цель jar плагина 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 на примере, мы покажем, как сделать переход между одномодульным и многомодульным проектом. главах 3-5 сосредоточьтесь на проектах с одним модулем и Глава 6 показывает вам, как вы могли бы объединить эти компоненты одного модуля в более крупный мульти-модуль проект.

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

вы вопрос включает в себя следующие темы, вот некоторые ссылки, которые предоставят более подробную информацию для каждого:

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

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

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

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

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

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

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

Если подмножество упаковать в несколько разных "ароматы", затем я бы определил сборки для каждого " аромата "и квалифицировал имена артефактов с помощью" классификатора " см. координаты maven.

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