Как собрать проект maven
Перейти к содержимому

Как собрать проект maven

  • автор:

Сборка Java-проекта с использованием Maven

Этот урок освещает создание вами простого Java-приложения с использованием Maven.

Что вы создадите

Вы создадите простое приложение и соберете его с помощью Maven.

Что вам потребуется

  • Примерно 15 минут свободного времени
  • Любимый текстовый редактор или IDE
  • JDK 6 и выше

Как проходить этот урок

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

Чтобы начать с нуля, перейдите в Настройка проекта.

  • Загрузите и распакуйте архив с кодом этого урока, либо кнонируйте из репозитория с помощью Git: git clone https://github.com/spring-guides/gs-maven.git
  • Перейдите в каталог gs-maven/initial
  • Забегая вперед, установите Maven

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

Настройка проекта

Для начала вам необходимо настроить Java-проект перед тем, как собрать его Maven’ом. Т.к. урок посвящен Maven, сделаем проект максимально простым, насколько это возможно.

Создание структуры каталогов

В выбранном вами каталоге проекта создайте следующую структуру каталогов; к примеру, командой mkdir -p src/main/java/hello для *nix систем:

+-- src +-- main +-- java +-- hello

Внутри src/main/java/hello директории вы можете создать любые Java-классы, какие вы хотите. Для простоты и согласованности с остальной частью урока, Spring рекомендует вам создать два класса: HelloWorld.java и Greeter.java .

package hello; public class HelloWorld < public static void main(String[] args) < Greeter greeter = new Greeter(); System.out.println(greeter.sayHello()); >>
package hello; public class Greeter < public String sayHello() < return "Hello world!"; >>

Теперь, когда у вас есть проект, который вы можете собрать с Maven, вам нужно установит сам Maven.

Maven можно получить, скачав zip-файл с maven.apache.org/download.cgi. Необходимы только бинарные файлы, так что ищите ссылку на архив с именем apache-maven-version-bin.zip или apache-maven-version-bin.tar.gz.

Распакуйте архив и добавьте путь к каталогу bin в переменную окружения path.

Чтобы протестировать правильность установки Maven, запустите в командной строке:

mvn -v

Если всё было сделано правильно, то вы увидите сообщение примерно такого содержания:

Apache Maven 3.0.5 (r01de14724cdef164cd33c7c8c2fe155faf9602da; 2013-02-19 07:51:28-0600) Maven home: /usr/share/maven Java version: 1.7.0_09, vendor: Oracle Corporation Java home: /Library/Java/JavaVirtualMachines/jdk1.7.0_09.jdk/Contents/Home/jre Default locale: en_US, platform encoding: UTF-8 OS name: "mac os x", version: "10.8.3", arch: "x86_64", family: "mac"

Теперь у вас есть установленный Maven.

Создание простой сборки Maven

Теперь, когда Maven установлен, вам необходимо создать определение Maven-проекта. Maven-проекты определяются как XML-файлы с названием pom.xml. Помимо всего прочего, этот файл определяет имя проекта, версию, а также зависимости от сторонних библиотек.

Создайте файл с названием pom.xml в корневом каталоге проекта и наполните его следующим содержанием:


xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
4.0.0
org.springframework
gs-maven
jar
0.1.0




org.apache.maven.plugins
maven-shade-plugin
2.1


package

shade



implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
hello.HelloWorld








За исключением дополнительного элемента , это простейший из pom.xml файлов, необходимый для сборки Java проекта. Он включает следующие детали конфигурации проекта:

  • — версия POM-модели (всегда 4.0.0)
  • — группа или организация, к которой принадлежит проект. Чаще всего выражается в виде перевернутого наоборот доменного имени
  • — имя, которое будет передано библиотеке экземпляра(artifact) проекта (к примеру, имя его JAR или WAR файла)
  • — версия, с которой будет собран проект
  • — как проект должен быть упакован. По умолчанию, с «jar» упаковывается в JAR-файл, «war» — WAR-файл

