Создание Maven приложения из командной строки

 

Можно создать и папку проекта из командной строки. 
Для этого используем команду: mkdir.
Например:
mkdir с:/mavenProgram
Запускаем консоль(командная строка) и вводим команду:
mvn arhetype :generate
Консоль запускаем в созданной папке.
Чтобы зайти в папку из консоли запускаем команду:
cd “path folder"
в нашем случае будет так:
cd C:\ mavenProgram

Далее последуют команды на создание проекта. Пока что-то не знаете, просто соглашайтесь с предложенными настройками.
Те для создания самого простого приложения Maven, а именно quickstart необходимо выбирать те настройки, которые будет подсказывать сам Maven.
Например после начала выполнения команды на создание проекта, первая остановка произойдет в момент необходимости выбора по номеру нужного архитипа( по нашему структуры проекта) . Высветится нечто подобное:

Choose a number or apply filter<format: [groupId;]artifactId, case sensetive contains >:1467

Так вот под этим номером в вашем конкретном Maven будет храниться тот самый простой стандартный архитип. Достаточно ввести этот номер в строке и Maven продолжит генерировать данный проект. Или просто нажать на пробел.

Следующий пункт, это версия нашего архитипа, Так же можно согласиться с предложенной Maven по умолчанию

Далее идет groupId :это как бы путь к проекту Или имя вашей организации. Например адрес будущего размещения проекта в интернете. Тут можно использовать правило работы с пакетами.

Т е можно указать что то такое:
www.MyProject.ru
или
test.project.program

Далее идет выбор artifactId
прописываем имя проекта:

QuickTestMaven
И далее идет выбор версии проекта:
“version” 1.0-SNAPSHOT:
указываем нужную:
1.0

далее запрашивает создание пакета, в котором и будет создан наш проект. По умолчанию имя проекта будет совпадать с именем groupid
Далее идет подтверждение правильности ввода данных. Если все верно, то надо ввести букву Y. От английского слова Yes.
Все, проект создан в той папке, которую мы указали.

Так же можно все данные для создания проекта передать в одной командной строке:

mvn archetype:generate -DgroupId=бла бла бла -DartifactId=бла бла бла -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false

В принципе все тоже самое. Расшифровка:

archetype:generate  это так называемая цель. Она указывает Maven, что нужно создать проект из архетипа. Дальше с помощью -D мы указываем определённые параметры генерации.

  • GroupId
      показывает разработчика ПО, можно указать доменное имя своей компании.

  • ArtifactId
    — название проекта. Артифакт

  • archetypeArtifactId=maven-archetype-quickstart  какой архетип использовать для создания приложения.Тоже артифакт. Данный тип самый простой.

  • archetypeVersion  версия проекта.

  • interactiveMode=false  отключает интерактивный режим при создании проекта.\

  • Все параметры для  mvn
    можно получить командой   mvn-h.


	

Жизненный цикл

Сразу хочу отметить, если вы используете intellijIdea, то в этой среде уже присутствуют все необходимое из жизненных циклов. Что то изучать дополнительно нет необходимости. Сразу начну с главного.Команды жизненного цикла это то что вы хотите получить от работы Maven.Вот пример цикла из среды разработки intellijIdea:

Кратко опишем каждую из команд LifeCycle:

compile Компиляция проекта. Для тех кто не знает:компиляция_это                      перевод программы,написанной на более высоком языке в машинный                  код,который понятен процессору. Процессор понимает машинный код

test  Тестирование с помощью JUnit тестов.Это  отладка вашего кода тестами, которые вы же и придумываете для своей программы используя библиотеку JUnit. Достаточно сомнительно занятие.

package  Создание .jar файла или war, ear в зависимости от типа проекта.Создается конечный файл вашей программы. Помещается в папку Target.

install Копирование .jar (war , ear) в локальный репозиторий

deploy  публикация файла в удалённый репозиторий

Особняком стоят команды:

