JavaRush /Java блог /Random UA /Все, що ви хотіли знати про Maven. (Частина 2) - "Java-пр...
Roman Beekeeper
35 рівень

Все, що ви хотіли знати про Maven. (Частина 2) - "Java-проект від А до Я"

Стаття з групи Random UA
Все про Maven: Початок Люблю займатися практикою. Ви навіть не уявляєте, як іноді буває нудно писати про теорію. Проте без неї нікуди. Практика – справа інша, звичайно. Зараз швидко пробіжимося по командах, які я раніше описав, і закінчуватимемо)"Java проект від А до Я": Все, що ви хотіли знати про Maven.  Частина 2 - 1

Налаштовуємо pom.xml

Поки ми теоретизували, вийшов цілком придатний pom.xml:
Дивитись код
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://maven.apache.org/POM/4.0.0"
        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>com.github.codegymcommunity</groupId>
   <artifactId>maven-demo</artifactId>
   <version>1.0-SNAPSHOT</version>
   <packaging>jar</packaging>

   <name>Maven Demo Project</name>

   <url>https://github.com/codegymcommunity/maven-demo/</url>

   <licenses>
       <license>
           <name>The Apache Software License, Version 2.0</name>
           <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
       </license>
   </licenses>

   <developers>
       <developer>
           <id>romankh3</id>
           <name>Roman Beskrovnyi</name>
           <email>roman.beskrovnyy@gmail.com</email>
       </developer>
   </developers>

   <scm>
       <connection>git@github.com:codegymcommunity/maven-demo.git</connection>
       <developerConnection>git@github.com:codegymcommunity/maven-demo.git</developerConnection>
       <url>https://github.com/codegymcommunity/maven-demo</url>
   </scm>

   <properties>
       <mockito.version>2.26.0</mockito.version>
       <junit.version>5.5.2</junit.version>
       <image.comparison.version>4.3.0</image.comparison.version>
       <maven.compiler.source>1.8</maven.compiler.source>
       <maven.compiler.target>1.8</maven.compiler.target>
       <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
       <javadoc.plugin.version>3.1.1</javadoc.plugin.version>
       <source.plugin.version>3.2.0</source.plugin.version>
   </properties>

   <dependencies>
       <dependency>
           <groupId>org.mockito</groupId>
           <artifactId>mockito-core</artifactId>
           <version>${mockito.version}</version>
           <scope>test</scope>
       </dependency>
       <dependency>
           <groupId>org.junit.jupiter</groupId>
           <artifactId>junit-jupiter-api</artifactId>
           <version>${junit.version}</version>
           <scope>test</scope>
       </dependency>
       <dependency>
           <groupId>com.github.romankh3</groupId>
           <artifactId>image-comparison</artifactId>
           <version>${image.comparison.version}</version>
       </dependency>
   </dependencies>

   <build>
       <plugins>
           <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-source-plugin</artifactId>
               <version>${source.plugin.version}</version>
               <executions>
                   <execution>
                       <id>attach-sources</id>
                       <goals>
                           <goal>jar</goal>
                       </goals>
                   </execution>
               </executions>
           </plugin>
           <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-javadoc-plugin</artifactId>
               <version>${javadoc.plugin.version}</version>
               <executions>
                   <execution>
                       <id>attach-javadocs</id>
                       <goals>
                           <goal>jar</goal>
                       </goals>
                   </execution>
               </executions>
           </plugin>
       </plugins>
   </build>
</project>
— Але щоб було що компілювати, його треба додати туди! Логічно? - Так капітане. бгг Тому додамо клас, у якому буде метод і два тести на нього. Створимо звичайну схему папок для Мавену:
src main java resources test java resources
У src/main/java створимо пакет, у якому працюватимемо. Щоб скласти його правильно, добре було б поставити на початок назву організації ( groupId ), а потім ім'я проекту. У нашому випадку це буде так: com.github.codegymcommunity.mavendemo Як на мене, то дуже непоганий пакет. У ньому створимо клас ImageComparator , до якого напишемо два тести.

Підключаємо Мавен та проект загалом до IDEA

Щоб ідея змогла розпізнати наші залежності та запропонувати їх використати у проекті, потрібно зробити кілька речей:
  1. Сказати ідеї, де будуть вихідні коди, а де будуть тести.
  2. Додати проект в ідею.