Когда речь заходит о выборе схемы управления версиями, Spring рекомендует [семантическое управление версиями] semver.org подход.

На данном этапе мы имеем минимальное, но уже рабочее определение Maven-проекта.

Сборка Java кода

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

Попробуйте собрать, выполнив команду, приведенную ниже:

mvn compile

Этим вы запустите Maven, передав ему указание на выполнение задачи compile. Когда он закончит, вы должны найни скомпилированные .class файлы в target/classes директории.

Вряд ли вы захотите распостранять или работать напрямую с .class файлами, поэтому вам полее подойдет выполнение задачи package:

mvn package

Задача package включает компиляцию вашего Java кода, запуск тестов, а в конце упаковывает в JAR-файл в target директории. Название JAR-файла будет основано на и . К примеру, с минимальным pom.xml(см. выше), JAR-файл будет иметь название gs-maven-initial-0.1.0.jar.

Если вы изменили значение с «jar» на «war», то результатом будет WAR-файл в target директории вместо JAR-файла.

Maven также хранит репозиторий зависимостей на вашей локальной машине(обычно в .m2/repository директории в вашей домашней папке) для быстрого доступа к зависимостям проекта. Если вы хотите добавить JAR-файл вашего проекта в локальный репозиторий, тогда вам необходимо выполнить задачу install :

mvn install

Задача install включает компиляцию, тестирование, упаковку кода проекта, а затем копирование в локальный репозиторий, тем самым другие проекты смогут ссылаться на него как на зависимость.

Говоря о зависимостях, пришло время объявлять зависимости в Maven сборке.

Объявление зависимостей

Простой «Hello World» пример полностью автономный и не зависит от каких-либо дополнительных библиотек. Однако, большинство приложений зависит от внешних библиотек, с реализацией распостраненного и/или сложного функционала.

К примеру, предположим, что в дополнение к «Hello World!» вы хотите, чтобы приложение печатало текущую дату и время. Вы могли бы использовать функциональность из стандартных(native) Java библиотек, но мы можем сделать это и другими интересными способами, например с помощью Joda Time библиотеки.

Для начала, изменим HelloWorld.java , как показано ниже:

package hello; import org.joda.time.LocalTime; public class HelloWorld < public static void main(String[] args) < LocalTime currentTime = new LocalTime(); System.out.println("The current local time is: " + currentTime); Greeter greeter = new Greeter(); System.out.println(greeter.sayHello()); >>

Здесь HelloWorld использует Joda Time LocalTime класс для получения и печати текущего времени.

Если бы вы запустили mvn compile для сборки проекта сейчас, то получили бы ошибку сборки, потому что вы не объявили Joda Time компилируемую зависимость в сборке. Вы можете это исправить, добавив следующие строки в pom.xml(в пределах элемента):

 

joda-time
joda-time
2.2

Этот блок XML объявляет список зависимостей проекта. В частности, он объявляет единственную зависимость от Joda Time библиотеки. В элементе, зависимость определяется через описание трех вложенных элементов:

  • — группа или организация, к которой принадлежит зависимость.
  • — необходимая библиотека
  • — версия необходимой библиотеки

По умолчанию, все зависимости определены как зависимости. Т.е. они должны быть доступны во время компиляции(а если вы собираете WAR-файл, то в /WEB-INF/lib каталоге). Кроме того, вы можете добавить элемент, с одним из значений:

  • provided — зависимости, которые требуются для компиляции кода проекта, но которые будут доступны во время выполнения кода контейнером(например, Java Servlet API)
  • test — зависимости, которые используются для компиляции и запуска тестов, но не требуемые для сборки или выполнения кода проекта

Сейчас, если вы выполните mvn compile или mvn package , Maven должен будет разрешить Joda Time зависимость из Maven Central репозитория и успешно собрать проект.

Здесь полная версия pom.xml :


xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
4.0.0
org.springframework
gs-maven
jar
0.1.0




joda-time
joda-time
2.2







org.apache.maven.plugins
maven-shade-plugin
2.1


package

shade



implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
hello.HelloWorld








