12 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Как с помощью maven работать с библиотеками, которых в maven нет

Содержание

Краткое знакомство с Maven

Краткое знакомство с Maven

  • Статьи , 25 февраля 2019 в 14:51
  • Сергей Штукатуров

Maven — инструмент для автоматизации сборки проектов. С ним работают в основном Java-разработчики, хотя есть плагины для интеграции с C/C++, Ruby, Scala, PHP и другими языками. В статье будут рассмотрены особенности и область применения Maven, описан процесс установки и начала работы, а также разобрана структура файла описания проекта.

Назначение и особенности

Собрать на Java проект уровня «Hello, world!» можно и с помощью командной строки. Но чем сложнее разрабатываемое ПО и чем больше оно использует сторонних библиотек и ресурсов, тем сложнее будет команда для сборки. Maven разработан для облегчения этой работы.

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

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

15 июня – 9 июля , онлайн, от 13 000 до 52 000 ₽

Разработчики также подчёркивают независимость фреймворка от ОС. При работе из командной строки параметры зависят от платформы, но Maven позволяет не обращать внимания на этот аспект.

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

В этой статье мы будем работать с Maven с помощью командной строки, однако этот фреймворк также интегрирован в Eclipse, IntelliJ IDEA, NetBeans и другие IDE.

Установка, настройка и создание стандартного проекта

Скачать Maven можно с официальной страницы проекта. Там же вас познакомят с минимальными требованиями — на машине должен быть установлен JDK, а также потребуется свободное место на диске, около 500 мегабайт. Это место нужно не для самой установки, оно будет использовано для создания локального репозитория.

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

Архив можно распаковать в любое удобное место. После этого нужно добавить путь к папке bin из распакованного архива в переменную среды PATH . В Windows нужно зайти в настройки параметров системы (вызывается комбинацией клавиш Win+Pause или щелчком правой кнопкой мыши по ярлыку «Мой / Этот компьютер» -> «Свойства»), и выбрать пункт «Дополнительные параметры системы». В правом нижнем углу нажмите кнопку «Переменные среды». Выберите переменную PATH , нажмите «Изменить», в открывшемся окне — «Создать» и добавьте путь. Обратите внимание, путь должен вести именно к папке bin .

В ОС на основе Unix переменную среды можно добавить консольной командной:

Проверить, всё ли сделано правильно, можно с помощью консольной команды mvn -v . Вы должны увидеть что-то подобное:

Создаём папку для нового проекта и переходим в неё. Далее создаём новый проект. Для этого в консоли выполните команду:

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

archetype : generate это так называемая цель. Она указывает Maven, что нужно создать проект из архетипа. Дальше с помощью -D мы указываем определённые параметры генерации.

  • groupId = com . mycompany . app указывает на разработчика ПО, там вы можете указать доменное имя своей компании.
  • artifactId = my — app — название проекта. Maven оперирует так называемыми артефактами. Это приложения, плагины, архетипы и другие проекты. И ваша разработка также будет считаться артефактом.
  • archetypeArtifactId = maven — archetype — quickstart указывает, какой архетип использовать в качестве шаблона для создания приложения. Как видите, это тоже артефакт. Указанный архетип создаст простой проект, сгенерирует структуру каталогов и даже заботливо положит в папку исходников программу «Hello, world!», чтобы вам не пришлось самому писать её в двухсотый раз.
  • archetypeVersion = 1.4 указывает на версию артефакта «архетип».
  • interactiveMode = false отключает создание проекта в интерактивном режиме. Вы можете запустить цель archetype : generate без параметров, и Maven предложит установить параметры в процессе генерации. В данном случае нам это не нужно. Кстати, отключить интерактивный режим можно параметром -B . Полный список параметров для mvn можно получить по команде mvn -h .

Выполнив команду, Maven сгенерирует следующую структуру проекта:

Исходники нашего проекта будут лежать в папке src/main/java (и сейчас там уже есть автоматически сгенерированный файл), но нам сейчас интереснее файл pom.xml в корневом каталоге. Это и есть тот самый файл описания проекта, на основе которого осуществляются все операции Maven. Он написан на языке POM, входящим в семейство XML:

Разберёмся, что всё это значит.

Что значат теги в pom.xml

Тег project является базовым и содержит всю информацию о проекте. В заголовке указана информация, необходимая Maven для понимания файла pom.xml . Тег modelVersion указывает на текущую версию POM. Эти два тега обычно генерируются автоматически, менять их не нужно.

Затем идёт информация, формирующая уникальный идентификатор проекта, теги groupId и artifactId . Её мы задавали выше при генерации из архетипа. Тег version тоже входит в эту группу. Он обычно генерируется и обновляется автоматически. После номера версии идёт суффикс -SNAPSHOT . Это означает, что проект находится в стадии разработки. В процессе выпуска ПО фреймворк уберёт этот суффикс, а если разработка продолжится — автоматически увеличит номер версии. Вместе эти три тега позволяют однозначно идентифицировать артефакт.

name содержит отображаемое имя артефакта, а url — ссылку на сайт. Поскольку сайт не задан при генерации, pom.xml содержит напоминание об этом в виде комментария. Кроме того, можно добавить краткое описание в description . Эти три тега зачастую используются при формировании документации.

Дальше мы видим блок properties . Здесь указаны особые настройки, такие как кодировка файла и используемая версия компилятора Java. Без этого блока можно обойтись, положившись на настройки по умолчанию.

Следом идёт очень важный блок dependencies . В нём описываются все используемые в проекте зависимости. Каждую необходимо выделить тегом dependency и указать уникальные идентификационные данные: groupId , artifactId и version . Maven сам подгрузит транзитивные зависимости. Кроме того, с помощью тега scope можно указать этапы, на которых будет использован артефакт. Сейчас в pom.xml всего одна зависимость — артефакт JUnit, библиотека для модульного тестирования на Java, которая будет использоваться только на стадии тестирования.

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

  1. Проверка — validate . Фреймворк проверяет, корректен ли проект и предоставлена ли вся необходимая для сборки информация.
  2. Компиляция — compile . Maven компилирует исходники проекта.
  3. Тест — test . Проверка скомпилированных файлов. В нашем случае будет использована библиотека JUnit.
  4. Сборка проекта — package . По умолчанию осуществляется в формате JAR. Этот параметр можно изменить, добавив в project тег packaging .
  5. Интеграционное тестирование — integration-test . Maven обрабатывает и при необходимости распаковывает пакет в среду, где будут выполняться интеграционные тесты.
  6. Верификация — verify . Артефакт проверяется на соответствие критериям качества.
  7. Инсталляция — install . Артефакт попадает в локальный репозиторий. Теперь его можно использовать в качестве зависимости.
  8. Размещение проекта в удалённом репозитории — deploy , — финальная стадия работы.

Эти фазы упорядочены и выполняются поочерёдно. Если необходимо собрать проект, система последовательно проведёт оценку, компиляцию и тестирование, и только после этого сборку. Помимо этого есть две фазы, выполняющиеся отдельно, только прямой командой. Это очистка — clean , удаляющая предыдущие сборки, и создание документации для сайта — site .

Закончим рассмотрение pom.xml секцией build . Она не является обязательной, в данном pom.xml в неё включены плагины из архетипа, однако можно обойтись и без них. Плагинов для Maven тысячи, освоившись с применением фреймворка вы сможете сами подобрать себе необходимые.

В проектах чуть серьёзнее, чем вычисление факториала, приходится использовать внешние ресурсы. Maven способен автоматически обрабатывать файлы ресурсов и размещать их в сборке проекта. Для этого их нужно разместить в папке src/main/resources . Файлы будут упакованы с сохранением внутренней структуры каталогов. Если же по какой-то причине нужно переопределить каталог, используйте вложенные теги resources , resource , directory в секции build :

Итак, с файлом описания мы разобрались. Попробуем собрать проект. Для этого перейдём в корневую папку и выполним команду нужной фазы, mvn package . Получим отчёт о сборке:

Теперь в корневом каталоге проекта вы обнаружите папку target, а в ней готовый файл my-app-1.0-SNAPSHOT.jar .

Запустите команду java — cp target / my — app — 1.0 — SNAPSHOT . jar com . mycompany . app . App — вы должны увидеть «Hello World!».

Поздравляем! Вы собрали проект с помощью Maven. Для более детального изучения инструмента советуем обратить внимание на эти книги и материалы.

IT жизнь

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

среда, 2 декабря 2009 г.

Maven — Использование библиотек, которых нет в официальных репозитариях

Всем известно что одной из сильных сторон Maven является управление зависимостей и возможность скачивать нужные версии библиотек из специального репозитария. Это действительно очень удобно и избавляет от необходимости хранить кучу библиотек прямо в репозитарии проекта.

Когда я переводил на Maven свой первый проект я столкнулся с большой проблемой — а где взять библиотеки, которые не представлены в официальном maven репозитарии, но от которых зависит проект? Честно признаться в первый момент меня этот вопрос поставил в тупик и пришлось призвать на помощь накомых maven-оводов.

Сначала немного теории. Для разрешения зависимостей в Maven используются репозитарии зависимостей, где размещены собранные версии различных библиотек и приложений. При этом в большинстве репозитариев все эти бобилиотеки содержат специальную мета-информацию о своих зависимостях, в формате понятно Maven. Поэтому вы можете в своем проекте сказать что ваше приложение использует API сервера jetty и Maven при сборке автоматическе выкачает сам jetty указанной версии и необходимые для его работы зависимоcти.

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

  • Основной репозитарий Maven 2
  • Maven сайта java.net
  • Maven2 репозитарий JBoss
  • Maven1|2 репозитарий GWT
  • и другие

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

И все-же бывают случаи когда нужной библиотеки в репозитариях нет или вы используете какие либо библиотеки собственной разработки. Тут вам на помощь придет локальный и проектный/корпоративный репозитарий. Разберемся что это такое.

Локальный репозитарий
Такой репозитарий создается на локальной машине с целью кеширования артифактов, выкачиваемых из вышестоящих репозитариев. Поэтому первая сборка Maven проекта идет так долго — необходимо скачать зависимости проекта из внешнего репозитария, а потом и зависимости зависимостей. Таким образом локальный репозитарий быстро разрастается до размеров в несколько гигабайт. Полезно знать где он находится и как перенести его на другой диск.

