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

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

Настоящий проект доступен в репозитории GitVerse, в ветке maven-mirror (opens in a new tab) и показывает пример подключения maven-пакета com.fasterxml.jackson через зеркало https://mvn-mirror.gitverse.ru.

Проект использует класс ObjectMapper для преобразования формата JSON в объекты Java и наоборот, результат сериализации и десериализации выводится в консоль.

Подробнее смотрите ниже в описании файла JsonExample.java.

Структура проекта

gitverse-registry-mirrors/
├── README.md
├── dependency-reduced-pom.xml
├── pom.xml
├── settings.xml  # приведен для справки
├── src
   └── main
       └── java
           └── ru/gitverse/tutorials/jsonexample
               └── JsonExample.java
└── target/

Краткое описание:

  • README.md — настоящее руководство;
  • dependency-reduced-pom.xml — информация о зависимостях в объединенном JAR-файле. Создается автоматически в Maven-проекте при использовании плагина maven-shade-plugin;
  • pom.xml — описание зависимости нашего проекта;
  • src/main/java — каталог для исходного кода Java;
  • src/main/java/ru/gitverse/tutorials/jsonexample/JsonExample.java — файл класса, где ru.gitverse.tutorials.jsonexample.JsonExample — полное квалифицированное имя класса. Компилятор Java использует полное имя класса для поиска соответствующего файла с исходным кодом;
  • target/ — каталог создается автоматически при выполнении команд сборки проекта и автоматические удаляется при пересборке и очистке.

dependency-reduced-pom.xml

Файл dependency-reduced-pom.xml создается автоматически в Maven проекте при использовании плагина maven-shade-plugin, в нем содержится информацию о зависимостях в объединенном JAR-файле (fat JAR) после процесса упаковки.

Плагин maven-shade-plugin позволяет упаковать все зависимости в один JAR-файл (fat JAR), подключение плагина в pom.xml описано далее.

pom.xml

pom.xml (Project Object Model) - основной файл конфигурации в проектах, использующих систему сборки Maven. Он представляет собой XML-файл, который содержит всю необходимую информацию о проекте: от его названия и версии до зависимостей от других библиотек и плагинов, используемых для сборки.

Код файла pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project>
 
  <modelVersion>4.0.0</modelVersion>
 
  <groupId>your-group-id</groupId>
  <artifactId>jsonexample</artifactId>
  <version>1.0-SNAPSHOT</version>
  <properties>
    <java.version>11</java.version>
  </properties>
 
  <dependencies>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.17.1</version> 
    </dependency>
  </dependencies>
 
  <build>
    <plugins>
        <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-jar-plugin</artifactId>
              <version>3.3.0</version>
              <configuration>
                  <archive>
                      <manifest>
                          <addClasspath>true</addClasspath>
                          <mainClass>ru.gitverse.tutorials.jsonexample.JsonExample</mainClass>
                      </manifest>
                  </archive>
              </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.11.0</version>
            <configuration>   
            <source>11</source>
            <target>11</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.6.0</version>
            <configuration>
                <!-- put your configurations here -->
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>exec-maven-plugin</artifactId>
          <version>3.5.0</version>
          <configuration>
            <mainClass>ru.gitverse.tutorials.jsonexample.JsonExample</mainClass>
          </configuration>
        </plugin>
    </plugins>
  </build>
</project>

Секции pom.xml:

  • <modelVersion> — указывает версию модели POM;
  • <groupId> — идентификатор группы проекта, используется для уникальной идентификации проекта;
  • <artifactId> — идентификатор артефакта проекта, обычно это имя проекта;
  • <version> — версия проекта. Версия 1.0-SNAPSHOT означает, что проект находится в стадии разработки (SNAPSHOT);
  • <properties> — используется для определения свойств, которые могут быть использованы в других частях pom.xml:
    • <java.version> — версия Java для сборки проекта. Посмотреть свою версию Java можно командой java -version;
  • <dependencies> — список зависимостей проекта, здесь подключется maven-пакет com.fasterxml.jackson через зеркало https://mvn-mirror.gitverse.ru. Ключевая зависимость проекта;
  • <build> — определяет конфигурацию сборки проекта.