Полная версия pom.xml использует Maven Shade Plugin как удобный инструмент для создание выполняемого JAR-файла. Целью данного урока является показать, как начать работать с Maven, не используя, в частности, этот плагин.

Итог

Поздравляем! Вы создали простой, но эффективный файл сборки Maven для сборки Java проектов.

С оригинальным текстом урока вы можете ознакомиться на spring.io.

Как собрать простейшую Java программу с помощью Maven

Статья написана для тех, кто умеет писать простейшие программы на java, но не умеет их собирать. Этим людям уже известно, что такое классы, что такое пакеты и зачем нужен public static main(String[] argv), но код без среды разработки они не запускали, да и не понимают кому и зачем это вообще может понадобиться.

Сразу скажу, что Java программиста, который не может собрать свою программу из консольки, на работу не возьмут, и это в общем более чем достаточная причина, чтобы научиться искусству обращения с системами сборки. Остальное детали, которым и посвящена статья.

Я принципиально не буду обсуждать в статье ничего, кроме сборки минимального HelloWorld. Также я постараюсь опустить все технические детали, которые можно опустить и подробно раскрыть всё, без понимания чего обойтись нельзя.

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

Зачем собирать код без IDE

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

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

Можно, конечно, выделить специального человека, который будет раз в 15 минут запускать IDE и проводить описанные выше процедуры, но это безумие, такие вещи следует делать автоматически.

Уметь собирать код без среды разработки — суровая необходимость. Настолько суровая, что для решения этой задачи существует особый класс программного обеспечения, называемого системами сборки.

Что такое система сборки?

Система сборки это программа, которая собирает другие программы. На вход система сборки получает исходный код, а на выход выдаёт программу, которую уже можно запустить.

Чем она отличается от компилятора? Если коротко, то система сборки вызывает компилятор при своей работе, а компилятор о существовании системы сборки даже не подозревает.

Если более длинно, то сборка, помимо компиляции, включает в себя ещё целый спектр задач, для решения которых компилятор не пригоден от слова совсем.

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

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

Систем сборки для java по большому счёту 3 — ant, maven и gradle. ant отживает свой век, нынче его используют либо ретрограды, либо реально крутые чуваки, типа Антона Кекса, gradle пока удел хипстеров, а вот maven — стандарт индустрии. Уметь им пользоваться просто необходимо.

Как установить maven

Maven устанавливается просто копированием в нужную директорию — никакого инсталлера нет. Как и в случае с большинством консольных утилит для использования достаточно добавить директорию maven/bin в переменную окружения PATH.

То есть, если maven находится в d:/soft/maven, то в PATH надо добавить d:/soft/maven/bin

Ещё для работы maven потребует переменную JAVA_HOME, которая указывает на JDK. Если JDK находится в C:/Program Files/Java/jdk1.8.0_05, то именно такое значение нужно поместить в JAVA_HOME. Добавлять bin в конец не нужно.

После этого можно попробовать написать в консоли

mvn --version

Если получится, значит maven установлен.

Как структурировать проект для maven

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

Как известно, язык программирования java навязывает программисту структуру директорий, которая диктует расположение файлов с классами. Например класс с полным именем com.app.HelloWorld должен находиться в файле com/app/HelloWorld.java и никак иначе.

Maven добавляет к этому ограничению ещё одно — исходный код должен находиться в директории /src/main/java. То есть класс com.app.HelloWorld maven будет искать в /src/main/java/com/app/HelloWorld.java

Вот как будет выглядеть этот самый HelloWorld

package com.app; public class HelloWorld < public static void main(String[] argv) < System.out.println("Hello world"); >>

Как сделать описание проекта

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

Содержимое минимального файла pom.xml будет примерно следующим. Для прохождения туториала можно таким его и оставить, если ничего не поменять, код нормально соберётся.

 4.0.0 com hello-world 1.0-SNAPSHOT  

Что тут было существенно важного и что надо запомнить? Запомнить надо вот эти три строки.

com hello-world 1.0-SNAPSHOT

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

