Имея проект maven, создайте собственные зависимости?

С maven можно ли иметь проект верхнего уровня, тип упаковки которого является "войной", который будет строить сам и все его зависимые модули (упакованные как jar) и создать сборку файла project.war?

Большинство примеров документации и других примеров, которые я видел, часто используют проект верхнего уровня с типом упаковки "pom", и проект служит только для связывания модулей. Могу ли я избежать этого?

В принципе мне нужно что-то, что эффективно, как объявление <module>my-module</module> для maven для сборки, и в том же POM, объявляющем <dependency>...my-module artifact...</dependency> в том же модуле, который нужно построить. Может быть, плагин, как кто-то уже предложил?

Обновить. Другими словами (для упрощения проблемы): Если у меня есть project A и project B, где project A зависит от project B - есть ли способ для меня выполните построение на project A, а также автоматически создайте project B (и включите project B в качестве своей зависимости - создайте projectA.war, который содержит projectB.jar)?

Ответы

Ответ 1

Это не совсем то, для чего нужен проект верхнего уровня. В вашем проекте WAR есть зависимости, которые являются артефактами (например, баночками), которые будут включены в WAR (в WEB-INF/lib) при запуске "mvn package". Ваш проект проекта WAR может иметь проект верхнего уровня в качестве родителя, но он не должен быть родителем его зависимостей. Возможно, вы захотите, чтобы этот проект верхнего уровня был родителем проекта WAR и проектов JAR, которые являются зависимостями в WAR.

Ответ 2

super_aardvark предложил правильный путь, но,
Для требования я бы предложил следующую структуру. Подходит и хорошая структура также:

Закрепление ProjectA как project-webapp, ProjectB как project-core

У вас может быть следующая структура:

Ваш грандиозный проект:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <groupId>com.mycompany.project</groupId>
    <artifactId>project</artifactId>
    <version>2.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <name>Project Repository System</name>
    <description>Project Repository System R2</description>

    <modules>
        <module>project-core</module>
        <module>project-webapp</module>
    </modules>
 </project>

Ваш проект WebApp:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <parent>
        <groupId>com.mycompany.project</groupId>
        <artifactId>project</artifactId>
        <version>2.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>project-webapp</artifactId>
    <version>2.0-SNAPSHOT</version>
    <packaging>war</packaging>
    <name>Project Web Application</name>
    <description>Project Repository</description>
    <dependency>
            <groupId>com.mycompany.project</groupId>
            <artifactId>project-core</artifactId>
            <version>2.0-SNAPSHOT</version>
     </dependency>

 </project>

Ваш основной проект:

<project>
    <parent>
        <groupId>com.mycompany.project</groupId>
        <artifactId>project</artifactId>
        <version>2.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>project-core</artifactId>
    <version>2.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>Project Core</name>
    <description>ProjectCore</description>

 </project>

Структура вашего каталога должна выглядеть так:

-------Grand Parent.pom
  |
  |--------project-webapp
  |                     |
  |                     project-webapp.pom
  | 
  | -------project-core.pom
                        |
                       project-core.pom

Из родительского pom execute mvn clean install он построит как веб-приложение, так и основной проект

Ответ 3

Это невозможно в Maven 1, 2 или 3.

Я бы рекомендовал отказаться от этой идеи, потому что Maven целая цель - обеспечить стандартизированный процесс разработки. Не сражайтесь со структурой, просто создайте родительский модуль POM и создайте модуль WAR и другие зависимости ниже.

Ответ 4

В родительском pom вы должны определить последовательный порядок модулей для компиляции. Вы можете добавить к нему последний упаковочный модуль. Он просто заполнит все предыдущие скомпилированные коды.

Ответ 5

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

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

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

Профили Maven могут помочь и вот хорошая статья в этом отношении:

Использование агрегированных и родительских POM

Также обратите внимание на статью о пакете pom, о котором я ранее не знал.

Помните, что mvn clean install подтолкнет ваш артефакт к вашему местному репо. Поэтому, если модуль A зависит от модуля B, если ваше местное репо имеет последнюю сборку модуля B, тогда вы должны быть настроены. Таким образом, если бы существовал внешний инструмент, который следил за изменениями в модуле B и автоматически создавал его, когда он был и перетаскивал эти изменения в локальное репо, тогда, когда модуль A был перестроен, он подбирал эти изменения. Существуют инструменты непрерывной интеграции (CI), которые могут это сделать, например, Дженкинс. Но вам понадобится локальная установка, чтобы эта работа была напрямую связана с вашим местным репо. Тем не менее, это вариант.

Другим вариантом было бы для среды CI подталкивать ваши сборки к внешнему репозиторию maven (или даже к тому, который вы настраиваете локально с помощью чего-то вроде Nexus). Затем вы настраиваете свои CI-сборки, чтобы вытащить их из этого места.

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

Я бы рекомендовал исследовать непрерывную интеграцию и непрерывную доставку для получения дополнительной информации и идей.

Ответ 6

Не совсем - (Ну, я могу подумать о нескольких путях, но я не буду использовать их, поскольку они запутаны и идут вразрез с основными идеями/практикой Maven).

Не забывайте, что другая цель pom верхнего уровня - предоставить единую точку для установки общих деталей, таких как конкретные версии зависимостей, используемых в модулях проекта.

Ответ 7

У NetBeans есть опция, которая позволяет вам делать именно это с проектами Maven, но я не знаю никаких чистых решений Maven. Я думаю, что задача больше подходит для IDE, потому что она знает, для чего зависели проекты, у которых есть код (основанный на том, какие проекты вы открыли в рабочей области). Как бы Maven самостоятельно различал зависимость, которую вы хотите построить, и тот, который нужно извлечь из репозитория. И для тех, которые нужно построить, где искать исходный код?

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