Исключить само-ссылку в многомодульном проекте Maven

Вопрос или проблема

У меня есть этот pom.xml для многомодуля проекта:

<?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>com.github.alopatin.kafka_learning.java</groupId>
    <artifactId>java</artifactId>
    <version>1.0</version>
    <modules>
        <module>resources</module>
        <module>producer-simple</module>
        <module>producer-json</module>
    </modules>

    <properties>
        <maven.compiler.source>23</maven.compiler.source>
        <maven.compiler.target>23</maven.compiler.target>
    </properties>

    <packaging>pom</packaging>

    <dependencies>
        <dependency>
            <groupId>com.github.alopatin.kafka_learning.java</groupId>
            <artifactId>resources</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>com.typesafe</groupId>
            <artifactId>config</artifactId>
            <version>1.4.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.kafka</groupId>
            <artifactId>kafka-clients</artifactId>
            <version>3.8.1</version>
        </dependency>
    </dependencies>

    <build>
        ...
    </build>
</project>

Подмодуль resources содержит общие ресурсы для всех подмодулей. Мне не нужны зависимости в этом подмодуле.

Как я могу предотвратить добавление зависимостей из корневого pom.xml в один подмодуль resources?
Сейчас я получаю ошибку:

Проект com.github.alopatin.kafka_learning.java:resources:1.0
(D:\Wokrspace\kafka-learing\java\resources\pom.xml) имеет 1 ошибку
[ERROR]
‘dependencies.dependency.[com.github.alopatin.kafka_learning.java:resources:1.0]’
для com.github.alopatin.kafka_learning.java:resources:1.0 ссылается на себя. @
com.github.alopatin.kafka_learning.java:java:1.0, D:\Wo
krspace\kafka-learing\java\pom.xml, строка 36, колонка 21

Ответ или решение

Ваша проблема заключается в том, что подмодуль resources в многомодульном проекте Maven ссылается на себя в качестве зависимости, что и вызывает ошибку. Чтобы решить эту проблему и исключить зависимости из корневого POM-файла для модуля resources, можно воспользоваться следующими подходами.

1. Использование <dependencyManagement>

Рекомендуется использовать секцию <dependencyManagement> в корневом POM-файле. Это позволит вам задать версии зависимостей и избежать их наследования в подмодули, где это нежелательно. Для этого вы можете переместить секцию <dependencies> в <dependencyManagement> и добавить явные зависимости только в тех модулях, которые их требуют. Вот пример, как это может выглядеть:

<project ...>
    ...
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.github.alopatin.kafka_learning.java</groupId>
                <artifactId>resources</artifactId>
                <version>1.0</version>
            </dependency>
            <dependency>
                <groupId>com.typesafe</groupId>
                <artifactId>config</artifactId>
                <version>1.4.3</version>
            </dependency>
            <dependency>
                <groupId>org.apache.kafka</groupId>
                <artifactId>kafka-clients</artifactId>
                <version>3.8.1</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    ...
</project>

После этого в pom.xml модуля resources не добавляйте секцию <dependencies>, и он будет свободен от этих зависимостей.

2. Разделение зависимостей

Если подмодуль resources не должен зависеть от других модулей и не требует каких-либо зависимостей, можно полностью удалить секцию <dependencies>. Это также поможет избежать самоссылки:

<project ...>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>resources</artifactId>
    <packaging>jar</packaging>

    <!-- Убедитесь, что здесь нет секции dependencies -->
</project>

3. Использование <scope>

Если вам требуется оставить некоторые зависимости в resources, вы можете использовать <scope> для исключения их из области видимости, однако это более сложный подход и в вашем случае, вероятно, не требуется.

4. Сведение к минимуму зависимостей

Держите зависимости в корневом POM-файле на минимуме. Чем меньше зависимостей в корневом POM, тем меньше вероятность их неумышленного распространения по модулям. Следите за тем, какие зависимости действительно необходимы.

Заключение

Выбор одного из предложенных решений позволит избежать ошибок самоссылки и управлять зависимостями в вашем многомодульном проекте более эффективно. Используйте управление зависимостями и избегайте небходимости создавать ненужные связи между модулями. Это не только улучшит структуру вашего проекта, но и сделает его более поддерживаемым и понятным для других разработчиков.

Если у вас возникнут дополнительные вопросы или вам потребуется помощь в дальнейшем, не стесняйтесь обращаться к специалистам.

Оцените материал
Добавить комментарий

Капча загружается...