Непонятное слово артефакт используется здесь вместо понятного слова программа потому, что результатом работы системы сборки может быть не только собственно программа, но и библиотека или ещё что-нибудь эдакое. Комбинация параметров groupId, artifactId и version уникальна для каждого артефакта. Об уникальности этой комбинации должен позаботиться программист.

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

groupId

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

artifactId

В artifactId — строка с именем артефакта, которое придумывает его создатель. Как правило это какое-нибудь слово, иногда с разделителями в виде тире. Например hibernate-annotation-wat. artifactId должны быть уникальны в рамках groupId.

version

Ну и наконец version это версия артефакта, которую надо увеличивать при каждом более-менее значительном изменении. Версия обычно включает цифрры и буквы. Типа 1.0-SNAPSHOT

Как собрать проект

Теперь, когда структура файлов проекта соответствует ожидаемой, а его описание присутствует в файле pom.xml, для того, чтобы собрать проект, осталось только открыть консоль, сменить текущую директорию на директорию проекта и написать в консоли:

mvn compile

После того, как maven закончит свою работу, в директории проекта появится директория target, в которой будет находиться скомпилированный код.

Скомпилированный java код выглядит так же, как исходный, только вместо файлов с расширением java в директориях, соответствующих названиями пакетов, находятся файлы с расширением class, в которых будет уже не исходный код, а код, предназначенный для интерпретации джава-машиной.

То есть теперь этот код можно запустить.

Как запустить проект

Чтобы запустить скомпилированный код, нужно в консоли из этой же директории набрать

mvn exec:java -Dexec.mainClass="com.app.HelloWorld"

После того, как maven перестанет качать всякую дрянь из интернета, где-то перед здоровой табличкой с надписью BUILD SUCCESS, появится строчка Hello World.

Код отработал, всё прошло удачно.

Вот так собирают java программы с помощью системы сборки maven.

Итого

  1. maven ищет код для сборки в директории src/main/java.
  2. Инструкции по сборке maven будет искать в /pom.xml
  3. Результат работы системы сборки называется артефактом.
  4. От программиста требуется задать groupId, artifactId и version
  5. Сборка осуществляется командой mvn compile
  6. Скомпилированный java код выглядит так же, как исходный код, но вместо файлов с расширением java, там будут файлы с расширением class.
  7. Запустить скомпилированную программу можно командой
    mvn exec:java -Dexec.mainClass=»com.app.HelloWorld»

Сборка Java-проекта с помощью Maven

Обновлено и опубликовано

Опубликовано: 15.03.2023

В данной инструкции мы рассмотрим пример сборки приложения Java с помощью Maven. Более того, будет выполнен весь цикл работ от написания простейшего приложения до проверки его работы после сборки. Работать мы будем на Linux.

Разработка приложения

В нашей системе должен быть установлен JDK. Для Linux есть пакет OpenJDK, который можно установить из встроенного репозитория. Подробнее читайте инструкцию Установка OpenJDK на Linux.

Создадим каталог, в котором будем работать и перейдем в него:

mkdir -p /opt/java/hello

Создадим файл с исходником:

public class HelloProgram public static void main(String args[]) System.out.println(«Hello, my friends!»);
>
>

* очень важно, чтобы имя класса HelloProgram совпадало с названием созданного файла.

Мы должны получить что-то на подобие:

Hello, my friends!

Приложение готово к сборке.

Установка Maven

Для загрузки и распаковки maven нам нужны пакеты wget и tar. В зависимости от типа Linux, установка выполняется разными командами.

а) На Linux DEB (Debian / Ubuntu / Astra Linux):

apt install wget tar

б) На Linux RPM (Rocky Linux / CentOS / РЕД ОС):

yum install wget tar

После установки пакетов можно скачать приложение.

Переходим на официальный сайт разработчика и копируем ссылку на архив бинарника последней версии:

Копируем ссылку на последнюю версию maven

Используем скопированную ссылку, чтобы загрузить архив на Linux:

Создадим каталог, в который будет установлен maven:

Распакуем в него архив:

tar -zxf apache-maven-*-bin.tar.gz -C /opt/maven —strip-components 1

Проверить, что maven установлен можно командой:

Чтобы не вводить полный путь до бинарного файла, добавим в системную переменную PATH путь до каталога bin. Для этого откроем файл:

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

Теперь попробуем ввести команду, но уже без полного пути до исполняемого файла:

Наша система готова к сборке.

Сборка приложения

Перед сборкой нам нужно изменить структуру каталогов в корневой папке проекта, создать конфигурационный файл pom.xml и немного подредактировать проект.

Начнем с последнего. Работать будем в корневой папке проекта. В нашем случае это:

Открываем нашу программу:

Добавляем в самый верх строку:

Теперь нам нужно создать каталог src/main/java/ и перенести туда наш исходник:

mkdir -p src/main/java/hello

mv HelloProgram.java src/main/java/hello/

Создаем конфигурационный файл pom.xml:

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»>

Можно попробовать собрать приложение:

В итоге, мы должны увидеть что-то на подобие:

Также у нас появится каталог target с собранным приложением.

Сделать тестовый запуск собранной программы можно командой:

Для проверки выполним команду:

mvn exec:java -Dexec.mainClass=»hello.HelloProgram»

Читайте также

Другие инструкции, которые могут вас заинтересовать:

Многомодульный maven проект

Maven позволяет собирать проект из нескольких модулей. Каждый программный модуль включает свой проектный файл pom.xml. Один из проектных pom.xml файлов является корневым. Корневой pom.xml позволяет объединить все модули в единый проект. При этом в корневой проектный файл можно вынести общие для всех модулей свойства. А каждый модульный pom.xml должен включать параметры GAV (groupId, artifactId, version) корневого pom.xml.

Общие положения разработки многомодульного maven-приложения рассмотрены на странице Наследование проектов в maven. В данной статье рассмотрим пример сборки многомодульного приложения. В качестве «подопытного» приложения используем пример, представленный на странице Pluggable решение. На выходе данного примера мы должны получить 3 архивных и один исполняемый jar-файлов. Главный исполняемый jar-модуль динамически «при необходимости» загружает остальные архивные jar’ники. Данный «подопытный» пример был использован для «оборачивания» jar’ника в exe-файл с использованием maven-плагина launch4j.

Описание многомодульного проекта

На скриншоте представлена структура проекта pluggable, включающая следующие проектные модули :

• hello-plugin1 – динамически загружаемый плагин №1 (hello1.jar);
• hello-plugin2 – динамически загружаемый плагин №2 (hello2.jar);
• plugin-api – интерфейсы описания плагинов (plugin-api.jar);
• plugin-loader – главный исполняемый jar модуль.

Дополнительные поддиректории проекта, используемые для размещения jar-модулей :

• commons – поддиректория размещения архивного jar-модуля описания интерфейса плагинов;
• plugins – поддиректория размещения jar-модулей (плагинов);

Главный исполняемый модуль plugin-loader.jar размещается в корневой директории проекта, где размещается и проектный/корневой pom.xml. Файл run.bat можно использовать для старта plugin-loader.jar из консоли в Windows.

Примечание : в исходные коды классов внесены изменения, связанные с из размещением в пакетах. В исходном примере все классы располагаются в «корне».

Начнем рассмотрение примера с корневого многомодульного pom.xml.

Листинг многомодульного корневого pom.xml

Корневой pom.xml включает параметры GAV (groupId, artifactId, Version), общую для всех модулей проекта секцию и секцию описания модулей . Обратите внимание на атрибут packaging>, значение которого должно быть «pom».

