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

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

Статья из группы Java-проекты
Все о 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.javarushcommunity</groupId>
   <artifactId>maven-demo</artifactId>
   <version>1.0-SNAPSHOT</version>
   <packaging>jar</packaging>

   <name>Maven Demo Project</name>

   <url>https://github.com/javarushcommunity/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:javarushcommunity/maven-demo.git</connection>
       <developerConnection>git@github.com:javarushcommunity/maven-demo.git</developerConnection>
       <url>https://github.com/javarushcommunity/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.javarushcommunity.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.javarushcommunity.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.javarushcommunity.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/javarushcommunity/maven-demo/1.0-SNAPSHOT И если мы зайдем в терминал и попытаемся попасть в папку, где находится архив, то он будет там лежать:"Java-проект от А до Я": Все, что вы хотели знать о Maven. Часть 2 - 16deploy нам показать не выйдет, а другие пока вам не нужны…

Вместо вывода

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

Список всех материалов серии в начале этой статьи.

Комментарии (50)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Peace The Ball Уровень 32
19 марта 2023
Всем привет! Роману бульшое спасибо за крутой проект, будет что в портволио вложить! Столкнулся с проблемой: нет папки target и файла pom.xml и я не понимаю как правильно их создать, или откуда взять... А еще, почему то, пакеты и классы не могу создавать, в контекстном меню просто напросто нет пункта New -> Package и Class. Как будет время подскажите пожалуйста, кто занет в чем тут проблема. Заранее благодарен!
Nik Уровень 44
22 ноября 2022
Всё работает! Спасибо! До этого нигде описания таких нюансов не встречал! Идём дальше!
フシギダネ Уровень 23
10 июня 2022
До момента, где добавить pom и настроить плагины для теста еще можно как-то разобраться. Позже, где непонятно, какие картинки, где их расположить. Одинаковые и разные картинки где должны лежать, чтобы тест их проверил. Последовательность нарушена! Тот кто пользуется этим руководством, будто уже должен знать как заполнить пробелы, куда обратиться. Если учитывать, что в этой статье человек впервые использует Maven, то очень много пробелов.
otreyo Уровень 38
18 мая 2022
прямо какие то одни вундеркинды собрались, все у них как по маслу. а начинаешь делать вопросов больше чем ответов и половина из написанного не получается или непонятно откуда и зачем взялось. pom.xml вообще непонятно откуда вдруг возник в репозитории его нет, за каким вообще его надо было подключать... зачем папки вручную создавать тоже вопрос. никакого значка мейвена и в помине нет. папки тарджет тоже. в pom.xml куча ошибок вылезло. что с ними делать непонятно. как правильно создать пакет ни пол слова. и это я только начал. вроде человек старался,делал но в итоге очередная ерунда на коленке. как по этому учится, непонятно
Рустам Косимов Уровень 31
22 декабря 2021
Все получилось, круто
Сергей Уровень 41
3 декабря 2021
Походу картинки удалили.

-------------------------------------------------------------------------------
Test set: com.github.javarushcommunity.mavendemo.ImageComparatorTest
-------------------------------------------------------------------------------
Tests run: 2, Failures: 0, Errors: 2, Skipped: 0, Time elapsed: 0.032 s <<< FAILURE! - in com.github.javarushcommunity.mavendemo.ImageComparatorTest
shouldConfirmImagesTheSame  Time elapsed: 0.032 s  <<< ERROR!
com.github.romankh3.image.comparison.exception.ImageNotFoundException: Image with path = image1.png not found
	at com.github.javarushcommunity.mavendemo.ImageComparatorTest.shouldConfirmImagesTheSame(ImageComparatorTest.java:31)

shouldConfirmImagesNotTheSame  Time elapsed: 0 s  <<< ERROR!
com.github.romankh3.image.comparison.exception.ImageNotFoundException: Image with path = image1.png not found
	at com.github.javarushcommunity.mavendemo.ImageComparatorTest.shouldConfirmImagesNotTheSame(ImageComparatorTest.java:18)
dronicbest Уровень 2
2 июля 2021
Тесты заработали после прочтения вот этой статьи: https://howtodoinjava.com/junit5/junit5-maven-dependency/
Anonymous #2632541 Уровень 46
19 июня 2021
Для прохождения тестов, помимо указанного в статье SureFire, просто обновите версию junit-jupiter-api в соответствии с актуальной на mvnrepository
Любовь Уровень 38
3 июня 2021
Роман, огромное спасибо за лекции все подробно и доходчиво.🤗 С нетерпением жду статей про тестирование!!