Щоб досягти першого, потрібно знайти такий значок: "Java проект від А до Я": Все, що ви хотіли знати про Maven.  Частина 2 - 2Натиснути на нього та перейти до секції Modules . Далі потрібно задати створеним папкам потрібний маркер, як показано на малюнку нижче: "Java проект від А до Я": Все, що ви хотіли знати про Maven.  Частина 2 - 3Тобто:
  • src/main/java — Sources
  • src/main/resources — Resources
  • src/test/java — Tests
  • src/test/resources — Test Resources
  • target — Excluded
Всі ці Sources, Resources, Test, Test Resources та Excluded можна знайти на рядку, де написано Mark as . Вибираєте папку і маркуєте її відповідно. І другий крок — додати проект в ІДЕЮ, щоб вона могла творити свою магію. Для цього потрібно знайти в ідеї файл pom.xml і правою кнопкою миші вибрати Add as Maven Project . І все, буде вам щастя (:) "Java проект від А до Я": Все, що ви хотіли знати про Maven.  Частина 2 - 4Після цього праворуч з'явиться плашка Maven , яку можна буде відкрити і запускати в ній команди для мавену."Java проект від А до Я": Все, що ви хотіли знати про Maven.  Частина 2 - 5

Пишемо вихідники та тести до нашого “проекту”

Так, мавен в ідею додали, тепер опишемо клас, який виступатиме для нас у ролі вихідників:

ImageComparator:

package com.github.codegymcommunity.mavendemo;

import com.github.romankh3.image.comparison.ImageComparison;
import com.github.romankh3.image.comparison.model.ImageComparisonResult;
import com.github.romankh3.image.comparison.model.ImageComparisonState;

import java.awt.image.BufferedImage;

/**
* Class created for answering, does two images the same or not.
*/
public class ImageComparator {

   /**
    * Method, which says the same images or not.
    *
    * @param image1 image1 for comparison
    * @param image2 image2 for comparison
    * @return return true, if images are the same, false - otherwise.
    */
   public boolean isTheSameImages(BufferedImage image1, BufferedImage image2) {
       //Create ImageComparison object
       ImageComparison imageComparison = new ImageComparison(image1, image2);

       //Compare images
       ImageComparisonResult imageComparisonResult = imageComparison.compareImages();

       //Check, that ImageComparisonState is MATCH:
       return ImageComparisonState.MATCH == imageComparisonResult.getImageComparisonState();
   }
}
Під цю справу створимо тести. Клас, який тестує, повинен бути в тому ж пакеті, тільки в src/test/java. Ідея про це знає і можна скористатися її можливостями. Для цього на імені клас у самому файлі натискаємо мишкою, і на лампочці, що з'явилася, вибираємо Create test: "Java проект від А до Я": Все, що ви хотіли знати про Maven.  Частина 2 - 6Нам запропонують вибрати налаштування для майбутнього тесту. Нічого не ставимо, просто тиснемо OK: "Java проект від А до Я": Все, що ви хотіли знати про Maven.  Частина 2 - 7Для нашого тесту візьмемо із тестових картинок image-comparison і покладемо їх у тестові ресурси (src/test/resource). Після цього напишемо два тести. Один перевірятиме, що ці дві картинки різні. А в інший передамо однакову картинку і чекатимемо відповідь, що вони однакові. Після отримаємо такий тест:
package com.github.codegymcommunity.mavendemo;

import com.github.romankh3.image.comparison.ImageComparisonUtil;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import java.awt.image.BufferedImage;

@DisplayName("Unit-level testing for ImageComparator")
class ImageComparatorTest {

   private final ImageComparator comparator = new ImageComparator();

   @Test
   public void shouldConfirmImagesNotTheSame() {
       //given
       BufferedImage image1 = ImageComparisonUtil.readImageFromResources("image1.png");
       BufferedImage image2 = ImageComparisonUtil.readImageFromResources("image2.png");

       //when
       boolean theSameImages = comparator.isTheSameImages(image1, image2);

       //then
       Assertions.assertFalse(theSameImages);
   }