Следует отметить, что порядок включения программных модулей проекта составлен таким образом, что сначала представлены исполняемый модуль plugin-loader.jar и плагины (hello-plugin1.jar, hello-plugin2.jar), после чего следует интерфейсный модуль plugin-api.jar. Если собирать проект по-отдельности, то модуль plugin-api.jar должен быть собран в первую очередь и размещен в репозитории командой «mvn install». В этом случае зависимые модули plugin-loader.jar и плагины (hello-plugin1, hello-plugin2) собрались бы нормально. Ну, а мы в этом примере посмотрим, как поступит Maven в случае, если порядок описания модулей для сборки «нарушен».

 4.0.0 ru.pluggable.main pluggable pom 1.0.0 MultiModule application true 1.8 1.8 1.8 UTF-8  plugin-loader hello-plugin1 hello-plugin2 plugin   

Модуль описания интерфейсов плагинов plugin-api.jar

На следующем скриншоте представлена структура проекта plugin-api. Интерфейсные классы Plugin, PluginContext располагаются в пакете «ru.plugin».

Листинг pom.xml

Проектный pom.xml модуля plugin-api.jar включает GAV-параметры, секцию описания родительского GAV () и секцию сборки , где в качестве выходной директории размещения () указана поддиректория «$/../commons».

 4.0.0 ru.pluggable plugin-api jar 1.0.0 Plugin API ru.pluggable.main pluggable 1.0.0  $   org.apache.maven.plugins maven-jar-plugin 2.3.1  $/../commons      

Модуль описания плагина hello-plugin1.jar

Структура проекта hello-plugin1 представлена на следующем скриншоте.

Класс HelloPlugin, расположенный в пакете «ru.plugins», реализует свойства интерфейса Plugin. При инициализации класса в методе init определяется значение контекста PluginContext родительского/вызвавшего объекта. Метод invoke выводит в консоль сообщение и изменяет надпись на кнопке родительского объекта.

package ru.plugins; import ru.plugin.Plugin; import ru.plugin.PluginContext; public class HelloPlugin implements Plugin < private PluginContext pc; @Override public void invoke() < System.out.println("Hello world. I am a plugin 1"); pc.getButton().setText("Other text 1"); >@Override public void init(PluginContext context) < this.pc = context; >>
Листинг pom.xml