Секция <build> в pom.xml

maven-jar-plugin используется для создания JAR-файла из результатов компиляции проекта. Он упаковывает классы, ресурсы и метаданные в стандартный JAR-формат:

<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>3.3.0</version>
        <configuration>
            <archive>
                <manifest>
                    <addClasspath>true</addClasspath>
                    <mainClass>ru.gitverse.tutorials.jsonexample.JsonExample</mainClass>
                </manifest>
            </archive>
        </configuration>
</plugin>

maven-compiler-plugin отвечает за компиляцию исходного кода Java в байт-код. Он позволяет настроить уровень совместимости Java, оптимизацию компиляции и другие параметры:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.11.0</version>
    <configuration>   
    <source>11</source>
    <target>11</target>
    </configuration>
</plugin>

maven-shade-plugin используется для создания «толстых» JAR-файлов (fat JAR), которые включают все необходимые зависимости. Он объединяет классы и ресурсы из зависимостей в один JAR-файл:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.6.0</version>
    <configuration>
        <!-- put your configurations here -->
    </configuration>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
        </execution>
    </executions>
</plugin>

exec-maven-plugin позволяет запускать исполняемые классы непосредственно из командной строки Maven (mvn compile exec:java). Он полезен для тестирования и отладки приложений без необходимости запуска их отдельно:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>3.5.0</version>
    <configuration>
    <mainClass>ru.gitverse.tutorials.jsonexample.JsonExample</mainClass>
    </configuration>
</plugin>

settings.xml

Файл приведен для примера подключения зеркала https://npm-mirror.gitverse.ru. Секции зеркала и профиля следует указать settings.xml, уже существующем на в вашей операционной системе. Если файла нет, его следует создать.

Расположение файла settings.xml:

  • для Windows — C:\Users\<YourUsername>\.m2\settings.xml;
  • для MacOS и Linux — /home/username/.m2/settings.xml (домашняя директория пользователя).

Код файла settings.xml:

<?xml version="1.0" encoding="UTF-8"?>
<settings>
<!-- Секция mirrors -->
    <mirrors>
        <mirror>
            <id>mvn-mirror</id>
            <name>GitVerse Maven Mirror</name>
            <url>https://mvn-mirror.gitverse.ru</url>
            <mirrorOf>*</mirrorOf>
        </mirror>
    </mirrors>
 
    <profiles>
        <profile>
            <id>gitverse</id>
            <repositories>
                <repository>
                    <id>mvn-mirror</id>
                    <url>https://mvn-mirror.gitverse.ru</url>
                    <releases><enabled>true</enabled></releases>
                    <snapshots><enabled>true</enabled></snapshots>
                </repository>
            </repositories>
            <pluginRepositories>
                <pluginRepository>
                    <id>mvn-mirror</id>
                    <url>https://mvn-mirror.gitverse.ru</url>
                    <releases><enabled>true</enabled></releases>
                    <snapshots><enabled>true</enabled></snapshots>
                </pluginRepository>
            </pluginRepositories>
        </profile>
    </profiles>
 
    <!-- Секция активации профиля -->
    <activeProfiles>
        <activeProfile>gitverse</activeProfile>
    </activeProfiles>
</settings>

JsonExample.java

Класс JsonExample.java является точкой входа программы и содержит основной метод main(), который запускается при выполнении программы.

В коде подключается пакет пакет com.fasterxml.jackson, класс ObjectMapper которого преобразовывает формат JSON в объекты Java и наоборот. Результаты сериализации и десериализации выводятся в консоль.

JSON задается в двух местах:

  1. Временно в процессе сериализации в первой части кода в строке:
String jsonString = mapper.writeValueAsString(person);
  1. В предопределенной строке во второй части кода:
String json = "{\"name\":\"Jane Smith\", \"age\": 25}";

Код файла JsonExample.java:

package ru.gitverse.tutorials.jsonexample;
 
import com.fasterxml.jackson.databind.ObjectMapper;
 
public class JsonExample {
    public static void main(String[] args) throws Exception
 {
        ObjectMapper mapper = new ObjectMapper();
 
        // Serialize a Java object to JSON
        Person person = new Person("Jane Smith", 25);
        String jsonString = mapper.writeValueAsString(person);
        System.out.println(jsonString);
 
        // Deserialize a JSON string to a Java object
        String json = "{\"name\":\"Jane Smith\", \"age\": 25}";
        Person deserializedPerson = mapper.readValue(json, Person.class);
        System.out.println(deserializedPerson.getName()  + ", " + deserializedPerson.getAge());
    }
 
    static class Person {
        public String name;
        public int age;
 
        public Person() {
            // Optionally, initialize default values for name and age here
        }
 
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
 
        }
 
        public String getName() {
            return this.name;
        }
         
        public void setName(String name) {
            this.name = name;
        }
        
        public int getAge() {
            return this.age;
        }
        
        public void setAge(int age) {
            this.age = age;;
        }
    }
}

Пояснения:

  • package ru.gitverse.tutorials.jsonexample; — имя пакета, указывается в секциях pom.xml для корректной сборки проекта. Полное квалификационное имя формируется из имени пакета и имени класса (JsonExample);

  • import com.fasterxml.jackson.databind.ObjectMapper; — подключения maven-пакета com.fasterxml.jackson;

  • public class JsonExample JsonExample:

    • внутри метода main:

      • сериализация (преобразование объекта в JSON):
        • создается объект ObjectMapper под названием mapper. Этот объект используется для работы с данными JSON;
        • создается объект Person с именем person и определенными значениями имени и возраста.;
        • объект person сериализуется (преобразуется) в jsonString с помощью метода mapper.writeValueAsString(person);
        • jsonString выводится в консоль с помощью System.out.println(jsonString);;
      • десериализация (преобразование JSON в объект):
        • определяется строка json с уже существующим представлением объекта Person в формате JSON;
        • объект mapper десериализаует строку json;
        • десериализованный объект Person выводится в консоль с помощью System.out.println(deserializedPerson.name + ", " + deserializedPerson.age);;
    • static class Person:

      • имеет два приватных поля:
        • name — строковая переменная для хранения имени человека;
        • age — целочисленная переменная для хранения возраста человека;
      • имеет два конструктора:
        • конструктор по умолчанию без аргументов;
        • Конструктор, принимающий аргументы name (строка) и age (целое число);
      • содержит методы getName() и setName() для доступа к полю name, а также методы getAge() и setAge() для доступа к полю age.

Каталог target

Каталог target создается автоматически при выполнении команд сборки и очистки проекта, например:

  • mvn package — компилирует исходный код, выполняет тесты и упаковывает проект в JAR- или WAR‑файл. Скомпилированные классы, ресурсы и итоговый артефакт помещаются в каталог target.
  • mvn clean — yдаляет все содержимое каталога target;
  • mvn clean package — последовательно выполняет очистку и сборку проекта.

Запуск и проверка кода

Запуск кода должен показать результат сериализации объекта в JSON и на следующей строке результат обратной операции:

{"name":"Jane Smith","age":25}
Jane Smith, 25

Компиляция и выполнение

Компиляция и выполнение командой mvn compile exec:java для быстрого запуска и тестирования:

$ mvn compile exec:java
...
[INFO] --- exec-maven-plugin:3.5.0:java (default-cli) @ jsonexample ---
{"name":"Jane Smith","age":25}
Jane Smith, 25
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  1.076 s
[INFO] Finished at: 2024-11-25T20:40:42+03:00
[INFO] ------------------------------------------------------------------------

Сборка и выполнение JAR-файла

Команда для сборки и JAR-файла:

mvn clean package && java -jar target/jsonexample-1.0-SNAPSHOT.jar

Вы должны увидеть в консоли:

$ mvn clean package && java -jar target/jsonexample-1.0-SNAPSHOT.jar
...
{"name":"Jane Smith","age":25}
Jane Smith, 25