вторник, 7 июня 2016 г.

Сборка Maven проектов

В заметке описано как применять Maven для сборки java проектов.


Apache Maven — фреймворк для автоматизации сборки проектов на основе описания их структуры в файлах на языке POM (англ. Project Object Model), являющемся подмножеством XML. Проект Maven издаётся сообществом Apache Software Foundation, где формально является частью Jakarta Project.

Установка Maven

Последнюю версию всегда можно скачать на странице загрузки на официальном сайте. Просто распаковываем архив в любую директорию. Далее необходимо создать переменную в Path, в которой необходимо указать путь к Maven. Заходим в  Коапьютер (правой кнопкой) - Свойства  - Дополнительные параметры системы - Переменные среды – в верхнем окошке нажимаем Создать, вводим имя M3_HOME и значение папку установки Maven "d:\apache-maven-3.3.9". Далее там же создаем еще одну переменную M3 со значением %M3_HOME%\bin. Так же убеждаемся, что есть переменная JAVA_HOME с путем к JDK. Ее значение должно быть примерно таким «c:\Java\jdk1.8.0_91\». И наконец в том же окошке создаем/модифицируем переменную Path, в нее необходимо просто написать %M3%, чтобы наша папочка с исполняемым файлом Maven была видна из командной строки. Теперь необходимо проверить работоспособность нашей установки. Для этого заходим в командную строку и вводим команду
mvn –version

Должна появиться информация о версиях Maven, jre и операционной системе, что-то вроде:
Apache Maven 3.3.9
Maven home: d:\apache-maven-3.3.9\bin\..
Java version: 1.8.0_91
...

Maven создаст вам локальный репозиторий в вашей личной папке, например в каталоге C:\Documents and Settings\username\.m2\repository

Все, Maven готов к работе, можно приступать к созданию приложения.

Создание приложения из архетипа

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

Итак, допустим нас интересует консольное приложение. В командной строке, в необходимом каталоге выполняем команду Maven:

mvn archetype:generate

Maven выведит список всех доступных архетипов, их можно фильтровать введя символы из названия. Нас будет интереисовать тип по умолчанию который пододёт для обычного консольного приложения, в этом случае будет выбран архетип maven-archetype-quickstart. Просто нажмем Enter.Maven предложит ввести парметры. Вводим следующее:

Choose a number or apply filter (format: [groupId:]artifactId, case sensitive co
ntains): 788:
Choose org.apache.maven.archetypes:maven-archetype-quickstart version:
1: 1.0-alpha-1
2: 1.0-alpha-2
3: 1.0-alpha-3
4: 1.0-alpha-4
5: 1.0
6: 1.1
Choose a number: 6: 6
Define value for property 'groupId': : com.mycompany.app
Define value for property 'artifactId': : java-app
Define value for property 'version':  1.0-SNAPSHOT: : 1
Define value for property 'package':  com.mycompany.app: :
Confirm properties configuration:
groupId: com.mycompany.app
artifactId: java-app
version: 1
package: com.mycompany.app
 Y: : y

Теперь мы можем лицезреть довольно наглядную структуру каталогов с говорящими названиями java-app\src\main\java\com\mycompany\app  – здесь будут ваши классы, java-app\src\test\java\com\mycompany\app – юнит-тесты, в корне же проекта будет pom.xml файл, который и описывает процесс сборки для Maven.

Сборка проекта
Здесь все просто – выполняем команду

mvn package

или

mvn install

в корневом каталоге приложения, там, где находится файл pom.xml. Первая команда скомпилирует ваш проект и поместит его в папку target, а вторая еще и положит его к вам в локальный репозиторий.

Есть полезная функция, наподобие конвеера, то есть можно написать

mvn clean install

и Maven сначала очистит папку target проекта, потом соберет его и положит в репозиторий.

Файл pom.xml имеет следующий вид

<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>4.0.0</modelVersion>   <groupId>com.mycompany.app</groupId>   <artifactId>java-app</artifactId>   <version>1</version>   <packaging>jar</packaging>   <name>java-app</name>   <url>http://maven.apache.org</url>   <properties>     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>   </properties>   <dependencies>     <dependency>       <groupId>junit</groupId>       <artifactId>junit</artifactId>       <version>3.8.1</version>       <scope>test</scope>     </dependency>   </dependencies> </project>
<modelVersion> - версия POM-модели (всегда 4.0.0)
<groupId> - группа или организация, к которой принадлежит проект. Чаще всего выражается в виде перевернутого наоборот доменного имени
<artifactId> - имя, которое будет передано библиотеке экземпляра(artifact) проекта (к примеру, имя его JAR или WAR файла)
<version> - версия, с которой будет собран проект
<packaging> - как проект должен быть упакован. По умолчанию, с "jar" упаковывается в JAR-файл, "war" - WAR-файл
<dependency> - этот блок XML объявляет список зависимостей проекта. В частности, он объявляет единственную зависимость от junit библиотеки. В элементе, зависимость определяется через описание трех вложенных элементов:
<groupId> - группа или организация, к которой принадлежит зависимость.
<artifactId> - необходимая библиотека
<version> - версия необходимой библиотеки
По умолчанию, все зависимости определены как <compile> зависимости. Т.е. они должны быть доступны во время компиляции(а если вы собираете WAR-файл, то в /WEB-INF/lib каталоге). Кроме того, вы можете добавить<scope> элемент, с одним из значений:
provided - зависимости, которые требуются для компиляции кода проекта, но которые будут доступны во время выполнения кода контейнером(например, Java Servlet API)
test - зависимости, которые используются для компиляции и запуска тестов, но не требуемые для сборки или выполнения кода проекта

