Пример создания и подключения пакетов Maven
В данном разделе рассмотрен пример создания проекта java и публикации пакета Maven в реестр GitVerse и создания второго проекта, где мы подключаем пакет из первого.
Для проверки данных примеров подготовлен репозиторий gitverse_tutorials/CICD_building_projects (opens in a new tab): ветки maven-build (opens in a new tab) и maven-puller (opens in a new tab).
Подготовительные действия
Установка Maven
Обновите список пакетов:
sudo apt update
Установите Maven:
sudo apt install maven
Проверьте установку:
$ mvn -version
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 11.0.23, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64
Default locale: en, platform encoding: UTF-8
OS name: "linux", version: "5.15.153.1-microsoft-standard-wsl2", arch: "amd64", family: "unix"
settings.xml
Замените токен на ваш в settings.xml
в /home/username/.m2/settings.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<settings>
<servers>
<server>
<id>gitverse</id>
<configuration>
<httpHeaders>
<property>
<name>Authorization</name>
<value>token b9fc851700bc67f92a3394f9afd164331c529c43</value>
</property>
</httpHeaders>
</configuration>
</server>
</servers>
</settings>
Эти настройки используются Maven при обращении к реестру пакетов в GitVerse для выполнения операций, требующих аутентификации:
<id>gitverse</id>
: уникальный идентификатор сервера Maven, в данном случае gitverse;<name>Authorization</name>
: в данном контексте параметрAuthorization
, говорит, что это заголовок, через который передается информация об аутентификации;<value>token b9fc851700bc67f92a3394f9afd164331c529c43</value>
: значение параметра для HTTP-заголовка Authorization, содержащее токен доступа для аутентификации на сервере GitVerse.
Создание проекта и публикация первого пакета
HelloWorld.java
Создайте в директории src/main/java/ru/gitverse/tutorials.helloworld/ файл HelloWorld.java:
package ru.gitverse.tutorials.helloworld;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
Комментарий к HelloWorld.java
Java-пакет ru.gitverse.tutorials.helloworld
следует разместить в директории src/main/java/ru/gitverse/tutorials/helloworld/, чтобы Java мог правильно его распознать, т.к. структура должна соответствовать структуре каталогов.
При нарушении структуры каталогов проект соберется, но команда java -jar target/hello-world-module-0.0.1.jar
выполнится с ошибкой:
$ java -jar target/hello-world-module-0.0.1.jar
Error: Could not find or load main class ru.gitverse.tutorials.HelloWorld
pom.xml первого проекта
Файл pom.xml — это файл конфигурации Maven. По умолчанию он должен быть размещен в основной директории проекта.
Пример pom.xml для HelloWorld.java:
<project 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>ru.gitverse.tutorials</groupId>
<artifactId>hello-world-module</artifactId>
<version>0.0.1</version>
<packaging>jar</packaging>
<repositories>
<repository>
<id>gitverse</id>
<url>https://gitverse.ru/api/packages/author/maven/</url>
</repository>
</repositories>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<distributionManagement>
<repository>
<id>gitverse</id>
<url>https://gitverse.ru/api/packages/author/maven/</url>
</repository>
<snapshotRepository>
<id>gitverse</id>
<url>https://gitverse.ru/api/packages/author/maven/</url>
</snapshotRepository>
</distributionManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>ru.gitverse.tutorials.helloworld.HelloWorld</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>
Комментарий к pom.xml первого проекта
Раздел для публикации пакета на GitVerse с вашей учетной записью:
<distributionManagement>
<repository>
<id>gitverse</id>
<url>https://gitverse.ru/api/packages/author/maven/</url>
</repository>
<snapshotRepository>
<id>gitverse</id>
<url>https://gitverse.ru/api/packages/author/maven/</url>
</snapshotRepository>
</distributionManagement>
Раздел для сборки и запуска проекта:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>ru.gitverse.tutorials.helloworld.HelloWorld</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
Сборка пакета
Сборка пакета:
$ mvn clean install
[INFO] Scanning for projects...
...
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.034 s
[INFO] Finished at: 2024-07-16T07:54:38+03:00
[INFO] ------------------------------------------------------------------------
Проверка программы:
$ java -jar target/hello-world-module-0.0.1.jar
Hello, World!
Когда вы выполняете команду mvn clean install
, Maven очищает предыдущие собранные файлы из директории target, собирает проект, запускает тесты (если они есть), упаковывает скомпилированный код и ресурсы в JAR-файл и устанавливает его в локальный репозиторий Maven. Таким образом, JAR-файл hello-world-module-0.0.1.jar создается и устанавливается в вашем локальном репозитории.
Публикация пакета
$ mvn clean deploy
[INFO] Scanning for projects...
...
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.086 s
[INFO] Finished at: 2024-07-16T07:58:00+03:00
[INFO] ------------------------------------------------------------------------
Опубликованный пакет отобразится в профиле пользователя > Пакеты.
Пример:
Создание второго проекта и подключение первого пакета
Puller.java
Создайте файл Puller.java в директории src/main/java/ru/gitverse/tutorials/puller:
package ru.gitverse.tutorials.puller;
import ru.gitverse.tutorials.helloworld.HelloWorld;
public class Puller {
public static void main(String[] args) {
System.out.println("calling HelloWorld.main:");
HelloWorld.main(args);
}
}
Комментарий к Puller.java
Если оба файла опубликованы отдельно и подключаются отдельно, то у них должны быть уникальные заголовки, соответствующие их собственным пакетам: ru.gitverse.tutorials.puller;
и ru.gitverse.tutorials.helloworld;
. В этом случае каждый файл имеет свой собственный уникальный пакет для избежания конфликтов и обеспечения четкой организации классов.
Если оба проекта, которые используют разные файлы, являются частью одной и той же группы проектов, то они могут иметь одинаковый групповой идентификатор. Правильное использование групповых идентификаторов в Maven обычно предполагает уникальную идентификацию группы проекта, но в рамках одной группы проектов они могут совпадать.
pom.xml
Пример pom.xml для Puller.java:
<?xml version="1.0" encoding="UTF-8"?>
<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>ru.gitverse.tutorials</groupId>
<artifactId>puller-module</artifactId>
<version>0.0.1</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<repositories>
<repository>
<id>gitverse</id>
<url>https://gitverse.ru/api/packages/author/maven</url>
</repository>
</repositories>
<distributionManagement>
<repository>
<id>gitverse</id>
<url>https://gitverse.ru/api/packages/author/maven</url>
</repository>
<snapshotRepository>
<id>gitverse</id>
<url>https://gitverse.ru/api/packages/author/maven</url>
</snapshotRepository>
</distributionManagement>
<build>
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>ru.gitverse.tutorials.Puller</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.6.0</version>
<configuration>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>ru.gitverse.tutorials</groupId>
<artifactId>hello-world-module</artifactId>
<version>0.0.1</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
Комментарий к pom.xml второго проекта
Для подключения пакета из реестра GitVerse можно обратиться к инструкции на странице самого пакета.
Перейдите на страницу пакета:
Отобразится страница с инструкциями для подключения пакета:
В дополнение к <repositories>
, <distributionManagement>
и <build>
в pom.xml появился раздел <dependencies>
для подключения ранее опубликованного hello-world-module
:
<dependencies>
<dependency>
<groupId>ru.gitverse.tutorials</groupId>
<artifactId>hello-world-module</artifactId>
<version>0.0.1</version>
<scope>compile</scope>
</dependency>
</dependencies>
Сборка пакета
Введите команду mvn clean install
:
$ mvn clean install
[INFO] Scanning for projects...
...
BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.741 s
[INFO] Finished at: 2024-07-16T11:34:17+03:00
[INFO] ------------------------------------------------------------------------
mvn clean install
автоматически загрузит зависимости из реестра перед компиляцией и упаковкой проекта.
Проверка программы:
$ java -jar target/puller-module-1.0-SNAPSHOT.jar
calling HelloWorld.main:
Hello, World!
Публикация пакета второго проекта
Далее можете опубликовать новый пакет:
$ mvn clean deploy
...
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.804 s
[INFO] Finished at: 2024-07-16T11:35:38+03:00
[INFO] ------------------------------------------------------------------------
Второй пакет отобразится в профиле пользователя > Пакеты.