clean  очистка проекта от лишних файлов .class, .jar и других файлов. В простом случае удалит весь каталог target

site создаст документацию проекта javadoc. И собирает сайт.Что это за хрень, я еще не разобрался.

Таким образом, при работе в IntellijIdea, достаточно выбрать нужную вам команду, нажать на нее и получить необходимый результат.

Опишу жизненный цикл более подробно и занудно

В Maven есть описание фаз и целей. Когда Maven нужно что-то сделать , например, почистить проект, собрать проект, запустить тесты, то Maven делает кучу вещей, которые описаны в так называемом goals-цель. Цели собирают в фазы-Phase. Фаза-это действие. Т.е. действие преследует какую то цель. Например действие сборка имеет цель получить готовый jar файл. Все действия фазы собраны в жизненный цикл. Вот в этом цикле можно выбрать нужное нам действие и запустить его.Витиевато устроено.Я бы сказал пафосно.

При выполнении команды на сборку проекта (package) выполняются следующие действия:

Phase plugin:goal

process-resources resources:resources
compile compiler:compile
process-test-resources resources:testResources
test-compile compiler:testCompile
test surefire:test
package jar:jar
install install:install
deploy deploy:deploy

Стало понятней? А как облегчилась работа, не правда ли?

В общем в каждой фазе куча целей. Цели можно запуска отдельно, можно их переопределять к другим фазам, можно отключать в фазе цели и т д.

Пресловутый site имеет четыре фазы-goals:

  • pre-site -подготовка сайта
  • site -формирование сайта
  • post-site — подготовка к публикации сайта
  • deploy- публикация сайта

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

Что такое 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

Необходимые плагины и настройки

Разберем что такое плагин.Плагин это такие скромные программы, которые расширяют функционал основной программы.

Плагины  прописываются в  POM файле.И после этого Maven сам скачает прописанный плагин.Установит его тоже автоматически.От программиста , в общем порядке установки, требуется только прописать три строки кода в POM.Прописываются также как и зависимости.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-checkstyle-plugin</artifactId>
    <version>2.2</version>
</plugin>

  У большинства  плагинов имеется несколько целей(goal). Цель-это тот результат, который мы хотим получить от работы выбранного плагина.Цель можно задать в разной фазе выполнения проекта.В секции <execution>…<execution/>. Фазы проекта: compile,test,install,package,test,deploy,site,clean.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-checkstyle-plugin</artifactId>
    <version>2.6</version>
    <executions>
        <execution>
            <phase>package</phase>
        </execution>
    </executions>
</plugin>

Так же для большинства плагинов задаются индивидуальные настройки в секции <configuration>…</configuration>

maven-archetype-plugin плагин для создания из существующего шаблона готового проекта.Имеется ввиду создание структуры проекта(основные файлы и директории).

maven-compiler-plugin  как следует из названия, это компилятор.Используется по умолчанию в большинстве проектов.Ему частенько необходимы индивидуальные настройки

<plugin>
      <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-compiler-plugin</artifactId>
        <version>2.0.2</version>
         <configuration>
           <source>1.6</source>
           <target>1.6</target>
           <encoding>UTF-8</encoding>
         </configuration>
</plugin>

В данном примере указывается версия jdk и текущая кодировка проекта.Где source это версия на которой написан код, а target это версия для запуска проекта.Плагин имеет две цели(goal): compiler:compile и compiler:testCompile. Имеет дополнительные настройки.С ними можно ознакомится в документации к плагину.

maven-surefire-plugin   запускает тесты и генерирует отчёты по результатам их выполнения. Отчёты сохраняются в ${basedir}/target/surefire-reports и находятся в двух форматах — txt и xml.  Имеет одну цель(goal) surefire:test тесты можно писать используя библиотеки JUnit  или TestNG.

