Пример создания и подключения Maven пакета

Пример создания и подключения пакетов 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] ------------------------------------------------------------------------

Второй пакет отобразится в профиле пользователя > Пакеты.

Пример:

Второй пакет отобразится в профиле пользователя > Пакеты.