Настройки репозитария находятся в файле settings.xml, который хранится в домашней папке пользователя ($HOME/.m2 для Linux и $USER_HOME/.m2 для Windows.
Путь к локальному репозитарию задается переменной localRepository и по умолчанию репозитарий находится в папке .m2

Для установки собранных артифактов в локальный репозитарий необходимо выполнить команду mvn install. Для установки в локальный репозитарий кастомных библиотек необходимо использовать расширенный синтаксис поканды install:

mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc -Dversion=11.1.0.7.0 -Dpackaging=jar -Dfile=ojdbc6.jar

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

Чтобы указать эту библиотеку в заивисмостях необходимо написать следующее:

Недостатки:

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

Плюсы:

  • Не требует настройки, администрирования
  • Прост в использовании

На одном из проектов мы некоторое время использовали локальные репозитарии для хранения custom-артифактов, в svn-репозитарии у нас была отдельная папка extlib и bat-файл, который при запуске деплоил все эти библиотеки в локальный репозитарий. Но проблемы с серверами автосборки и необходимость писать письмо на команду «Запустите batник перед сборкой» после каждого обновления библиотеки пересилило лень и мы развернули проектный Maven репозитарий.

Проектный / корпоративный репозитарий

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

  • расшарить папку с репозитарием, и настроить maven на остальных компьютерах на использование этого расшаренного репозитария
  • развернуть свой Maven репозитарий

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

Сейчас существует большое количество продуктов (как закрытых и клатных, так и Open Source), позволяющих развернуть свой Maven репозитарий. Приведу ссылки на некоторые: Apache Archiva, Artifactory, Nexus и другие.
Сейчас я не буду описывать настройку этих продуктов, скажу только что на развертывание Archiva я потрали часа 3.

Для того чтобы задеплоить кстомную библитоеку в репозитарий необходмо будет выполнить следующую команду:

mvn deploy:deploy-file -DgroupId=com.oracle -DartifactId=ojdbc -Dversion=11.1.0.7.0 -Dpackaging=jar -Dfile=ojdbc6.jar -DrepositoryId=archiva -Durl=http://mavenrep:8889/archiva/repository/oracle

Здесь мы указываем:

  • Группу библиотеки
  • Её идентификатор
  • Версию
  • Расположение на диске
  • Адрес репозитария

Для использования в зависимостях необходимо подлючить этот репозитарий к проекту, для этого добавляем:

После этого декларация зависимости не будет отличаться от предыдущего примера.

Maven репозитарии кроме всего проечего предлагают и некоторые дополнительные функции:

  • Прокси для вышестоящих репозитариев
  • Поиск по репозитарию
  • Права доступа
  • и другие

Заключение:

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

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

Ответы на вопросы на собеседование Maven (часть 1).

  • Что такое сборка проекта, автоматизация сборки?

  • Компиляция исходного кода в бинарный код
  • Сборка бинарного кода
  • Выполнение тестов
  • Разворачивание программы на производственной платформе
  • Написание сопроводительной документации или описание изменений новой версии

  • Что такое Maven? Как он работает?

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

  • Какие преимущества Maven?

  • Независимость от OS. Сборка проекта происходит в любой операционной системе. Файл проекта один и тот же.
  • Управление зависимостями. Редко какие проекты пишутся без использования сторонних библиотек(зависимостей). Эти сторонние библиотеки зачастую тоже в свою очередь используют библиотеки разных версий. Maven позволяет управлять такими сложными зависимостями. Что позволяет разрешать конфликты версий и в случае необходимости легко переходить на новые версии библиотек.
  • Возможна сборка из командной строки. Такое часто необходимо для автоматической сборки проекта на сервере (Continuous Integration).
  • Хорошая интеграция со средами разработки. Основные среды разработки на java легко открывают проекты которые собираются c помощью maven. При этом зачастую проект настраивать не нужно — он сразу готов к дальнейшей разработке.
  • Как следствие — если с проектом работают в разных средах разработки, то maven удобный способ хранения настроек. Настроечный файл среды разработки и для сборки один и тот же — меньше дублирования данных и соответственно ошибок.
  • Декларативное описание проекта.

  • Какие недостатки Maven?

  • Неочевидность. Если в Ant указывается команда на удаление — и удаляется файл, то в случае Maven надо всем сердцем довериться плагину и документации по нему.
  • При таком объёме необходимых знаний документации не так много, особенно по каким-то специальным моментам. Да и просто читать придётся много. Порог вхождения, если потребуется собирать даже не самое сложное приложение куда выше, чем у Ant.
  • Если нужно найти какой-то специальный плагин — это будет сделать непросто, плагинов много. И не факт, что найденный подойдёт на все 100% и будет работать без ошибок.
  • Нужен доступ в интернет (или придётся разворачивать собственный репозиторий, что трудоёмко)
  • Большие трудности, если проект не типовий.

  • Какими аспектами управляет Maven?

  • Создание (Build)
  • Документирование (Documentation)
  • Отчёты (Reporting)
  • Зависимости (Dependencies)
  • Релизы (Releases)
  • SCM
  • Список рассылки (Mailing list)
  • Дистрибьюция (Distribution)

  • Как узнать какую версию Maven вы используете?

  • Для чего создан Maven?

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

Структура и сожержание проекта Maven указывается в специальном xml-файле, который назывется Project Object Model (POM), который является базовым модулем всей системы.

  • Какая структура каталогов в Maven?

  • Где вы хранятся файлы классов при компиляции проекта Maven?

Файлы классов хранятся в: $/target/classes/.

  • Что такое pom.xml?

, схема, которая облегчает редактирование и проверку, и версия pom.xml. Внутри тега project содержится основная и обязательная информация о проекте.

  • Какую информацию содержит pom.xml?

  • Зависимости проекта (project dependencies)
  • Плагины (plugins)
  • Задачи/цели (goals)
  • Профиль создания (build profiles)
  • Версия проекта (project version)
  • Разработчики (developers)
  • Список рассылки (mailing list)

  • Что такое супер POM?

Все POM — файлы являются наследниками родительского pom.xml. Этот POM-файл называется Super POM и содержит значения, унаследованные по умолчанию.

  • Какие элементы необходимы для минимального POM?

  • Что такое зависимости в Maven?

  • Что такое артефакт в Maven?

Артефакт (artefact) — это, по сути, любая библиотека, хранящаяся в репозитории (месте хранения). Это может быть какая-то зависимость или плагин. Обычно артефактом является JAR-файл, который хранится в репозитории Maven. Каждый артефакт содержит group ID, artifact ID и версию.

  • Что такое плагин в Maven?

  • Что такое задача в Maven?

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

  • Что такое архетип в Maven?

Архетип (archetype) — это некая стандартная компоновка файлов и каталогов в проектах различного рода (веб, swing-проекты и прочие). Другими словами, Maven знает, как обычно строятся проекты и в соответствии с архетипом создает структуру каталогов.

  • Что такое репозиторий в Maven?

Репозиторий (repository) — глобальное хранилище всех библиотек, доступных для Maven, это место где хранятся артефакты: jar файлы, pom-файлы, javadoc, исходники, плагины.

  • Какие типы репозитория существуют в Maven?

  • Локальный (local) репозиторий — это директория, которая хранится на нашем компьютере. Она создаётся в момент первого выполнения любой команды Maven. По умолчанию она расположена в /.m2/repository — персональная для каждого пользователя.
  • Центральный (central) репозиторий — это репозиториий, который обеспечивается сообществом Maven. Он содержит огромное количество часто используемых библиотек. Который расположен в http://repo1.maven.org/maven2/ и доступен на чтение для всех пользователей в интернете. Если Maven не может найти зависимости в локальном репозитории, то автоматически начинается поиск необходимых файлов в центральном репозитории
  • Удалённые (remote) репозиторий — иногда, Maven не может найти необходимые зависимости в центральном репозитории. В этом случае, процесс сборки прерывается и в консоль выводится сообщение об ошибке. Для того, чтобы предотвратить подобную ситуацию, в Maven предусмотрен механизм Удалённого репозитория, который является репозиторием, который определяется самим разработчиком. Там могут храниться все необходимые зависимости.

  • Какая команда установляет JAR-файл в локальное хранилище?

  • Какой порядок поиска зависимостей Maven?

  1. Поиск зависимостей в локальном репозитории Если зависимости не обнаружены, происходит переход к шагу 2.
  2. Поиск зависимостей в центральном репозитории. Если они не обнаружены и удалённый репозиторий определён, то происходит переход к шагу 4.
  3. Если удалённый репозиторий не определён, то процесс сборки прекращается и выводится сообщение об ошибке.
  4. Поиск зависимостей на удалённом репозитории, если они найдены, то происходит их загрузка в локальный репозиторий, если нет — выводится сообщение об ошибке.

  • Какие два файла настройки есть в Maven, как они называются и где расположены?

  • Каталог где установлен Maven: $M2_Home/conf/settings.xml
  • Домашняя директория пользователя: $/.m2/settings.xml

  • Что такое жизненный цикл сборки в Maven?

  • Назовите основные фазы жизненного цикла сборки Maven?

  • Очистка (clean) — очищает артефакты, созданные до сборки.
  • Сборка (default or build) — используется для создания приложения.
  • Создание сайта проекта (site) — генерирует документацию сайта для проекта.

  • Что делает команда mvn site?

mvn site — создает веб-сайт проекта.

  • Что делает команда mvn clean?

mvn clean — эта команда очищает целевую директорию от созданных в процессе сборки файлов.

Как создать исполняемый JAR с помощью Maven

Введение

В этой статье мы рассмотрим упаковку Maven- проекта в файл Jar . Выясним преимущества и недостатки каждого из подходов, применяемых для создания исполняемого файла.

Конфигурация

Чтобы создать исполняемый файл jar , не требуются дополнительные зависимости. Нам нужно просто создать Java-проект Maven с одним классом и методом main(…) .

В приведенном ниже примере мы создаем Java-класс ExecutableMavenJar. Для этого в файл pom.xml нужно добавить следующие элементы:

Удостоверьтесь в том, что в конфигурации задан тип jar . Теперь можно приступить к реализации каждого из подходов.

Ручная настройка

Для этого мы используем плагин maven-dependency-plugin . Сначала скопируем все необходимые зависимости в указанную папку:

Сначала мы задаем цель copy-dependencies , что указывает Maven скопировать эти зависимости в заданный outputDirectory .

В данном случае мы создадим папку с именем libs внутри каталога сборки проекта (обычно это папка target ).

Затем мы создаем исполняемый файл jar с указанными путями к классам и со ссылкой на зависимости, скопированные на первом шаге:

Наиболее важной частью приведенного выше кода является конфигурация manifest . В ней мы добавляем classpath со всеми зависимостями (папка libs/ ), а также предоставляем информацию о главном классе.

Преимущества и недостатки этого подхода:

  • Преимущества — прозрачный процесс, в рамках которого можно прописать каждый шаг.
  • Недостатки — зависимости находятся вне финального файла jar . Поэтому он будет работать только, если папка libs будет доступна и видима для jar-файла.

Apache Maven Assembly Plugin

Плагин Apache Maven Assembly позволяет объединять выходные данные проекта вместе с зависимостями, модулями, документацией и другими файлами в единый пакет.

Основной целью в плагине сборки является single . Она используется для создания любых сборок. Остальные цели устарели и будут удалены в следующей версии плагина.

Рассмотрим конфигурацию, заданную в файле pom.xml :

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

В descriptorRefs мы указали имя, которое будет добавлено к имени проекта. В нашем случае – это core-java-jar-with-dependencies.jar.

  • Преимущества – зависимости хранятся внутри jar -файла.
  • Недостатки — упрощенный контроль упаковки артефакта. Например, нет поддержки перемещения классов.

Apache Maven Shade Plugin

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

Рассмотрим приведенную ниже конфигурацию:

В этой конфигурации отмечает все зависимости, которые должны быть упакованы в файл jar .

Затем нам нужно указать реализацию трансформатора . В текущем примере мы использовали стандартную версию. В конце задаем основной класс приложения.

Выходной файл получит название core-java-0.1.0-SNAPSHOT-shaded.jar , где core-java — это имя проекта. За ним следуют версия и имя плагина.

  • Преимущества — зависимости внутри jar- файла, расширенный контроль упаковки артефакта.
  • Недостатки — сложная конфигурация (особенно если необходимо использовать расширенные функции).

One Jar Maven Plugin

Плагин предоставляет собственный загрузчик, который знает, как загружать классы и ресурсы из jar-файлов архива.

Рассмотрим приведенную ниже конфигурацию:

Сначала необходимо указать основной класс и прикрепить все зависимости сборки, используя для этого attachToBuild = true .

Также необходимо задать имя файла для вывода. Цель Maven — это one-jar .

В One Jar зависимости jar не будут расширены в файловую систему во время выполнения.

  • Преимущества — позволяет классам располагаться на верхнем уровне One Jar. Плагин поддерживает внешние jar и собственные библиотеки.
  • Недостатки – не обновляется с 2012 года.

Плагин Spring Boot Maven

Плагин позволяет упаковывать исполняемые архивы jar или war и запустить приложение «на месте». Он поддерживает Maven версии 3.2 или выше. Более подробное описание плагина доступно здесь .

Рассмотрим приведенную ниже конфигурацию:

Между Spring и другими плагинами есть два существенных отличия: цель выполнения называется repackage , а классификатор — spring-boot . Обратите внимание, что плагин можно использовать без Spring Boot.

  • Достоинства – зависимости располагаются внутри jar- файла, его можно запускать в любом доступном месте, улучшенный контроль упаковки артефакта, исключение зависимостей из jar- файла и упаковка war файлов.
  • Недостатки — добавляет ненужные классы, связанные с Spring и Spring Boot.

Веб-приложение с исполняемым Tomcat

В последней части статьи мы рассмотрим упаковку автономного веб-приложения в jar -файл. Но для этого понадобится другой плагин.

Чтобы создать jar-файл, запустите man package, который создаст webapp.jar в каталоге target.

Чтобы запустить приложение, просто введите в консоли: java -jar target / webapp.jar и проверьте результат по адресу: localhost:8080/.

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

Обратите внимание на то, что это последняя версия данного плагина, поддерживающая сервер Tomcat7. Чтобы избежать ошибок, обязательно убедитесь в том, что для зависимости Servlets scope задано значение provided. Иначе во время выполнения jar-файла возникнет конфликт:

Заключение

В этой статье мы рассмотрели несколько способов создания исполняемого jar-файла с помощью различных плагинов Maven. Полную реализацию этого руководства вы сможете найти в проектах, опубликованных на Github:

Как проверить? Чтобы скомпилировать проект в исполняемый файл jar , запустите Maven с помощью команды mvn clean package .

Надеемся, что данная статья помогла разобраться в этой теме.

Данная публикация представляет собой перевод статьи « How to Create an Executable JAR with Maven » , подготовленной дружной командой проекта Интернет-технологии.ру

Maven. Часть 1 – Знакомство и настройка

На мой взгляд Maven – это инструмент, без которого нельзя обойтись не одному Java программисту. Что такое Maven и для чего он нужен вы узнаете в этой статье.

Шаг 1. Знакомство с Maven

Apache Maven — фреймворк для автоматизации сборки проектов, специфицированных на XML-языке POM(Project Object Model).

Слово maven происходит из языка Идиш и означает примерно «собиратель знания».

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

Главное преимущество Maven — это управление зависимостями. Редко какие проекты пишутся без использования сторонних библиотек. Эти сторонние библиотеки зачастую тоже в свою очередь используют библиотеки разных версий. Maven позволяет управлять такими сложными зависимостями, что позволяет разрешать конфликты версий и в случае необходимости легко переходить на новые версии библиотек.

Шаг 2. Установка Maven в OS Windows

Для начало скачаем Framework Maven.

На момент написания статьи самая новая версия Maven 3.0.5 скачать можно тут: http://maven.apache.org/download.cgi (apache-maven-3.0.5-bin.zip)

После того как мы скачали Maven, начинаем его установку.

1. Распаковываем zip архив в любую удобную для вас директорию, я распаковываю в корень диска для удобства C:\apache-maven-3.0.5

2. Создаем переменную среды с именем M2_HOME.

Для этого заходим в Win+Pause, далее “Дополнительные параметры системы” -> “Переменные среды, затем “Создать” указываем имя переменной “M2_HOME” и задаете значение, являющееся путем к директории apache-maven-3.0.5, у меня путь получился таким: C:\apache-maven-3.0.5

3) В этом же диалоговом окне создайте переменную с именем M2 и присвойте ей значение %M2_HOME%bin

4) Здесь же создайте еще переменную MAVEN_OPTS и присвойте ей значение -Xms256m или -Xmx512m. Это зависит от настроек вашей виртуальной машины. Данный пункт является необязательным, он просто дает некоторые дополнительные возможности для Maven.

5) Здесь же создайте или измените переменную Path, присвоив ей значение %M2%. Данное действие позволит нам работать с Maven через командную строку.

6) Также убедитесь, что у вас есть переменная с именем JAVA_HOME и она содержит путь к вашему JDK. К примеру: C:Program FilesJavajdk1.7.0

7) Откройте командную строку и выполните в ней mvn —version, чтобы убедиться в корректной установке. Вы должны увидеть информацию о текущей версии Maven.

Шаг 3. Установка Maven в Intellij IDEA

Или же если вы пользуетесь средой разработки Intellij IDEA, то достаточно зайти в Maven и установить путь: C:\apache-maven-3.0.5 :

Как с помощью maven работать с библиотеками, которых в maven нет

Войти

Java: создание запускаемой программы с maven

Я читал разные высказывания по-поводу maven. Кто-то пишет, что это — вселенское зло и его нельзя использовать ни вкоем случае (ЧСХ, эти же люди обычно придёрживаются того же мнения и о boost, если речь идёт о С++). Кто-то, что это сильно облегчает жизнь и вообще делает работу разрабочика nice & easy. Я лично придёрживаюсь промежуточной точки зрения — как и всякая 3-rd pary library, maven имеет свои приемущества и недостатки, но при правильном подходе приемущества всё же будут перевешивать.

Поэтому я лично использую maven для всех Java-проектов (с eclipse это просто), доверяю ему закачивать нужные библиотеки и прочее, в том же духе. В частности — я использую компилятор maven для создания jar файлов. Не поймите меня превратно — встроенный компилятор eclipse — это тоже отличная штука, но, если вы используете дополнительные библиотеки, то они будут перкомиллированны и встроены в итоговый jar, что, согласитесь, никак не вяжется с понятием «библиотека». Кроме того, если уж используете maven, то его следует использовать во всём и не устраивать компромисса между технологиями.

На самом деле, настройка компилятора maven не так уж и сложна, и, сделав это один раз, вы сможете легко копировать настройки в другие проекты. Причём, вы даже не будете ограничены в выборе способа пакетирования (pom, к примеру, будет работать так же хорошо, как и jar). В maven вся настройка осуществляется через pom.xml, который можно редактировать, как простой текстовый файл. Я не будут рассказывать, как сделать maven проект (mvn eclipse:eclipse) ибо это слишком тривиально, будем считать, что он у вас уже есть.

Предположим, что ваш pom файл выглядит примерно так (пусть проект называется org.my_projects.foo):

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

Не знаю, почему этот тег не создаётся автоматически. Затем определим константу для версии java:

И место для добавления плагинов:

Теперь, собственно, сами плагины, с которым нам придётся работать. Прежде всего, нам потребуется org.apache.maven.plugins.maven-compiler-p lugin который будет собирать для нас итоговый jar. На данный момент доступа версия 3.1:

Тут всё довольно просто. Для задания версии java мы используем константу, которую мы только что определили. Теперь, если вы сохраните этот файл и выполните mvn package, вы получите foo-1.0.0.jar. Однако, работать он не будет, так как в нём будет отсутствовать весьма важная часть — манифест. Для создания манифеста используется другой плагин: org.apache.maven.plugins.maven-jar-plugi n.

В данном случае подразумевается, что ваш основной класс называется App из пакета org.my_projects.foo. Теперь, если вы выполните mvn package, вы получите jar, содержащий манифест META-INF/MANIFEST.MF на подобии:

Manifest-Version: 1.0
Built-By: Darth Vader
Build-Jdk: 1.7.0_65
Created-By: Apache Maven 3.0.5
Main-Class: org.my_projects.foo.App
Archiver-Version: Plexus Archiver

Всё бы хорошо, но в данном манифесте отсуствует одна весьма важная деталь, — Class-Path. Это означает, что, если вы используете дополнительные билиотеки (к примеру супер библиотеку org.my_projects.bar) то java её не найдёт и вам придётся указывать путь к неё в ручную. Что бы этого избежать, используется третий и последний, на сегодня, плагин: org.apache.maven.plugins.maven-dependenc y-plugin (доступная версия, на момент написания статьи — 2.9):

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

Далее, добавим Class-Path в :

Ну и добавим экспорт библиотек:

Как видите, ничего сложного. Теперь, если вы выполните mvn package, в директории jars появится bar-1.0.0.jar а в манифесте — путь к нему.

Читать еще:  Концепции объектно-ориентированного программирования — ООП в Java
Ссылка на основную публикацию
Статьи c упоминанием слов:
Adblock
detector