по умолчанию запускаются все тесты с такими именами * «**/Test*.java» — включает все java файлы которые начинаются с «Test» и расположены в поддиректориях. * «**/*Test.java» — включает все java файлы которые заканчиваются на «Test» и расположены в поддиректориях. * «**/*TestCase.java» — включает все java файлы которые заканчиваются на «TestCase» и расположены в поддиректориях.

Чтобы вручную добавлять или удалять классы тестов можно посмотреть здесь http://maven.apache.org/plugins/maven-surefire-plugin/examples/inclusion-exclusion.html.

maven-source-plugin  создает  jar. Добавляется   в POM  в раздел /project/build/plugins/ 

 <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-source-plugin</artifactId>
    <version>2.1.2</version>
    <executions>
        <execution>
            <id>attach-sources</id>
            <phase>verify</phase>
            <goals>
                <goal>jar</goal>
            </goals>
        </execution>
    </executions>
</plugin>
             

jar  будет собираться на фазе verify.

 maven-javadoc-plugin генерирует документацию по исходному коду проекта стандартной утилитой javadoc. Документация к плагину.

maven-site-plugin   создает сайт проекта. Сгенерированные файлы будут находиться  в директории target/site.

Плагин можно  настраивать, добавлять дополнительные страницы, пункты меню и т.д. 

maven-checkstyle-maven проверяет правильность написания кода, стиль и качество кода.

Подключение плагина стандартно:

    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-checkstyle-plugin</artifactId>
            <version>2.7</version>
        </plugin>

по результатам проверки будет создан файл checkstyle-result.xml. Можно и нужно создать свой набор правил. Полный набор правил описан тут: http://checkstyle.sourceforge.net/availablechecks.html и задать его можно в специальном конфигурационном файле. (см. http://checkstyle.sourceforge.net/config.html) пример файла со сравнительно нестрогой проверкой приведён…

Внутри jar плагина есть примеры конфигурационных файлов:

  • config/sun_checks.xml — от Sun Microsystems. Используются по умолчанию.
  • config/maven_checks.xml — от Maven.
  • config/turbine_checks.xml -от Turbine.
  • config/avalon_checks.xml — от Avalon.

Если каком то месте кода появляется ошибка, но по объективным причинам код такой и должен быть, можно подавить вывод ошибки используя модуль SuppressionCommentFilter или SuppressionFilter

 <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-checkstyle-plugin</artifactId>
    <version>2.6</version>
    <configuration>
        <configLocation>src/config/checkstyle.xml</configLocation>
            <consoleOutput>true</consoleOutput>
        </configuration>
        <executions>
            <execution>
                <phase>package</phase>
                <goals><goal>check</goal></goals>
            </execution>
        </executions>
</plugin>

findbugs-maven-plugin плагин для автоматического нахождения багов в проекте.




Предположим, вы создали Maven приложение java. В среде разработки все исполнялось замечательно.Но при запуске из операционной среды возникают ошибки. И первая ошибка это отсутствие класса main. Все верно, Maven-у необходимо указать точку входа в программу. Указать тот самый  public static void main(String[] args).При создании любого файла jar, внутри него будет создан файл MANIFEST.MF :

Manifest-Version: 1.0
Permissions: sandbox
JavaFX-Version: 8.0
Created-By: JavaFX Packager
Main-Class: org.example.MainApp

В последнем необходимо прописать нашу точку входа.Можно прописать ручками в готовом jar. Распаковать его, дописать MANIFEST.MF  в  текстовом редакторе и заново запаковать.Но у нас есть Maven. Он все сделает за нас. 

Можно сделать так:

  <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <mainClass>org.example.MainApp</mainClass>
    </properties>

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

Но правильней будет прописать в плагине  maven-jar-plugin путь к  главному классу.Прописывать необходимо в секции <build>

 <build> 
       <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.1.2 </version>>
                <configuration>
                    <archive>
                        <manifest>
                   <mainClass>путь к главному класс</mainClass>
                         </manifest>
                    </archive>
                </configuration>

            </plugin>
          </plugins>
    </build>

