Создание Maven-проекта: archetype, структура каталогов и IntelliJ IDEA - Вопросы
Всего: 5 вопросов
1. Какими способами можно создать Maven-проект и обязательно ли использовать archetype?
Какими способами можно создать Maven-проект и обязательно ли использовать archetype?
Создать Maven-проект — значит получить каталог с файлом pom.xml (координаты groupId, artifactId, version) и стандартной структурой папок src/main/java, src/test/java и других. Способы:
- Командная строка —
mvn archetype:generateпо шаблону (archetype). Нужны установленные Maven и JDK; работает везде, в том числе на сервере и в скриптах, но шаблон может содержать устаревшие настройки —pom.xmlнужно проверить. - IntelliJ IDEA — мастер New Project: генератор Java с Build system = Maven или генератор Maven Archetype. Maven встроен в IDE, проект сразу импортирован.
- Вручную — написать
pom.xmlи создать каталоги. Полный контроль, ничего лишнего; так переводят на Maven уже существующий код.
Archetype не обязателен: это лишь способ быстро получить заготовку. Maven-проектом каталог делает pom.xml и стандартная структура папок. Результат во всех случаях одинаковый — проект, который собирается командой mvn package. Spring Boot-проекты обычно создают генератором start.spring.io (Spring Initializr), который тоже выдаёт обычный Maven-проект.
2. Что такое Maven archetype, как работает команда mvn archetype:generate и что проверить в сгенерированном pom.xml?
Что такое Maven archetype, как работает команда mvn archetype:generate и что проверить в сгенерированном pom.xml?
Архетип (archetype) — шаблон проекта, опубликованный в репозитории как обычный артефакт: заготовка pom.xml, каталоги и примеры классов. Официальные архетипы (группа org.apache.maven.archetypes): maven-archetype-quickstart (jar, класс App и тест AppTest — вариант по умолчанию), maven-archetype-webapp (war, src/main/webapp), maven-archetype-simple, maven-archetype-archetype (каркас своего архетипа).
mvn archetype:generate запускает цель generate плагина maven-archetype-plugin и создаёт проект в подкаталоге с именем artifactId. Режимы: интерактивный (список архетипов и вопросы в консоли) и пакетный — -DinteractiveMode=false, все параметры через -D (archetypeGroupId, archetypeArtifactId, archetypeVersion, groupId, artifactId, version, package). В пакетном режиме groupId и artifactId обязательны, version по умолчанию 1.0-SNAPSHOT, package равен groupId. Версию архетипа указывайте явно. В PowerShell каждый аргумент -D берут в кавычки.
После генерации проверьте в pom.xml: версию Java (одно свойство maven.compiler.release вместо пары source/target — quickstart до 1.4 включительно задаёт 1.7), версию JUnit (старые шаблоны — JUnit 4 или 3.8.1, версия 1.5 — JUnit 5) и кодировку project.build.sourceEncoding = UTF-8.
3. Как выбрать groupId, artifactId и version для нового Maven-проекта?
Как выбрать groupId, artifactId и version для нового Maven-проекта?
- groupId — организация или группа проектов в формате перевёрнутого доменного имени, которым вы владеете (или
io.github.ваш-логин): только строчные латинские буквы, цифры и точки. Хорошо:com.examclouds,org.example.shop; плохо:MyCompany,com.my-company. - artifactId — имя проекта строчными буквами, слова через дефис, без пробелов и версии:
hello-maven,online-shop, но неHello Mavenилиshop-1.0. - version — номер версии; суффикс
-SNAPSHOTозначает версию в разработке (1.0-SNAPSHOT), без суффикса — выпущенный релиз (1.0.0).
Архетип по умолчанию берёт имя Java-пакета из groupId (классы попадут в com/examclouds/). Если в groupId есть дефис или сегмент начинается с цифры, сгенерированный пакет не скомпилируется — задайте корректный -Dpackage явно. Из artifactId и version складывается имя готового файла: hello-maven-1.0-SNAPSHOT.jar.
4. Какова стандартная структура каталогов Maven-проекта (Standard Directory Layout) и что куда кладут?
Какова стандартная структура каталогов Maven-проекта (Standard Directory Layout) и что куда кладут?
Maven знает стандартные пути по умолчанию, поэтому указывать их в pom.xml не нужно — достаточно положить файлы в правильное место:
src/main/java— исходный код в папках по пакетам; компилируется вtarget/classesи входит в jar/war.src/main/resources— конфигурация и данные (.properties, .xml, .yml, шаблоны, SQL); копируется вtarget/classes, то есть в корень classpath и в jar.src/test/java— тесты в тех же пакетах, что и проверяемый код (тогда доступны package-private члены); компилируется вtarget/test-classes, в jar не попадает.src/test/resources— файлы только для тестов; в jar не попадают.src/main/webapp— только для packaging = war (WEB-INF/web.xml, JSP, статика).target— результат сборки, вручную ничего не хранят; удаляетсяmvn clean, добавляется в.gitignore.
Maven не ищет файлы по всему проекту: ресурс в src/main/java не попадёт в jar, .java в src/main/resources не скомпилируется, а папку src/java Maven не увидит (No sources to compile). Переопределять пути в pom.xml стоит только для старого проекта, который нельзя реорганизовать.
5. Как создать и открыть Maven-проект в IntelliJ IDEA и что делать после правки pom.xml?
Как создать и открыть Maven-проект в IntelliJ IDEA и что делать после правки pom.xml?
Новый проект: File → New → Project, генератор Java с Build system = Maven (если оставить IntelliJ, проект будет без pom.xml) или генератор Maven Archetype; указать Name, Location, JDK и GroupId/ArtifactId в Advanced Settings. IDE создаст pom.xml и стандартные каталоги и сразу импортирует проект; отдельно ставить Maven не нужно — он встроен.
Окно Maven показывает Lifecycle (фазы запускаются двойным щелчком), Plugins и Dependencies. IDE не перечитывает pom.xml на каждое нажатие: после правки нажмите Load Maven Changes (или Reload All Maven Projects в окне Maven), иначе новая зависимость в коде останется красной.
Импорт существующего проекта: File → Open → pom.xml → Open as Project; если pom.xml в подпапке не распознан — правый щелчок → Add as Maven Project.
Настройки (Build, Execution, Deployment → Build Tools → Maven): Maven home path — Bundled или своя установка, User settings file и Local repository, Runner — JDK для Maven. Встроенный Maven недоступен во вкладке Terminal, а IDE и терминал могут запускать Maven на разных JDK — если в IDE собирается, а в терминале нет, сравните JDK в Runner и вывод mvn -version.