   @Test
   public void shouldConfirmImagesTheSame() {
       //given
       BufferedImage image1 = ImageComparisonUtil.readImageFromResources("image1.png");

       //when
       boolean theSameImages = comparator.isTheSameImages(image1, image1);

       //then
       Assertions.assertTrue(theSameImages);
   }
}
Тести дуже прості, зупинятись на них не буду. Якщо вам це буде цікаво, якось напишу статтю про тестування (напишіть про це в коментарях).

Виконуємо команди Мавена

Ось тепер, коли все вже готове для того, щоб подивитися роботу команд, вибираємо в плашці Maven наш проект і розкриваємо в ньому Lifecycle : "Java проект від А до Я": Все, що ви хотіли знати про Maven.  Частина 2 - 8Тепер натиснемо compile і подивимося, що вийшло: "Java проект від А до Я": Все, що ви хотіли знати про Maven.  Частина 2 - 9З цього можна зробити два висновки:
  1. Скомпілювалися наші вихідники та помістабо їх у вказаний шлях.
  2. Команда пройшла успішно – BUILD SUCCESS.
І реально, якщо ми підемо в структуру проекту і подивимося, що там змінилося, то побачимо, що додалася папка target , яку ще можна дослідити і знайти наш скомпільований клас ImageComparator : "Java проект від А до Я": Все, що ви хотіли знати про Maven.  Частина 2 - 10Тепер хотілося б почати нову команду package з чистого аркуша. Для цього запустимо (два рази натиснемо) на команду clean : "Java проект від А до Я": Все, що ви хотіли знати про Maven.  Частина 2 - 11В результаті нам кажуть, що видалабо папку target , в якій зберігалося все, що створабо після команди compile . Запустимо команду test :"Java проект від А до Я": Все, що ви хотіли знати про Maven.  Частина 2 - 12Tests run: 0… ми ж написали цілих ДВА. Тобто чомусь тести не розпочалися. Живий кодинг він такий, йдемо в веб) За 5 хвабон глинання знайшов, що з JUnit5 потрібно додати ще один плагін:
<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-surefire-plugin</artifactId>
   <version>2.22.2</version>
</plugin>
Додамо його в проект, винесемо версію <properties/> як вміємо і перезапустимо test : "Java проект від А до Я": Все, що ви хотіли знати про Maven.  Частина 2 - 13Ось тепер інша справа! Два тести запустабося та пройшли успішно. Вогонь! Тепер запускаємо наш package і очікуємо, що знайдемо джарник у target папці: "Java проект від А до Я": Все, що ви хотіли знати про Maven.  Частина 2 - 14Тобто ми бачимо знову, що тести пройшли, і після цього (гарантії, що все у проекті добре) ми можемо збирати проект до архіву. На малюнку видно, що у логах запуску мавену та структурі проекту архів є. Наступний у нас install . Чудова команда. О, доки не забув. Хорошим тоном вважається перед виконанням нової команди почистити проект, виконавши clean. Це позбавить дурниць у майбутньому - гарантую за своїм досвідом))) Тому спочатку запускаємо clean , а потім вже install : "Java проект від А до Я": Все, що ви хотіли знати про Maven.  Частина 2 - 15Там, де стрілочка, добре видно, де знаходиться локальний репозиторій. Виходячи з того, що пишуть, у мене це на шляху: /Users/roman_beskrovnyi/.m2 А сам архів буде тут: /Users/roman_beskrovnyi/.m2/repository/com/github/codegymcommunity/maven-demo/1.0-SNAPSHOT І якщо ми зайдемо в термінал і спробуємо потрапити до папки, де знаходиться архів, він там лежатиме: "Java проект від А до Я": Все, що ви хотіли знати про Maven.  Частина 2 - 16deploy нам показати не вийде, а інші поки вам не потрібні…

Замість виведення

Сьогодні ми швидко пройшлися тим, що таке Maven, що там є, які основні команди там є. Я постарався донести це просто та з прикладами. Усі вихідники прикладу лежать у організації JavaRush Community на GitHub у проекті maven-demo . Усі питання пишіть у коментарях. Традиційно пропоную підписатися на мій обліковий запис на гітхабі , щоб не пропустити новий код для нашого проекту JRTB. Ще раз повторю, він не мертвий. Він був просто у стазісі))

Список всіх матеріалів серії на початку цієї статті.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