И все бы ничего, но возникает другая проблема.В jar файле нет библиотек, зависимость на которые прописаны в POM. Решения два, можно прямо в командной строке прописать путь к каждой из библиотек, используемых проектом, либо записать все нужные библиотеки в jar файл сразу. Пойдем по второму пути. Нам поможет еще один плагин: maven-assembly-plugin. В нем же можно и манифест с главным классом прописать.Устанавливается этот плагин так же в секцию <build> <plugins>…</plugins></build> :

 <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <executions>
                    <execution>
                        <id>my-maven-assembly-plugin</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <appendAssemblyId>false</appendAssemblyId>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <mainClass>пакет/главный класс</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>

Может возникнуть вполне закономерный вопрос, а что это за новые секции в плагинах, что это такое? Ответы на эти вопросы находятся в документации к каждому плагину, на сайте разработчика каждого плагина.Но, без особой необходимости, я бы не рекомендовал сильно углубляться в описание плагинов. В большинстве случаев достаточно скопировать рекомендуемый код для подключения плагина.И работать дальше.

Теперь ваше приложение запустится без особых проблем. jar файл будет иметь все необходимое для своей работы. Минимальные настройки выполнены.

Архетип

Archetype — это шаблоны для проектов Maven. Шаблоны унифицированные.Унификация предоставляет возможность выполнять рекомендации и требования к разрабатываемому проекту.Это позволяет новому пользователю maven получить рабочий проект за несколько минут.Так же можно настроить проект так,чтобы в архетип входил только часть проекта, который будет указан разработчиками.Архетип состоит из нескольких модулей.

модульописание
archetype-packaging Определение жизненного цикла и упаковки архетипа
archetype-models Дескрипторы классов и справочная документация
archetype-commonОсновные классы
archetype-testing Компоненты, используемые внутри для тестирования

Архетипов великое множество, как только кто-то создает свой архетип и выкладывает его в открытый  репозиторий(хранилище), этот архетип тут же становится доступным для всех пользователей. Ввиду того что тема эта достаточно специфичная, то за дальнейшей информацией отсылаю к первоисточнику. Прошу заметить что изучать этот материал стоит, имея острую необходимость. В подавляющем большинстве случаев достаточно выбрать готовый архетип, загрузить его в maven и через несколько секунд сгенерировать нужный проект.

Добавление зависимостей

Для добавления необходимых библиотек в ваш проект, необходимо изучить файл настройки проекта POM.xml. Пример файла:

<modelVersion>4.0.0</modelVersion>

  <groupId>test</groupId>
  <artifactId>QuickTestMaven</artifactId>
  <version>1.0</version>

  <name>QuickTestMaven</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
        <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
        <plugin>
          <artifactId>maven-site-plugin</artifactId>
          <version>3.7.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-project-info-reports-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

Необходимо в раздел dependensies дописать нужную, так называемую, зависимость на нужную библиотеку. Зависимость будет выглядеть например так:

<dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>

Эта зависимость подключает в проект библиотеку junit. Добавим в наш проект библиотеку guava. Заходим на сайт https://mvnrepository.com/

и в его поиске задаем необходимую библиотеку

выбираем версию библиотеки

копируем текст с описанием зависимости в буфер

переносим нашу зависимость в ром файл:

<modelVersion>4.0.0</modelVersion>

  <groupId>test</groupId>
  <artifactId>QuickTestMaven</artifactId>
  <version>1.0</version>

  <name>QuickTestMaven</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>


<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>28.2-jre</version>
</dependency>



  </dependencies>

  <build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
        <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
        <plugin>
          <artifactId>maven-site-plugin</artifactId>
          <version>3.7.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-project-info-reports-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

Все, необходимая библиотека подключена.

Установка и настройка Maven

