Что такое Maven

Maven – это программа фреймворк для   автоматической сборки проектов с обширным функционалом. Функционал настолько большой, что изучить его весь и сразу не представляется возможным для большинства программистов.        Для наших целей достаточно изучить сами основы работы  с Maven.Если в работе понадобится что то большее, то можно всегда изучить дополнительные возможности Maven.

 Maven позволяет добавить в проект любые библиотеки и связанные с ними дополнительные библиотеки буквально тремя строчками кода. 

 Maven сделает за вас автоматическую сборку вашего проекта. 

 Maven создаст за вас большинство файлов и папок вашего проекта в общепринятой структуре. Согласно выбранному вами типу проекта. 

 Maven позволяет подключить огромное количество плагинов  для работы с вашим кодом. Например плагин обфускации кода. 

Все настройки будут содержаться в xml файле POM:

 <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>2.2.2</modelVersion>  
  
  <groupId>ru.javaforall.application</groupId>  
  <artifactId>my-application</artifactId>  
  <version>1.0</version>  
  <packaging>jar</packaging>  
  
  <name>Maven Quick Start Archetype</name>  
  <url>http://maven.apache.org</url>  
  
  <dependencies>  
    <dependency>  
      <groupId>junit</groupId>  
      <artifactId>junit</artifactId>  
      <version>4.8.2</version>  
      <scope>test</scope>  
    </dependency>  
  </dependencies>  
  
</project>  
POM файл имеет несколько секций: 

 Корневой элемент <project> основное тело файла POM.
  В нем содержится описание проекта в виде:
<groupId>ru.javaforall.application</groupId> //  
  <artifactId>my-application</artifactId>  //
  <version>1.0</version>                   //
Где:
groupId - наименование организации или доменное имя сайта проекта.
 artifactId - название проекта 
version-версия проекта
Если проект в доработке, то к номеру version добавляется  SNAPSHOT.

 <packaging> определяет какого типа файл будет создан в результате сборки. Возможны такие: pom, jar, war, ear.
Тэг необязателен.Если не прописан,то используется значение по умолчанию - jar.

 Можно добавить любые описания проекта, которые будут понятны программисту, но сам Maven не будет ими пользоваться.
Например:
<name>HelloWorld!!!</name> название проекта,удобное для пользователя
<description>Nhis is first program java</description> Описание проекта
<url>www.javaforall.ru</url> сайт проекта
<tel>8-928...-21-34</tel> телефон разработчика
<requirements>windows10</requirements> требования  программы
<beloved_cat>kot-zadrot</beloved_cat> любимый кот разработчика
и т.д.
  <dependensies> - это секция со списком зависимостей.Зависимость-это просто напросто подключаемая сторонняя библиотека или плагин, которые необходимы для вашего проекта. Каждая библиотека идентифицируется своими groupId, artifactId, version. Объявление зависимостей производится  между  тэгами <dependencies>...</dependencies>. При этом каждая зависимость прописывается отдельно.Необходимые идентификаторы библиотек можно узнать в хранилище библиотек и плагинов maven. 
Зависимость можно прописать с тэгом <scope>. Он указывает в каком этапе работы с проектом будет использована описываемая библиотека. задаёт, для чего библиотека используется.В нашем примере подключается библиотека тестирования кода и запускаться тесты будут только на этапе test. 
 <dependencies>  
    <dependency>  
      <groupId>junit</groupId>  
      <artifactId>junit</artifactId>  
      <version>4.8.2</version>  
      <scope>test</scope>  
    </dependency>  
  </dependencies>  
добавим библиотеку guava 
<dependencies>  
    <dependency>  
      <groupId>junit</groupId>  
      <artifactId>junit</artifactId>  
      <version>4.8.2</version>  
      <scope>test</scope>  
    </dependency>  
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>28.2-jre</version>
</dependency>

  </dependencies>  
<build>  необязательная секция, так как существуют значения по умолчанию.Содержит информацию по самой сборке:
где находятся исходные файлы,
где находятся  ресурсы,
какие плагины используются
и т. д.  
<build>
    <sourceDirectory>src</sourceDirectory>
    <resources>
        <resource>
            <directory>resources</directory>
        </resource>
    </resources>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.0.2</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
                <encoding>UTF-8</encoding>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-checkstyle-plugin</artifactId>
            <version>2.17</version>
            <configuration>
                <suppressionsLocation>suppressions.xml</suppressionsLocation>
            </configuration>
        </plugin>
    </plugins>
</build>
<sourceDirectory> - определяет, откуда Maven будет брать файлы исходного кода. По умолчанию это src/main/java, но вы можете определить, где это вам удобно. 

<resources> и вложенные в неё тэги <resource> определяют, одну или несколько директорий, где хранятся файлы ресурсов. Ресурсы в отличие от файлов исходного кода при сборке просто копируются. Директория по умолчанию src/main/resources.

<outputDirectory> - определяет, в какую директорию компилятор будет сохранять результаты компиляции - *.class файлы. 
Значение по умолчанию - target/classes.

<finalName> - имя результирующего jar (war, ear ...) файла с соответствующим типу расширением.
Значение по умолчанию — artifactId-version. 
<properties>  в этой секции 
 указываются некоторые системные значения, необходимые для сборки и работы вашего проекта. 
Так же рекомендуется вставлять эти три строки:
  <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
   </properties>
жестко задается кодировка проекта
и задается необходимая версия jdk
Необходимо упомянуть что Maven создает проект с такой структурой, которая будет задана в archetype. Archetype  выбирается на этапе создания проекта maven.

Этой информации достаточно чтобы покрыть 80% необходимых знаний по настройке проекта Maven. Если понадобится что то специфическое, то можно обратиться к подробной документации по maven