Сборка проектов давно уже автоматизированный процесс. на сегодняшний день самые известные сборщики это Gradle, Ant и Maven, о последнем речь и пойдет. Рассмотрим ниже основные плагины maven, такие как Maven Compiler plugin, Maven JAR Plugin, Maven Dependency Plugin, Maven Resources Plugin и способы их конфигурации.
Настройка MAVEN компилятора
Maven Compiler plugin
- Позволяющий управлять версией компилятора.
- Позволяет сконфигурировать настройки компилятора.
Самый популярный плагин. Пример ниже говорит компилятору какие версии java использовать для проверки кода и для компиляции.
|
1 2 3 4 5 6 7 8 9 |
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.3</version> <configuration> <source>1.8</source> <target>1.9</target> </configuration> </plugin> |
Из более серьезных возможностей, плагин позволяет указать путь к компилятору, запустить компилирование в отдельной JVM, задавать аргументы компилирования и даже выполнить компилирование не-java компилятором.
Создаем JAR файл и файл манифеста.
Maven JAR Plugin
Позволяет создать манифест и jar-файл, и описать дополнительные ресурсы, которые необходимо включить в jar-файл.
Дополнительные ресурсы, включаемые в jar, описываются тегами <include> и<exclude> (для включения и исключения соответственно):
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.0.2</version> <configuration> <includes> <include>**/service/*</include> </includes> <excludes> <exclude>**/*.png</exclude> </excludes> </configuration> </plugin> |
Для создания манифеста плагин предоставляет достаточно много вариантов. Со всеми возможностями лучше ознакомиться на официальном сайте. Здесь я приведу лишь самые распространенные (на мой взгляд и опыт) из них.
1. Самое простое решение — указать уже существующий файл манифеста:
|
1 2 3 4 5 6 7 8 9 |
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile> </archive> </configuration> </plugin> |
2. описать манифест в настройках плагина. Для наглядности сразу приведу простой пример конфигурации плагина:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.0.2</version> <configuration> <archive> <index>true</index> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <mainClass>ru.leodev.App</mainClass> </manifest> </archive> </configuration> </plugin> |
Параметр <addClasspath/> включает добавление classpath-а в манифест.
<classpathPrefix/> позволяет дописывать префикс перед каждым ресурсом. Удобно, если вы размещаете ваши зависимости в отдельной папке, на пример lib.
<mainClass/> очевидно позволяет указать главный исполняемый класс.
Пример результата:
Class-Path: lib/leodev-utils-1.1.jar
Помимо автоматической генерации classpath-а, можно описать его вручную:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<plugin> <artifactId>maven-war-plugin</artifactId> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathLayoutType>custom</classpathLayoutType> <customClasspathLayout> WEB-INF/lib/$${artifact.groupIdPath}/$${artifact.artifactId}-$${artifact.version}.$${artifact.extension} </customClasspathLayout> </manifest> </archive> </configuration> </plugin> |
В данном примере classpath генерируется по маске, в которой значения $${artifact.groupIdPath}, $${artifact.artifactId} и $${artifact.version} заменяются на соответствующие значения параметров зависимостей, описанных в блоке <dependencies>.
Пример результата:
Class-Path: WEB-INF/lib/ru/leodev/leodev-utils-4.7.jar
Или генерировать в соответствии с традициями maven:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.0.2</version> <configuration> <archive> <index>true</index> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <classpathLayoutType>repository</classpathLayoutType> </manifest> </archive> </configuration> </plugin> |
Пример результата:
Class-Path: Class-Path: lib/ru/leodev/leodev-utils/4.7/leodev-utils-4.7.jar
Как скопировать зависимости и ресурсы с помощью Maven
Maven Resources Plugin
Помимо копирования ресурсов во время сборки проекта, я пользовался этим плагином на стадии инсталляции, для копирования проекта на сервер.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<plugin> <artifactId>maven-resources-plugin</artifactId> <version>2.6</version> <executions> <execution> <id>copy-resources</id> <!-- here the phase you need --> <phase>validate</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <outputDirectory>${basedir}/target/extra-resources</outputDirectory> <resources> <resource> <directory>src/non-packaged-resources</directory> <filtering>false</filtering> <includes> <include>example.jar</include> </includes> <excludes> <exclude>temp.txt</exclude> </excludes> </resource> </resources> </configuration> </execution> </executions> </plugin> |
<outputDirectory> описывает целевую директорию, в которую которую будет происходить копирование. В блоке <resources> перечисляются объекты для копирования. Синтаксис перечисления объектов для включения/исключения аналогичен используемому в Maven JAR Plugin.
Параметр <filtering> позволяет творить всякие чудеса, почитать о которых можно здесь.
Вкратце, если у вас есть некоторый текстовый ресурс hello.txt с содержимым вида Hello ${name}, то в результате копирования этого ресурса с флагом filtering = true, в созданной копии значение ${name} будет заменено названием проекта указанным в pom.xml.
В моем случае я подменял jndiName во время сборки проекта. Это позволило заказчику не шарить jndiName и не вписывать его в варку хардкодом, а задавать его во время сборки проекта, в нашем случае использовались скрипты jenkins.
|
1 2 3 4 5 6 7 8 9 10 |
<properties> <jndiName>jdbc/porshe911Datasource</jndiName> </properties> <!-- ... --> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> |
Авторы рекомендуют не использовать filtering с бинарными файлами вроде изображений.
источник:
- Maven Plugins
-
dokwork.ru