Если вы используете среду разработки  IntellijIdea то в ней  уже присутствует встроенный Maven. 
Если необходима другая версия Maven, то можно в настройках указать путь к нужному Maven.
Так же необходимо знать что maven создает на компьютере локальное хранилище всех скачанных библиотек и плагинов.Хранилище называется репозиторий.
Имеется как локальный репозиторий так и глобальный центральный.Откуда изначально скачиваются нужные библиотеки.
Так же можно в настройках указать адрес любого репозитория, откуда необходимо скачивать нужные вам файлы.

В ином случае устанавливаем maven.

Заходим на сайт Maven и скачиваем архив с bin расширением. Binary zip archive apache-maven-3.6.3-bin.zip apache-maven-3.6.3-bin.zip.sha512 apache-maven-3.6.3-bin.zip.asc Разархивируем и копируем в нужную выбранную любую папку. Находим в настройках Windows ПЕРЕМЕННЫЕ СРЕДЫ Внимание! Ваши пути могут не совпадать с путями, указанными ниже. Добавляем в переменных для пользователя новую переменную java_home. И путь в ней прописываем до нашей jdk. C:\Program Files\Java\jdk1.8.0_181 как пример. Находим переменную path и дописываем в нее путь к нашему Maven: \Program Files\Common Files\Oracle\Java\javapath;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\Program Files\Git\cmd\;C:\Maven\apache-maven-3.6.3\bin;\ %M2_HOME%\bin\ В командной строке проверяем версию Maven командой : mvn -version Должно получиться примерно так: Важно: когда мы пишем команду на проверку версии в командной строке, не забудь поставить пробел перед дефисом!!! Установка окончена.

maven

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

Для чего необходим maven

 Во первых для подключения в проект дополнительных библиотек. 
 Во вторых для подключения разнообразных плагинов, которые будут обрабатывать ваш код. Например плагин для создания из jar файла, файл exe. Или плагин для обфускации вашего кода.Или плагин для проверки вашего кода на наличие багов. Существует плагин для оптимизации кода. И т.д. 
В третьих maven создает каркас вашего будущего проекта. Т.е. он сам создает структуру папок и файлов вашего проекта, в зависимости от выбранного типа создаваемого программного обеспечения. 
В общем то этого достаточно знать.Если что то понадобится большее в работе, всегда можно доучить в процессе.

Collections

Несколько заданий из квеста Collections

/* В метод main приходит список аргументов.
Первый аргумент - имя результирующего файла resultFileName, остальные аргументы - имена файлов fileNamePart.
Каждый файл (fileNamePart) - это кусочек zip архива. Нужно разархивировать целый файл, собрав его из кусочков.
Записать разархивированный файл в resultFileName.
Архив внутри может содержать файл большой длины, например, 50Mb.
Внутри архива может содержаться файл с любым именем.
 Пример входных данных. Внутри архива находится один файл с именем abc.mp3:
C:/result.mp3
C:/pathToTest/test.zip.003
C:/pathToTest/test.zip.001
C:/pathToTest/test.zip.004
C:/pathToTest/test.zip.002
 Требования:
 •
 В методе main нужно создать ZipInputStream для архива, собранного из кусочков файлов. Файлы приходят аргументами в main, начиная со второго. 
•
 Создай поток для записи в файл, который приходит первым аргументом в main. Запиши туда содержимое файла из архива. 
•
 Поток для чтения из архива должен быть закрыт. 
•
 Поток для записи в файл должен быть закрыт. 

Разархивируем файл
*/
public class Solution {
    public static void main(String[] args) {
    }
}

Следующее задание:

/*
В отдельных файлах создай классы Service, Model, View, Controller.
Распредели методы из класса Solution по созданным классам учитывая, что должен получиться MVC.
Создай нужные поля класса при необходимости.
Не добавляй своих других методов.
Метод main() оставь в классе Solution.
 Требования:
 •
 Создай класс Service в отдельном файле. 
•
 Создай класс Model в отдельном файле. 
•
 Создай класс View в отдельном файле. 
•
 Создай класс Controller в отдельном файле. 
•
 Перемести реализацию метода getData() в подходящий класс. 
•
 Перемести реализацию метода getStringDataList() в подходящий класс. Учти, что метод getData() находится не в классе Solution. 
•
 Перемести реализацию метода onShowDataList() в подходящий класс. Учти, что метод getStringDataList() находится не в классе Solution. 
•
 Перемести реализацию метода fireShowDataEvent() в подходящий класс. Учти, что метод onShowDataList() находится не в классе Solution. 
•
 Метод main() должен создать объект типа View и вызвать у него подходящий метод. Поведение программы не должно измениться. 
*/
import java.util.ArrayList;
import java.util.List;

/* 
MVC - простая версия
*/
public class Solution {
    public static void main(String[] args) {
        new Solution().fireShowDataEvent();
    }

    public List<String> getData() {
        List<String> data = new ArrayList<String>() {{
            add("First string");
            add("Second string");
            add("Third string");
        }};
        return data;
    }

    public void fireShowDataEvent() {
        System.out.println(onShowDataList());
    }

    public List<String> getStringDataList() {
        return getData();
    }

    public List<String> onShowDataList() {
        return getStringDataList();
    }
} 

Следующее задание с несколькими классами:

/*
Аргументом для класса Solution является абсолютный путь к пакету.
Имя пакета может содержать File.separator.
В этом пакете кроме скомпилированных классов (.class) могут находиться и другие файлы (например: .java).
Известно, что каждый класс имеет конструктор без параметров и реализует интерфейс HiddenClass.
Считай все классы с файловой системы, создай фабрику - реализуй метод getHiddenClassObjectByKey.
Примечание: в пакете может быть только один класс, простое имя которого начинается с String key без учета регистра.
 Требования:
 •
 Реализуй метод scanFileSystem, он должен добавлять в поле hiddenClasses найденные классы. 
•
 Реализуй метод getHiddenClassObjectByKey, он должен создавать объект класса согласно условию задачи. 
•
 Метод main не изменяй. 
•
 Метод getHiddenClassObjectByKey не должен кидать исключений.
*/
 package com.javarush.task.task36.task3606;

public interface HiddenClass {
} 


Класс

package com.javarush.task.task36.task3606.data.second;

import com.javarush.task.task36.task3606.HiddenClass;

public class FirstHiddenClassImpl implements HiddenClass {
}

Класс

package com.javarush.task.task36.task3606;

import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;

/* 
Осваиваем ClassLoader и Reflection
*/
public class Solution {
    private List<Class> hiddenClasses = new ArrayList<>();
    private String packageName;

    public Solution(String packageName) {
        this.packageName = packageName;
    }

    public static void main(String[] args) throws ClassNotFoundException {
        Solution solution = new Solution(Solution.class.getProtectionDomain().getCodeSource().getLocation().getPath() + "com/javarush/task/task36/task3606/data/second");
        solution.scanFileSystem();
        System.out.println(solution.getHiddenClassObjectByKey("secondhiddenclassimpl"));
        System.out.println(solution.getHiddenClassObjectByKey("firsthiddenclassimpl"));
        System.out.println(solution.getHiddenClassObjectByKey("packa"));
    }

    public void scanFileSystem() throws ClassNotFoundException {
    }

    public HiddenClass getHiddenClassObjectByKey(String key) {
        return null;
    }
}


Класс

package com.javarush.task.task36.task3606.data.second;

import com.javarush.task.task36.task3606.HiddenClass;

public class SecondHiddenClassImpl implements HiddenClass {
    private SecondHiddenClassImpl() {
    }
}
package com.javarush.task.task36.task3606.data.second;

import com.javarush.task.task36.task3606.HiddenClass;

class PackageAccessClass implements HiddenClass {
    PackageAccessClass() {
    }
}