Проектный pom.xml модуля hello-plugin1.jar включает GAV-параметры, секцию описания родительского GAV (), секцию зависимостей () и секцию сборки . В секции зависимостей указываются параметры модуля plugin-api. В описании секции сборки используется 2 плагина (maven-resources-plugin, maven-jar-plugin). Первый плагин включает в сборку ресурсы (resources/settings.properties), второй плагин создает jar и размещяет его в выходной директории () «$/../plugins».

 4.0.0 ru.plugins hello1 jar 1.0.0 Plugin Hello1 ru.pluggable.main pluggable 1.0.0   ru.pluggable plugin-api 1.0.0   $   maven-resources-plugin 2.6  copy-resources  $/target/resources  src/main/resources   **/*.properties        org.apache.maven.plugins maven-jar-plugin 2.3.1  $/../plugins      

Примечание : второй плагин hello-plugin2 структурно ничем не отличается от hello-plugin1. Отличия касаются текста сообщения в консоли, надписи на кнопке и параметров GAV в pom.xml.

Проектный pom.xml модуля plugin-loader

Проектный pom.xml включает GAV-параметры jar-модуля, секцию описания родительского GAV (), секцию зависимостей () и секцию сборки . В секции зависимостей указываются параметры модуля plugin-api. В описании секции сборки используется плагин maven-jar-plugin, который создает jar и размещяет его в корневой директории проекта ().

 4.0.0 ru.pluggable.loader plugin-loader jar 1.0.0 Plugin Loader ru.pluggable.main pluggable 1.0.0   ru.pluggable plugin-api 1.0.0   $  org.apache.maven.plugins maven-jar-plugin 2.3.1  $/..   ru.pluggable.loader.Boostrap        

Сборка проекта

Сборка всех проектов выполняется одной командой «mvn package» для корневого pom.xml. Maven сначала просматривает проектные файлы pom.xml всех модулей, определенных в корневом pom.xml, и после этого определяет порядок сборки модулей. Как следует из представленных ниже сообщений, выводимых Maven в консоль, порядок сборки был изменен и первым собирается модуль Plugin API, после чего формируются зависимые от него Plugin Loader, Plugin Hello1, Plugin Hello2.

D:\pluggable>mvn package [INFO] Scanning for projects. [INFO] ---------------------------------------------------- [INFO] Reactor Build Order: [INFO] [INFO] MultiModule application [INFO] Plugin API [INFO] Plugin Loader [INFO] Plugin Hello1 [INFO] Plugin Hello2 [INFO] [INFO] ---------------------------------------------------- [INFO] Building MultiModule application 1.0.0 [INFO] ---------------------------------------------------- [INFO] [INFO] ---------------------------------------------------- [INFO] Building Plugin API 1.0.0 [INFO] [INFO] --- maven-resources-plugin:2.6:resources \ (default-resources) @ plugin-api --- [INFO] Using 'UTF-8' encoding to copy filtered \ resources. [INFO] skip non existing resourceDirectory \ D:\pluggable\plugin\src\main\resources [INFO] [INFO] --- maven-compiler-plugin:3.1:compile \ (default-compile) @ plugin-api --- [INFO] Changes detected - recompiling the module! [INFO] Compiling 2 source files to \ D:\pluggable\plugin\target\classes [INFO] [INFO] --- maven-resources-plugin:2.6:testResources \ (default-testResources) @ plugin-api --- [INFO] Not copying test resources [INFO] [INFO] --- maven-compiler-plugin:3.1:testCompile \ (default-testCompile) @ plugin-api --- [INFO] Not compiling test sources [INFO] [INFO] --- maven-surefire-plugin:2.12.4:test \ (default-test) @ plugin-api --- [INFO] Tests are skipped. [INFO] [INFO] --- maven-jar-plugin:2.3.1:jar (default-jar) \ @ plugin-api --- [INFO] Building jar: \ D:\pluggable\plugin\..\commons\plugin-api.jar [INFO] [INFO] ---------------------------------------------------- [INFO] Building Plugin Loader 1.0.0 [INFO] ---------------------------------------------------- [INFO] . . . [INFO] [INFO] ---------------------------------------------------- [INFO] Building Plugin Hello1 1.0.0 [INFO] ---------------------------------------------------- [INFO] . . . [INFO] [INFO] ---------------------------------------------------- [INFO] Building Plugin Hello2 1.0.0 [INFO] ---------------------------------------------------- . . . [INFO] --- maven-jar-plugin:2.3.1:jar (default-jar) \ @ hello2 --- [INFO] Building jar: \ D:\pluggable\hello-plugin2\..\plugins\hello2.jar [INFO] ---------------------------------------------------- [INFO] Reactor Summary: [INFO] [INFO] MultiModule application . SUCCESS [ 0.006 s] [INFO] Plugin API . SUCCESS [ 1.957 s] [INFO] Plugin Loader . SUCCESS [ 0.391 s] [INFO] Plugin Hello1 . SUCCESS [ 0.183 s] [INFO] Plugin Hello2 . SUCCESS [ 0.115 s] [INFO] ---------------------------------------------------- [INFO] BUILD SUCCESS [INFO] ---------------------------------------------------- [INFO] Total time: 2.802 s [INFO] Finished at: 2019-06-05T11:07:45+03:00 [INFO] Final Memory: 18M/199M [INFO] ----------------------------------------------------

Примечание :
1. При первой сборке проекта maven не нашел в репозитории модуль plugin-api.jar, прекратил сборку и вывел соответствующее сообщение. После размещения модуля plugin-api.jar в локальном репозитории командой «mvn install» сборка всего проекта прошла успешно.
2. После первой сборки проекта из локального репозитория был удален модуль plugin-api.jar. При дальнейших запусках сборки проекта Maven больше не ругался и сборка проходила нормально. Каким образом Maven собирает проект при отсутствии в локальном репозитории зависимого plugin-api.jar для меня осталось загадкой.

Скачать проект

Вы можете скачать рассмотренный пример по ссылке maven-mulimodule.zip (54.6 Кб)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *