Как сделать чтобы maven автоматически подгружал зависимости
Сборка (англ. assembly) - двоичный файл, содержащий исполняемый код программы или другой, подготовленный для использования информационный продукт. Сборка проекта - это в том числе процесс создания необходимого двоичного файла.
Автоматизация сборки - этап написания скриптов или автоматизация широкого спектра задач применительно к ПО, применяемому разработчиками в их повседневной деятельности, включая такие действия, как:
Что такое Maven? Как он работает?
Apache Maven - это Java фреймворк для автоматизации сборки проектов, компиляции, создания jar, создания дистрибутива программы, генерации документации.
Если собирать большие проекты с командной строки, то команда для сборки будет очень длинной, поэтому её иногда записывают в bat/sh скрипт. Но такие скрипты зависят от платформы. Для того чтобы избавиться от этой зависимости и упростить написание скрипта, используют инструменты для сборки проекта.
Maven обеспечивает декларативную, а не императивную сборку проекта. То есть, в файлах проекта pom.xml содержится его описание, а не отдельные команды. Все задачи по обработке файлов в Maven выполняется через плагины.
Какие преимущества Maven?
Основные преимущества Maven:
Независимость от ОС. Сборка проекта происходит в любой операционной системе. Файл проекта один и тот же.
Управление зависимостями. Редко какие проекты пишутся без использования сторонних библиотек(зависимостей). Эти сторонние библиотеки зачастую тоже в свою очередь используют библиотеки разных версий. Maven позволяет управлять такими сложными зависимостями. Это позволяет разрешать конфликты версий, и в случае необходимости, легко переходить на новые версии библиотек.
Возможна сборка из командной строки. Такое часто необходимо для автоматической сборки проекта на сервере (Continuous Integration).
Хорошая интеграция со средами разработки. Основные среды разработки на java легко открывают проекты, которые собираются c помощью maven. При этом зачастую проект настраивать не нужно: он сразу готов к дальнейшей разработке.
Как следствие, если с проектом работают в разных средах разработки, то maven удобный способ хранения настроек. Настроечный файл среды разработки и для сборки один и тот же - меньше дублирования данных и, соответственно, ошибок.
Какие недостатки Maven?
Неочевидность. Если в Apache Ant указывается команда на удаление, и удаляется файл, то в случае Maven надо всем сердцем довериться плагину и документации по нему.
При таком объёме необходимых знаний документации не так много, особенно по каким-то специальным моментам. Да и просто читать придётся много. Порог вхождения, если потребуется собирать даже не самое сложное приложение куда выше, чем у Ant.
Если нужно найти какой-то специальный плагин - это будет сделать непросто, плагинов много. И не факт, что найденный подойдёт на все 100% и будет работать без ошибок.
Какими аспектами управляет Maven?
Вот основные аспекты, которыми позволяет управлять Maven:
Как узнать, какую версию Maven вы используете?
Версию можно узнать с помощью следующей команды:
Для чего был создан Maven?
Основной целью Maven является предоставление разработчику:
Понятной модели для проектов, которая может быть использована повторно и была бы проста в поддержании.
Структура и содержание проекта Maven указывается в специальном xml-файле, который назывется Project Object Model (POM), который является базовым модулем всей системы.
Какая структура каталогов в Maven?
В Maven стандартная структура каталогов, благодаря ей отпадает необходимость прописывать пути к файлам проекта. В корневом каталоге проекта находится pom.xml и несколько текстовых файлов. Всё остальное хозяйство аккуратно разложено в подкаталогах. Главные из них - src и target. Однако, порядок сохраняется и вглубь:
src/main/java | Application/Library sources | исходный код приложения или библиотеки |
src/main/resources | Application/Library resources | ресурсы приложения или библиотеки |
src/main/filters | Resource filter files | файлы с параметрами фильтрации ресурсов |
src/main/webapp | Web application sources | исходный код веб-приложения |
src/test/java | Test sources | исходный код тестов (юнит-тестов) |
src/test/resources | Test resources | ресурсы юнит тестов |
src/test/filters | Test resource filter files | файлы с параметрами фильтрации ресурсов для тестов |
src/it | Integration Tests (primarily for plugins) | интеграционные тесты (в основном для плагинов) |
src/assembly | Assembly descriptors | дескрипторы сборки |
src/site | Site | вебсайт приложения (документация) |
LICENSE.txt | Project's license | лицензионное соглашение проекта |
NOTICE.txt | Notices and attributions required by libraries that the project depends on | замечания и необходимые атрибуты библиотек, от зависит проект |
README.txt | Project's readme | краткое описание проекта |
Где хранятся файлы классов при компиляции проекта Maven?
Файлы классов хранятся в: $/target/classes/ .
Что такое pom.xml?
pom.xml - это XML-файл, который содержит информацию о конфигурации и деталях проекта, используемых при создании проекта на Maven. Он всегда находится в базовом каталоге проекта. Этот файл также содержит описание задач, список и параметры плагинов.
Во время выполнения задач, Maven ищет файл pom.xml в базовой директории проекта. Он читает его и получает необходимую информацию, после чего выполняет задачи.
содержит ссылку на схему XML, которая облегчает редактирование и проверку pom.xml :
Внутри тега project содержится основная и обязательная информация о проекте.
Какую информацию содержит pom.xml?
Среди информации которую содержит pom.xml, мы можем выделить следующие блоки:
Что такое супер POM?
Все POM-файлы являются наследниками родительского pom.xml . Этот POM-файл называется Super POM и содержит значения, унаследованные по умолчанию.
Какие элементы необходимы для минимального POM?
Обязательные элементы для минимального POM это корневой элемент, modelVersion , GroupID , artifactID и версия. Минимальный POM файл:
Что такое зависимости в Maven?
Зависимость (dependency) - это те библиотеки, которые непосредственно используются в вашем проекте для компиляции кода или его тестирования.
Что такое артефакт в Maven?
Артефакт (artefact) - это, по сути, любая библиотека, хранящаяся в репозитарии (месте хранения). Это может быть какая-то зависимость или плагин. Обычно артефактом является JAR-файл, который хранится в репозитарии Maven. Каждый артефакт содержит group ID , artifact ID и версию.
Что такое плагин в Maven?
Плагин (plugin) - это зависимости Maven'а, расширяющие его функционал.
Что такое задача в Maven?
Задача (goal) - это специальная задача, которая относится к сборке проекта и его управлению. Она может привязываться как к нескольким фазам, так и ни к одной. Задача, которая не привязана ни к одной фазе, может быть запущена вне фаз сборки с помощью прямого вызова.
Что такое архетип в Maven?
Архетип (archetype) - это некая стандартная компоновка файлов и каталогов в проектах различного рода (веб, swing-проекты и прочие). Другими словами, Maven знает, как обычно строятся проекты и в соответствии с архетипом создает структуру каталогов.
Что такое репозитарий в Maven?
репозитарий (repository) - глобальное хранилище всех библиотек, доступных для Maven, это место где хранятся артефакты: jar файлы, pom-файлы, javadoc, исходники, плагины.
Какие типы репозитария существуют в Maven?
В Maven существуют три типа репозитариев:
Локальный (local) репозитарий - это директория, которая хранится на нашем компьютере. Она создаётся в момент первого выполнения любой команды Maven. По умолчанию она расположена в /.m2/repository - персональная для каждого пользователя. Фактически она является кэшем для центрального и удалённого репозитариев.
Какая команда устанавливает JAR-файл в локальное хранилище (репозитарий)?
Какой порядок поиска зависимостей Maven?
Когда мы выполняем собрку проекта в Maven, автоматически начинается поиск необходимых зависимостей в следующем порядке:
Поиск зависимостей в локальном репозитарии. Если зависимости не обнаружены, происходит переход к шагу 2.
Поиск зависимостей в центральном репозитарии. Если они не обнаружены и удалённый репозитарий определён, то происходит переход к шагу 4.
Какие два файла настройки есть в Maven, как они называются и где расположены?
В Maven, файлы настройки называются settings.xml , и они расположены в двух местах:
Что такое жизненный цикл сборки в Maven?
Жизненный цикл сборки (Lifecycle) - это чётко определённая последовательность фаз, во время выполнения которых должны быть достигнуты определённые цели. Здесь фаза представляет собой стадию жизненного цикла.
Назовите основные фазы жизненного цикла сборки Maven?
Когда Maven начинает сборку проекта, он проходит через определённую последовательность фаз сборки, и выполняет определенные задачи, которые указаны в каждой из фаз.
В Maven есть следующие три стандартных жизненных цикла:
Что делает команда mvn site?
создает веб-сайт проекта.
Что делает команда mvn clean?
эта команда очищает целевую директорию от созданных в процессе сборки файлов.
Из каких фаз состоит жизненный цикл сборки Clean?
Жизненный цикл сборки Clean состоит из следующих этапов:
Из каких фаз состоит жизненный цикл сборки Default (Build)?
Default (Build) - это основной жизненный цикл Maven, который используется для сборки проектов. Он включает в себя следующие фазы:
validate - проверяет корректность метаинформации о проекте, подтверждает, является ли проект корректным и вся ли необходимая информация доступа для завершения процесса сборки.
process-sources - обрабатывает исходный код (подготавливает). Например, фильтрует определённые значения.
process-classes - обработка файлов, полученных в результате компляции. Например, оптимизация байт-кода Java классов.
generate-test-sources - генерирует любые тестовые ресурсы, которые должны быть включены в фазу компиляции.
prepare-package - выполняет все необходимые операции для подготовки пакета, непосредственно перед упаковкой.
package - преобразует скомпилированный код и пакет в дистрибутивный формат. Такие как JAR, WAR или EAR.
integration-test - обрабатывает и распаковывает пакет, если необходимо, в среду, где будут выполняться интеграционные тесты.
post-integration-test - выполняет действия, необходимые после выполнения интеграционных тестов. Например, освобождение ресурсов.
verify - выполняет любые проверки для подтверждения того, что пакет пригоден и отвечает критериям качества.
install - переносит пакет в локальный репозитарий, откуда он будет доступен для использования как зависимость в других проектах.
deploy - копирует финальный пакет (архив) в удалённый репозитарий для, того, чтобы сделать его доступным другим разработчикам и проектам.
Здесь также необходимо уточнить два момента:
Когда мы выполняем команду Maven, например install , то будут выполнены фазы до install и фаза install .
Различные задачи Maven будут привязаны к различным фазам жизненного цикла Maven в зависимости от типа архива (JAR/WAR/EAR).
Я хочу упаковать свой проект в один исполняемый JAR для распространения.
Как я могу сделать пакет проекта Maven для всех JAR-зависимостей в моем выходном JAR?
ОТВЕТЫ
Ответ 1
и вы запустите его с помощью
Компиляция цели должна быть добавлена перед сборкой: один или иначе код в вашем собственном проекте не включен.
Подробнее см. в комментариях.
Обычно эта цель привязана к фазе сборки для автоматического выполнения. Это гарантирует создание JAR при выполнении mvn install или выполнении развертывания/выпуска.
Ответ 2
Вы можете использовать плагин зависимости, чтобы генерировать все зависимости в отдельном каталоге до фазы пакета, а затем включать это в путь к классам манифеста:
В качестве альтернативы используйте $/classes/lib как OutputDirectory для интеграции всех jar файлов в основную банку, но тогда вам нужно будет добавить пользовательский код загрузки классов для загрузки баннеров.
Ответ 3
Я писал о различных способах этого.
Примечания
Эти плюсы и минусы предоставляются Stephan.
Для ручного развертывания
- Pros
- Cons
- Зависимости находятся вне финальной банки.
Зависимости копирования для определенного каталога
Сделать Jar Executable и Classpath Aware
В этот момент jar на самом деле выполняется с внешними элементами classpath.
Создание развертываемых архивов
Файл jar доступен только в каталоге sibling . lib/ . Нам нужно сделать архивы для развертывания с каталогом и его содержимым.
Теперь у вас есть target/$.(zip|tar|tar.bz2|tar.gz) , каждый из которых содержит jar и lib/* .
Плагин сборки Apache Maven
- Pros
- Cons
- Не поддерживается перемещение класса (используйте maven-shade-plugin, если требуется переместить класс).
У вас есть target/$-jar-with-dependencies.jar .
Apache Maven Shade Plugin
onejar-Maven-плагин
- Pros
- Cons
- Не активно поддерживается с 2012 года.
Spring Плагин загрузки Maven
- Pros
- Cons
- Добавьте потенциальные ненужные классы Spring и Spring, связанные с загрузкой.
Ответ 4
Принимая неотвеченный ответ и переформатируя его, мы имеем:
Затем я бы рекомендовал сделать это естественной частью вашей сборки, а не чем-то явно. Чтобы сделать это неотъемлемой частью вашей сборки, добавьте этот плагин в свой pom.xml и привяжите его к событию жизненного цикла package . Однако получить то, что вам нужно вызвать цель assembly:single , если поместить это в свой pom.xml, в то время как вы вызовете "сборка: сборка", если вы выполните его вручную из командной строки.
Ответ 5
Используйте плагин maven-shade для упаковки всех зависимостей в одну uber-jar. Его также можно использовать для создания исполняемого банку, указав основной класс. Попробовав использовать maven-assembly и maven-jar, я обнаружил, что этот плагин лучше всего подходит для моих потребностей.
Я нашел этот плагин особенно полезным, так как он объединяет содержимое определенных файлов, а не переписывает их. Это необходимо, когда есть файлы ресурсов, которые имеют одно и то же имя в банках, и плагин пытается упаковать все файлы ресурсов
Ответ 6
Длинный использовал плагин сборки maven, но я не смог найти решение проблемы с "already added, skipping" . Теперь я использую другой плагин - onejar-maven-plugin. Пример ниже ( mvn package build jar):
Вам нужно добавить репозиторий для этого плагина:
Ответ 7
Вы можете использовать maven-dependency-plugin, но вопрос заключается в том, как создать исполняемый JAR. Для этого требуется следующее изменение в ответе Мэтью Франглен (кстати, использование плагина зависимостей занимает больше времени, чтобы строить при запуске с чистой цели):
Ответ 8
Другой вариант, если вы действительно хотите переупаковать содержимое другого JAR-содержимого внутри вашего единственного результирующего JAR, это плагин сборки Maven. Он распаковывает, а затем перегружает все в каталог через true . Тогда у вас будет второй проход, который встроил бы его в один массив JAR.
Еще один вариант - плагин OneJar. Это выполняет вышеупомянутые действия по переупаковке всего за один шаг.
Ответ 9
Вы можете добавить следующее к pom.xml:
Затем вам нужно переключиться через консоль в каталог, где находится pom.xml. Затем вам нужно выполнить сборку mvn: single, и, как мы надеемся, будет создан исполняемый JAR файл с зависимостями. Вы можете проверить его при переключении на выходной (целевой) каталог с помощью cd./target и запустить свою банку с помощью команды, аналогичной java -jar mavenproject1-1.0-SNAPSHOT-jar-with- dependencies.jar.
Я тестировал это с помощью Apache Maven 3.0.3.
Ответ 10
Вы можете объединить maven-shade-plugin и maven-jar-plugin .
- maven-shade-plugin объединяет ваши классы и все зависимости в одном файле jar.
- Настройте maven-jar-plugin , чтобы указать основной класс исполняемого jar (см. Настройка пути к классу, глава "Сделать исполняемый файл Jar" ).
Пример конфигурации POM для maven-jar-plugin :
Наконец, создайте исполняемую банку, вызвав:
Ответ 11
Имейте в виду, что для обеспечения правильной работы ваших зависимостей необходимо иметь область компиляции или времени выполнения.
Ответ 12
Вы можете использовать плагин Maven-Shade для создания Uber Jar, как показано ниже
Ответ 13
Кен Лю прав, на мой взгляд. Плагин зависимостей maven позволяет вам расширять все зависимости, которые затем можно рассматривать как ресурсы. Это позволяет включить их в основной артефакт. Использование плагина сборки создает вторичный артефакт, который может быть трудно модифицировать - в моем случае я хотел добавить пользовательские записи манифеста. Мой pom оказался следующим:
Ответ 14
Должно быть так:
Распаковка должна быть в фазе создания ресурсов, потому что, если она находится в фазе упаковки, она не будет включена в качестве ресурсов. Попробуйте чистую упаковку, и вы увидите.
Ответ 15
Здесь исполняемый плагин jar для Maven, который мы используем в Credit Karma. Он создает банку банок с загрузчиком классов, способным загружать классы из вложенных банок. Это позволяет вам иметь один и тот же путь класса в dev и prod и по-прежнему держать все классы в одном подписанном файле jar.
Ответ 16
Используйте onejar plugin, чтобы создать его как один исполняемый файл jar, который упаковывает в него все банки с зависимостями. Это решило мою проблему, которая была схожа с этим. Когда использовался плагин сборки, он распаковывал все баны для зависимостей в исходную папку и переупаковывал их как банку, он написал все аналогичные реализации, которые у меня были внутри моего кода, которые имели одинаковые имена классов. onejar - это простое решение.
Ответ 17
Проблема с поиском общего файла сборки с помощью maven-assembly-plugin-2.2.1?
Попробуйте использовать параметр конфигурации descriptorId вместо параметров descriptors/descriptor или descriptorRefs/descriptorRef.
Ни один из них не делает то, что вам нужно: ищите файл в classpath. Конечно, вам нужно добавить пакет, в котором общая сборка находится в пути к классу maven-assembly-plugin (см. Ниже). Если вы используете Maven 2.x (не Maven 3.x), вам может потребоваться добавить эту зависимость в самый верхний родительский pom.xml в разделе pluginManagement.
Смотрите это для более подробной информации.
Ответ 18
Я не буду напрямую отвечать на этот вопрос, как это уже делали другие, но я действительно задаюсь вопросом, стоит ли вставлять все зависимости в сам проект.
Я вижу суть (простота развертывания/использования), но это зависит от варианта использования вашего проекта (и могут быть альтернативы (см. ниже)).
Если вы используете его полностью автономно, почему бы и нет.
Но если вы используете свой проект в других контекстах (например, в webapp или забрасываете в папку, где сидят другие банки), у вас могут быть дубликаты дубликатов в вашем пути к классам (те, которые находятся в папке, то есть в банках). Возможно, это не сделка с предложением, но я обычно избегаю этого.
- Разверните свое приложение как .zip/.war: архив содержит вашу банку проекта и все зависимые баночки;
- используйте механизм динамического класса (см. Spring, или вы можете легко сделать это самостоятельно), чтобы иметь единственную точку входа вашего проекта (один класс для запуска - см. механизм манифеста на другом ответе), который добавит (динамически) к текущему пути к классу всех остальных необходимых банок.
Подобно этому, в конце концов, просто манифест и "специальная динамическая загрузка класса", вы можете запустить свой проект с помощью:
Ответ 19
Чтобы решить эту проблему, мы будем использовать Maven Assembly Plugin, который создаст JAR вместе с зависимыми JAR файлами в один исполняемый JAR файл. Просто добавьте ниже конфигурацию плагина в ваш файл pom.xml.
После этого не забудьте запустить инструмент MAVEN с помощью этой команды mvn clean compile Assembly: single
Ответ 20
Чтобы создать исполняемый JAR из самой командной строки, просто запустите приведенную ниже команду из пути проекта:
Ответ 21
Я сравнил плагины деревьев, упомянутые в этом посте. Я создал 2 баночки и каталог со всеми банками. Я сравнил результаты и, безусловно, лучший плагин maven-shade. Моя проблема заключалась в том, что у меня есть несколько ресурсов spring, которые необходимо объединить, а также jax-rs и JDBC-сервисы. Они были полностью объединены плагином с оттенком по сравнению с плагином maven-assembly-plugin. В этом случае spring завершится с ошибкой, если вы не скопируете их в папку собственных ресурсов и не объедините их вручную один раз. Оба плагина выводят правильное дерево зависимостей. У меня было несколько областей, таких как тестирование, предоставление, компиляция и т.д. Тест и предоставленные были пропущены обоими плагинами. Они оба выпустили один и тот же манифест, но я смог консолидировать лицензии с помощью плагина с использованием своего трансформатора. Разумеется, с плагином maven-dependency у вас нет этих проблем, потому что банки не извлекаются. Но, как и некоторые другие, вы указали, что вам нужно иметь один дополнительный файл для правильной работы. Ниже приведен фрагмент pom.xml
Ответ 22
Что-то, что сработало для меня, было:
У меня был необычный случай, потому что моя зависимость была системной:
Я изменил код, предоставленный @user189057, с изменениями: 1) maven-dependency-plugin выполняется на этапе "подготовить пакет" 2) Я извлекаю распакованную classess непосредственно в "target/classes"
Ответ 23
Ответ 24
Я попробовал самый опротестованный ответ здесь, и смог получить флягу. Но программа работает неправильно. Я не знаю, в чем причина. Когда я пытаюсь запустить из Eclipse , у меня получается другой результат, но когда я запускаю jar из командной строки, я получаю другой результат (он выходит из строя с ошибкой времени выполнения программы).
У меня было такое же требование, как и у OP, что у меня было слишком много (Maven) зависимостей для моего проекта. К счастью, единственным решением, которое сработало для меня, было то, что с помощью Eclipse . Очень просто и очень просто. Это не решение для OP, но решение для тех, кто имеет аналогичное требование, но со многими зависимостями Maven,
1) Просто щелкните правой кнопкой мыши папку проекта (в Eclipse) и выберите Export
2) Затем выберите Java → Runnable Jar
3) Вам будет предложено выбрать расположение файла jar
4) Наконец, выберите класс, у которого есть метод Main, который вы хотите запустить, и выберите Package dependencies with the Jar file и нажмите Finish
Ответ 25
Это лучший способ найти:
В этой конфигурации все зависимости будут расположены в /dependency-jars . Мое приложение не имеет класса Main , а только контекстных, но одна из моих зависимостей имеет класс Main ( com.myDomain.etc.MainClassName ), который запускает сервер JMX и получает параметр start или stop . Поэтому с этим я смог запустить свое приложение следующим образом:
Я жду, что это будет полезно для всех вас.
Ответ 26
Это также может быть вариант, вы сможете создать свой файл jar
Ответ 27
Для тех, кто ищет опции для исключения определенных зависимостей от uber-jar, это решение, которое сработало для меня:
Так что это не конфигурация mvn-assembly-plugin, а свойство зависимости.
Ответ 28
Конфигурация плагина maven
построить
Ответ 29
Добавить в pom.xml:
Это оно. Следующий пакет mvn также создаст еще один толстый jar файл, включая все jar файлы зависимостей.
Ответ 30
Модуль maven-assembly-plug работал отлично для меня. Я часами сидел с плагином maven-dependency и не мог заставить его работать. Основная причина заключалась в том, что я должен был явно определить в разделе конфигурации элементы артефакта, которые должны быть включены, как описано в документации. Например, для случаев, когда вы хотите использовать его, например: mvn dependency:copy , где не включены никакие объекты artifactItems, но это не работает.
ошибка в maven, не хочет подгружать зависимости
Ошибка: Could not transfer artifact org.springframework:spring-webmvc:pom:5.3.9 from/to central.Maven и зависимости
Помогите , пожалуйста . Не могу понять , что вписывать в описание зависимости : <dependencies>.Модульное тестирование: nUnit в определенных ситуациях не хочет подгружать сборку
Начал разбираться с модульным тестированием и столкнулся с неприятными и непонятными моментами -.Динамически подгружать UserControls в зависимости от поля Type во ViewModel
День добрый! Прошу помощи. Есть несколько UserControls: forms:UserControl1.Можно ли без перезагрузки страницы подгружать для карты xml-файл в зависимости от выбранной категории
Если я вывожу карту гугл (код ниже) и беру координаты маркеров для нее из xml-файла, можно ли без.Ошибка Maven зависимости Ehcache
Всем привет. Может кто-то сможет подсказать в чем беда. Есть 2 класса: public class.Зависимости Hibernate для проекта Maven
Здравствуйте! Может кто-нибудь дать скрипт для подтягивания зависимостей (Hibernate и.Maven. как сделать так, чтобы родительские зависимости попадали в дочерний jar
Проблема в следующем. Есть проект назовём его Main. Из него захотелось вытащить часть в.Этот урок освещает создание вами простого Java-приложения с использованием Maven.
Что вы создадите
Вы создадите простое приложение и соберете его с помощью Maven.
Что вам потребуется
- Примерно 15 минут свободного времени
- Любимый текстовый редактор или IDE и выше
Как проходить этот урок
Как и большинство уроков по Spring, вы можете начать с нуля и выполнять каждый шаг, либо пропустить базовые шаги, которые вам уже знакомы. В любом случае, вы в конечном итоге получите рабочий код.
Чтобы начать с нуля, перейдите в Настройка проекта.
Когда вы закончите, можете сравнить получившийся результат с образцом в gs-maven/complete .
Настройка проекта
Для начала вам необходимо настроить Java-проект перед тем, как собрать его Maven'ом. Т.к. урок посвящен Maven, сделаем проект максимально простым, насколько это возможно.
Создание структуры каталогов
В выбранном вами каталоге проекта создайте следующую структуру каталогов; к примеру, командой mkdir -p src/main/java/hello для *nix систем:
Внутри src/main/java/hello директории вы можете создать любые Java-классы, какие вы хотите. Для простоты и согласованности с остальной частью урока, Spring рекомендует вам создать два класса: HelloWorld.java и Greeter.java .
Теперь, когда у вас есть проект, который вы можете собрать с Maven, вам нужно установит сам Maven.
Распакуйте архив и добавьте путь к каталогу bin в переменную окружения path.
Чтобы протестировать правильность установки Maven, запустите в командной строке:
Теперь у вас есть установленный Maven.
Создание простой сборки Maven
Теперь, когда Maven установлен, вам необходимо создать определение Maven-проекта. Maven-проекты определяются как XML-файлы с названием pom.xml. Помимо всего прочего, этот файл определяет имя проекта, версию, а также зависимости от сторонних библиотек.
Создайте файл с названием pom.xml в корневом каталоге проекта и наполните его следующим содержанием:
За исключением дополнительного элемента
, это простейший из pom.xml файлов, необходимый для сборки Java проекта. Он включает следующие детали конфигурации проекта:
- - версия POM-модели (всегда 4.0.0)
- - группа или организация, к которой принадлежит проект. Чаще всего выражается в виде перевернутого наоборот доменного имени
- - имя, которое будет передано библиотеке экземпляра(artifact) проекта (к примеру, имя его JAR или WAR файла)
- - версия, с которой будет собран проект
На данном этапе мы имеем минимальное, но уже рабочее определение Maven-проекта.
Сборка Java кода
Теперь все готово для сборки проекта Maven'ом. Вы можете выполнить несколько этапов жизненного цикла сборки, включая компиляцию кода, создание библиотеки пакета(такого, как JAR-файл) и установку библиотеки в локальный репозиторий Maven зависимостей.
Попробуйте собрать, выполнив команду, приведенную ниже:
Этим вы запустите Maven, передав ему указание на выполнение задачи compile. Когда он закончит, вы должны найни скомпилированные .class файлы в target/classes директории.
Вряд ли вы захотите распостранять или работать напрямую с .class файлами, поэтому вам полее подойдет выполнение задачи 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 :
Задача install включает компиляцию, тестирование, упаковку кода проекта, а затем копирование в локальный репозиторий, тем самым другие проекты смогут ссылаться на него как на зависимость.
Говоря о зависимостях, пришло время объявлять зависимости в Maven сборке.
Объявление зависимостей
Простой "Hello World" пример полностью автономный и не зависит от каких-либо дополнительных библиотек. Однако, большинство приложений зависит от внешних библиотек, с реализацией распостраненного и/или сложного функционала.
К примеру, предположим, что в дополнение к "Hello World!" вы хотите, чтобы приложение печатало текущую дату и время. Вы могли бы использовать функциональность из стандартных(native) Java библиотек, но мы можем сделать это и другими интересными способами, например с помощью Joda Time библиотеки.
Для начала, изменим HelloWorld.java , как показано ниже:
Здесь HelloWorld использует Joda Time LocalTime класс для получения и печати текущего времени.
Этот блок XML объявляет список зависимостей проекта. В частности, он объявляет единственную зависимость от Joda Time библиотеки. В элементе, зависимость определяется через описание трех вложенных элементов:
- - группа или организация, к которой принадлежит зависимость.
- - необходимая библиотека
- - версия необходимой библиотеки
По умолчанию, все зависимости определены как зависимости. Т.е. они должны быть доступны во время компиляции(а если вы собираете WAR-файл, то в /WEB-INF/lib каталоге). Кроме того, вы можете добавить элемент, с одним из значений:
- provided - зависимости, которые требуются для компиляции кода проекта, но которые будут доступны во время выполнения кода контейнером(например, Java Servlet API)
- test - зависимости, которые используются для компиляции и запуска тестов, но не требуемые для сборки или выполнения кода проекта
Сейчас, если вы выполните mvn compile или mvn package , Maven должен будет разрешить Joda Time зависимость из Maven Central репозитория и успешно собрать проект.
Здесь полная версия pom.xml :
Полная версия pom.xml использует Maven Shade Plugin как удобный инструмент для создание выполняемого JAR-файла. Целью данного урока является показать, как начать работать с Maven, не используя, в частности, этот плагин.
Поздравляем! Вы создали простой, но эффективный файл сборки Maven для сборки Java проектов.
У меня есть небольшой вопрос о IDEA IntelliJ 11. Я просто импортировал проект из Subversion - это проект Maven. Но у меня проблема в Maven библиотека зависимостей, так что я могу'т содержать все в Maven зависимостей автоматически - идея показывает зависимость ошибки только тогда, когда я открываю класс/ Вот что я получила здесь:
Поэтому я хочу, чтобы все зависимости будут добавлены автоматически - это возможно или мне придется пройти через все Class-файлы, чтобы определить и добавить Maven-зависимостей?!
Обновление: после некоторых изменений я нашел, как решить мою проблему в некотором роде. Вот что я сделал:
но я думаю, что логически это не будет включать в себя и проверить впереди новые зависимости. Есть ли параметры для этого в intelliJ - авто экспорт зависимостей в переменной classpath ?!
Этот вопрос имеет 1 ответ на английском, чтобы прочитать их войдите в свой аккаунт.
IntelliJ должны загрузить и добавить все зависимости для проекта's автоматически classpath, который пока ваша пом уступчив и все зависимости доступны.
При импорте проектов Maven в IntelliJ информационное окно обычно появляется, прошу вас, если вы хотите настроить авто-импорт для проектов Maven. Это означает, что если вы делаете любые изменения в вашей пом эти изменения будут автоматически загружены.
Вы можете включить такую возможность собирается Файл > Настройки > знаток > импорт, есть флажок, который говорит"проектах Maven автоматически импортировать " и;.
Если это не'т помочь, то я бы посоветовал сделать полную очистку и начать снова:
- Закройте окно проекта (и IntelliJ) и удалить все .файлы IML и все .идея папки (должно быть по одному в каждом модуле)
- Прогон чистой МВН установить из командной строки
- Повторно импортировать проект в IntelliJ и обратите внимание, когда он просит вас включить авто-импорт
IntelliJ 2016 Обновление:
В импорт проектов Maven автоматически установка была перенесена на сборки, выполнения, развертывания и GT; строить инструменты и GT; знаток > импортирование в IntelliJ предпочтения.
Файл [меню] -> настройки -> Мэйвен -> импорт и снять и"использовать maven3 для импорта проекта"
Снова столкнулся с этим, с IntelliJ 15 на этот раз, которой нет "использовать maven3 для импорта на" доступный вариант больше. Причиной было то, что иногда IntelliJ "и не'анализа зависимостей Maven право на" Т; и если он может'т разобрать один из них правильный, он дает на все из них, по-видимому. Вы можете сказать, если это так, открыв окно инструмента проектах Maven (меню-Просмотр> инструмент Windows -> проекты Maven). Затем разверните одну из ваших проектов Maven и его зависимостей. Если зависимости все подчеркнуто красным, то "Хьюстон, у нас проблема с".
Вы можете увидеть на себе настоящую неспособность навести указатель мыши на имя проекта.
Похоже, в данном случае я имел дело с банкой, что я'т иметь соответствующий файл пом (в нашем Мэйвен Нексус РЕПО, а также мой локальный репозиторий). Если это и ваша проблема тоже, и"urrent обойти: если вы на самом деле не нужно использовать классы из Jar в свой собственный код (например, транзитивное и Maven зависимостей только), вы можете на самом деле сделать прочь с комментирование его из пом (временно), проекта Maven перезагрузить, а затем раскомментируйте ее. Как-то после этого IntelliJ точка "не помнит" и его старый рабочий зависимостей. Добавление Мэйвен транзитивное временно исключить также может сделать это, если вы'вновь работает в транзитивной цепочке зависимостей.&и"
Другое дело, что может помочь-использование и"Новая версия" из мавен, чем в комплекте 3.0.5. Для того, чтобы настроить его, чтобы использовать эту опцию по умолчанию, закройте все intellij Windows, затем откройте Настройки -> создание, выполнение и развертывание -> Создать Инструменты -> Maven, и изменить Мэйвен домашний каталог, он должен сказать: "по умолчанию для проекта" вверху, когда вы устанавливаете это, хотя вы можете настроить его для конкретного проекта, а также, как долго, как вы и"повторное импорт" и после настройки он.
Очистить Кэш
Удаление папок кэш intellij (окна: HOMEPATH/.ХХХ в Linux ~/.IdeaIC15) и/или удаления и переустановки самой IntelliJ. Это можно сделать перейдя в файл [меню] -> аннулировать кэш / перезагрузить. . Нажмите Отменить и перезапустить . Это будет переиндексировать весь ваш проект и много трудно отследить решить проблемы с IntelliJ.
Читайте также: