1. Об'єктна модель опису проєкту
Одна з речей, яку Maven стандартизував насамперед, – це опис проєкту. До Maven у кожної IDE був свій project-файл, який зберігав інформацію про проєкт та його складання (і найчастіше – в бінарному вигляді).
Maven запропонував універсальний відкритий стандарт на основі XML, в якому за допомогою різних тегів описується, що це за проект, як його потрібно збирати та які в нього залежності. Опис проєкту міститься в одному файлі, зазвичай з ім'ям pom.xml.
Приклад файлу pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3 .org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>example.com</groupId>
<artifactId>example</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>commons-io </groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
</dependencies>
</project>
У цьому прикладі записано три речі:
- Інформацію про версію стандарту maven-проєкту – синім.
- Інформацію про сам проект — червоним.
- Інформацію про бібліотеки — зеленим.
Давай розберемося з тим, як влаштовано pom-файл докладніше.
2. Як влаштовано Maven-проєкт
І одразу питання: чи бачиш ти дещо дивне у минулому прикладі? У ньому немає інформації про код проєкту! Немає жодного слова про те, де зберігаються java-файли, ресурси, файли властивостей, html, скрипти складання тощо.
А відповідь проста: Maven стандартизував влаштування проєкту. Є кілька варіантів організації коду всередині проєкту, і найпоширеніший має такий вигляд:
![](https://cdn.javarush.com/images/article/1fcd876d-df8f-4ea6-b5de-b671582da78e/512.jpeg)
Структура трохи незвична після стандартних проєктів IDEA, але на те вона й універсальна. 90% проєктів, з якими ти стикатимешся у своєму житті, матимуть саме таку структуру папок.
Якщо створити Maven-проєкт (за допомогою IDEA або консолі), він набуде зазначеного вигляду. Давай розберемо, як тут усе влаштовано.
Папка src, як ти вже здогадуєшся, містить вихідний код проєкту. У ній є дві підпапки: main та test.
Папка /src/main/java є коренем для всіх Java-класів проєкту. Якщо у тебе є клас com.javarush.Cat, він буде лежати в папці /src/main/java /com/javarush/Cat.java. Якщо є текстові або бінарні ресурси, вони повинні зберігатися в папці /src/main/resources.
Влаштування папки /src/test аналогічне до того, як влаштовано папку /src/main, але в ній містяться тести та їх ресурси. Maven уміє самотужки запускати потрібні тести під час складання проєкту, але про це поговоримо в окремій лекції.
Також у проєкті є папка /target, в яку Maven буде зберігати проєкт після його збирання. Оскільки у великих проєктів найчастіше нетривіальні сценарії складання, то в цій папці чого тільки не зберігається.
Друге призначення папки /target – це кешування проміжних результатів складання. При складанні великого проєкту Maven може перезбирати тільки ту частину, яка змінилася, і прискорити таким чином час складання в кілька разів.
Ну і вишенька на торті: у корені проєкту лежить файл pom.xml. У ньому й міститься вся необхідна інформація щодо проєкту, про який ми поговоримо нижче.
3. Влаштування pom.xml
Почнемо з того, що pom-файл – це xml, тому він містить стандартні заголовки та інформацію про namespaces. Це все стосується суто XML-стандарту, тому докладно про це говорити не будемо. Мається на увазі це:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3 .org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
…
</project>
Також зазвичай першим рядком усередині тега <project> йде опис версії стандарту pom-файлу. У більшості випадків це 4.0. У цьому для нас також нема нічого цікавого.
Перші рядки, які нас цікавлять, виглядають таким чином:
<groupId>com.sample.app</groupId>
<artifactId>new-app</artifactId>
<version>1.0-SNAPSHOT</version>
Щоб не розбиратися зайвий раз, що ми описуємо (програму, проєкт, модуль, бібліотеку тощо) у стандарті Maven це все називається словом артефакт. У чому творцям Maven не відмовиш, так це в любові до стандартизації.
Три теги, які ти бачиш, означають:
- groupId – пакет, до якого належить застосунок, із додаванням імені домену;
- artifactId – унікальний рядковий ключ (ID проекту);
- version – версія проєкту.
Трьох зазначених параметрів достатньо, щоб однозначно описати будь-який артефакт.
Далі після опису проєкту зазвичай йде список артефактів (бібліотек), які проєкт використовує. Виглядає це приблизно так:
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
</dependencies>
У цьому прикладі ми додаємо до свого проєкту бібліотеку commons-io із пакета commons-io, з версією 2.6.
Під час складання Maven знайде таку бібліотеку у своєму глобальному репозиторії та додасть її до твого проєкту. І, до речі, так вміє не тільки Maven.
4. Як IDEA працює з Maven
Intellij IDEA чудово вміє працювати з Maven. Вона вміє відкривати такі проєкти, самостійно створювати, запускати різні сценарії складання і чудово розуміє бібліотеки, що підключаються.
У неї навіть з якогось моменту є вбудований Maven, але тобі все одно потрібно вміти ставити і налаштовувати його самостійно, тому про цю особливість IDEA раніше не згадувалося. Чисто теоретично у IDEA може бути конфлікт двох Maven'ів, тому корисно знати, що їх два.
Як створити в IDEA новий Maven-проєкт:
Клацни меню Files > New Project. Обираємо зліва в меню пункт New Project.
![Maven-проєкт](https://cdn.javarush.com/images/article/031564fb-d0de-439c-a134-22347e7b3c6b/800.jpeg)
Пояснимо деякі пункти:
- Ім'я проєкту;
- Папка для проєкту;
- Мова проєкту - Java;
- Тип проєкту - Maven.
У розділі Advanced Settings внизу IDEA запропонує вказати groupID, artifactID та версію нашого нового проєкту. Ці дані завжди можна легко змінити пізніше. Обираємо запропоновані або вказуємо свої:
![Maven-проект 2](https://cdn.javarush.com/images/article/146b77c0-fce6-4a8f-9e18-d1426a336762/512.jpeg)
Далі стандартно створюємо проєкт у необхідному місці. Як результат – бачимо структуру:
![Maven-проект 3](https://cdn.javarush.com/images/article/f96079a3-3b41-40dc-9924-9308298ceb17/512.jpeg)
Класи та пакети потрібно створювати у папці java, про це ми вже говорили. І, гадаємо, ти з цим легко впораєшся. Ми готові йти далі, але давай трохи повернемося назад, до важливого питання, яке ми "проскочили".