После выполнения команды mvn package в консоли получим информацию о течении сборки и компиляции и отработки тестов.

Также в каталоге проекта появится каталог target с откомпилированными классами и тестами, а также jar файл.

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

Теперь сами добавим зависимость в проект от библиотеки joda-time. Для этого в pom.xml добавим блок в dependicies

<dependency>
  <groupId>joda-time</groupId> 
  <artifactId>joda-time</artifactId> 
  <version>2.2</version> 
</dependency>

Также добавим секцию сборки

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-shade-plugin</artifactId>
      <version>2.1</version>
      <executions>
        <execution>
          <phase>package</phase>
          <goals>
            <goal>shade</goal>
          </goals>
          <configuration>
            <transformers>
              <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
              <mainClass>hello.HelloWorld</mainClass>
            </transformer>
          </transformers>
        </configuration>
      </execution>
    </executions>
  </plugin>
</plugins>
</build>

И в классе App поменяем метод main, для использования joda-time

package com.mycompany.app;
import org.joda.time.LocalTime;
/**
 * Hello world!
 *
 */
public class App 
{
    public static void main( String[] args )
    {
   LocalTime currentTime = new LocalTime();
        System.out.println("The current local time is: " + currentTime);
        System.out.println( "Hello World!" );
    }
}

выполним

mvn clean package

Теперь файл jar увеличил свой размер, а если посмотреть то внутри него теперь есть библиотека joda-time.

Запустим собранный проект в каталоге target:

java -jar java-app-1.jar

Получим

The current local time is: 15:51:09.028
Hello World!

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


Maven Eclipse



Для работы с Maven в Eclipse необходим плагин. Его можно установить 2-мя путями

Первый
  1. Открыть Eclipse
  2. Зайти в Help -> Install New Software...
  3. Нажать Add кнопку сверху справа
  4. И добавить пункт "M2Eclipse" с расположением в "http://download.eclipse.org/technology/m2e/releases" или "http://download.eclipse.org/technology/m2e/milestones/1.0"
Нажать OK
  1. Второй
  2. Открыть Eclipse
  3. Перейти в Help - Eclipse Marketplace
  4. Искать строку Maven
  5. Нажать "Install" кнопку у "Maven Integration for Eclipse"
  6. Далее следовать инструкции
После успешной инсталляции
Перейдите в Window - Preferences
В панели слева должен появится пункт Maven. Установка закончена.

Перевод существующего проекта в Maven проект
  1. Правой кнопкой нажимаем на существующий проект
  2. Переходим в Configure - Convert to Maven Project
Создание нового проекта
  1. Откроем File - New - Other - Maven - Maven Project
  2. Далее следуем инструкции и вводим параметры нового проекта
Импорт имеющегося проекта
Это наш случай, т.к. проект уже создан.

  1. Перейдем Import - Maven - Existing Maven Project
  2. Указываем каталог с нашим проектом
  3. Выбираем наш проект и загружаем его
В дереве проектов появится java-app
Для запуска его как Maven проекта

Нажмем на проект правой кнопочкой
Перейдем Run As - Maven ...
В открывшемся окне у кажим в поле goals "package"

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

Maven NetBeans

NetBeans может автоматически распознавать существующий проект maven. Если у вас есть такой проект, просто используйте диалоговое окно Open Project (который будет вызван с помощью Ctrl-Shift-O сочетание клавиш, значок на панели инструментов или пункта Файл / Открыть меню проекта). Все признанные проекты Maven должны быть отмечены значком типа проекта Maven. При выборе такой папки в файловом броузере, вы получите название проекта и список подпроектов на правой стороне.
Откроем наш проект. Перейдем File - Open Project...


Проект появится в дереве объектов.
Запустим его нажав Run. В консоле отобразится результат выполнения проекта.

В NetBeans можно связать цели maven со стандартными целями Net Beans.
Для этого Правой кнопкой на проекте - Properties - Action и тут настраиваем.

Создание нового проекта в Net Beans.

Выбираем Project From Archetype для того что бы выбрать необходимый архетип.
Находим необходимый архетип и продолжаем.
Указываем необходимые свойства. И завершаем создание проекта.

Ссылки по теме

https://ru.wikipedia.org/wiki/Apache_Maven - Apache Maven

http://maven.apache.org/ - Apache Maven Project

https://habrahabr.ru/post/77382/ - Apache Maven — основы

http://stackoverflow.com/questions/8620127/maven-in-eclipse-step-by-step-installation - Maven in Eclipse: step by step installation

http://www.apache-maven.ru/quick_start.html - Простой пример

https://books.sonatype.com/m2eclipse-book/reference/running-sect-running-maven-builds.html -
Running Maven Builds

http://spring-projects.ru/guides/maven/ - Сборка Java-проекта с использованием Maven

https://books.sonatype.com/m2eclipse-book/reference/creating-sect-importing-projects.html - Importing Maven Projects

https://maven-repository.com/archetypes - List of maven archetypes

http://www.dokwork.ru/2012/09/eclipse-maven.html - Управление зависимостями в eclipse с помощью Maven.

http://www.tutorialspoint.com/maven/maven_eclispe_ide.htm - Import a maven project in Eclipse

http://wiki.netbeans.org/MavenBestPractices - MavenBestPractices

Комментариев нет:

Отправить комментарий