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. Еще раз повторю, он не мертв. Он был просто в стазисе))

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

Комментарии (51)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
MRamazanov System Engineer
позавчера, 19:13
Получилось, часть понятно, часть работы нужно подробнее пройтись ещё раз))
Peace The Ball Домогосподиня в Диван у вітальні
19 марта 2023, 21:06
Всем привет! Роману бульшое спасибо за крутой проект, будет что в портволио вложить! Столкнулся с проблемой: нет папки target и файла pom.xml и я не понимаю как правильно их создать, или откуда взять... А еще, почему то, пакеты и классы не могу создавать, в контекстном меню просто напросто нет пункта New -> Package и Class. Как будет время подскажите пожалуйста, кто занет в чем тут проблема. Заранее благодарен!
Kirill
Уровень 18
4 апреля 2023, 11:11
Чтобы создавать пакеты и классы вот под этой фразой скриншот смотрите:
Для этого нужно найти в ИДЕЕ файл pom.xml и правой кнопкой мыши выбрать
Add as Maven Project. И все, будет вам счастье
Nik безработный
22 ноября 2022, 10:03
Всё работает! Спасибо! До этого нигде описания таких нюансов не встречал! Идём дальше!
フシギダネ справедливый в орех
10 июня 2022, 06:18
フシギダネ справедливый в орех
10 июня 2022, 06:18
До момента, где добавить pom и настроить плагины для теста еще можно как-то разобраться. Позже, где непонятно, какие картинки, где их расположить. Одинаковые и разные картинки где должны лежать, чтобы тест их проверил. Последовательность нарушена! Тот кто пользуется этим руководством, будто уже должен знать как заполнить пробелы, куда обратиться. Если учитывать, что в этой статье человек впервые использует Maven, то очень много пробелов.
otreyo
Уровень 38
18 мая 2022, 11:14
прямо какие то одни вундеркинды собрались, все у них как по маслу. а начинаешь делать вопросов больше чем ответов и половина из написанного не получается или непонятно откуда и зачем взялось. pom.xml вообще непонятно откуда вдруг возник в репозитории его нет, за каким вообще его надо было подключать... зачем папки вручную создавать тоже вопрос. никакого значка мейвена и в помине нет. папки тарджет тоже. в pom.xml куча ошибок вылезло. что с ними делать непонятно. как правильно создать пакет ни пол слова. и это я только начал. вроде человек старался,делал но в итоге очередная ерунда на коленке. как по этому учится, непонятно
Roman Beekeeper тг-канал по java разработ в t.me/romankh3
19 мая 2022, 11:53
otreyo, дорогу осилит идущий...)
otreyo
Уровень 38
19 мая 2022, 13:27
идущий это который идет. дорога это когда учишь джаву. не просто, но логично и понятно и все время ощущаешь что идешь вперед. а тут недели 3 или 4 уже и ощущение что сражаешься с неведомой бесполезной уйней. кругом тупик, бессмыслица и абстракция. сделай папку, создай файл, скачай неведомую хрень которая "сделает всю сложную работу за тебя" а тебя могучим волшебником, скажи крекс пекс фекс, как мартышка повторяешь, а в итоге ничего не работает и самое главное непонятно на кой вся эта охинея нужна.
JelJein QA Engineer
10 июня 2022, 15:20
брось это дело )))))
Рустам Косимов
Уровень 31
22 декабря 2021, 18:13
Все получилось, круто
Сергей
Уровень 41
3 декабря 2021, 18:53
Походу картинки удалили.
-------------------------------------------------------------------------------
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)
Anonymous #2841731
Уровень 2
12 января 2022, 21:42
Столкнулся с той же проблемой. Ссылка . Скачал, добавил в src\test\resources и все работает
dronicbest Инженер
2 июля 2021, 06:45
Тесты заработали после прочтения вот этой статьи: https://howtodoinjava.com/junit5/junit5-maven-dependency/
Art
Уровень 11
19 мая 2022, 08:27
Респект, помогло👍
Anonymous #2632541
Уровень 46
19 июня 2021, 08:06
Для прохождения тестов, помимо указанного в статье SureFire, просто обновите версию junit-jupiter-api в соответствии с актуальной на mvnrepository