1. Об'єктна модель опису проєкту

Одна з речей, яку Maven стандартизував насамперед, – це опис проєкту. До Maven у кожної IDE був свій project-файл, який зберігав інформацію про проєкт та його складання (і найчастіше – в бінарному вигляді).

Maven запропонував універсальний відкритий стандарт на основі XML, в якому за допомогою різних тегів описується, що це за проект, як його потрібно збирати та які в нього залежності. Опис проєкту міститься в одному файлі, зазвичай з ім'ям pom.xml.

Приклад файлу pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<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 стандартизував влаштування проєкту. Є кілька варіантів організації коду всередині проєкту, і найпоширеніший має такий вигляд:

Структура трохи незвична після стандартних проєктів 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-стандарту, тому докладно про це говорити не будемо. Мається на увазі це:

<?xml version="1.0" encoding="UTF-8"?>
<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. У цьому для нас також нема нічого цікавого.

Перші рядки, які нас цікавлять, виглядають таким чином:

  <modelVersion>4.0.0</modelVersion>

  <groupId>com.sample.app</groupId>
  <artifactId>new-app</artifactId>
  <version>1.0-SNAPSHOT</version>

Щоб не розбиратися зайвий раз, що ми описуємо (програму, проєкт, модуль, бібліотеку тощо) у стандарті Maven це все називається словом артефакт. У чому творцям Maven не відмовиш, так це в любові до стандартизації.

Три теги, які ти бачиш, означають:

  • groupId – пакет, до якого належить застосунок, із додаванням імені домену;
  • artifactId – унікальний рядковий ключ (ID проекту);
  • version – версія проєкту.

Трьох зазначених параметрів достатньо, щоб однозначно описати будь-який артефакт.

Далі після опису проєкту зазвичай йде список артефактів (бібліотек), які проєкт використовує. Виглядає це приблизно так:

   <dependencies>

       <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-проєкт

Пояснимо деякі пункти:

  1. Ім'я проєкту;
  2. Папка для проєкту;
  3. Мова проєкту - Java;
  4. Тип проєкту - Maven.

У розділі Advanced Settings внизу IDEA запропонує вказати groupID, artifactID та версію нашого нового проєкту. Ці дані завжди можна легко змінити пізніше. Обираємо запропоновані або вказуємо свої:

Maven-проект 2

Далі стандартно створюємо проєкт у необхідному місці. Як результат – бачимо структуру:

Maven-проект 3

Класи та пакети потрібно створювати у папці java, про це ми вже говорили. І, гадаємо, ти з цим легко впораєшся. Ми готові йти далі, але давай трохи повернемося назад, до важливого питання, яке ми "проскочили".