Автоматическое разрешение иерархии зависимостей для пользовательского jar

#java #eclipse #maven #dependencies

#java #eclipse #maven #зависимости

Вопрос:

Я борюсь с зависимостями maven. Иерархия зависимостей maven не разрешена в моих проектах, куда я добавляю свой пользовательский jar сборки. Это немного сбивает с толку, потому что все зависимости других внешних зависимостей (таких как org.json, reasteasy-jaxrs ) хорошо показаны в представлении иерархии зависимостей.Я использую Eclipse EE IDE для веб-разработчиков с плагином maven.

Структура проекта: Проект представляет собой платформу, состоящую из нескольких сервисов, использующих один и тот же модуль поддержки проекта. Кроме того, project-support будет использоваться и во внешних проектах (здесь project-consumer).

  • родительский проект (pom)
    • поддержка проекта (jar)
    • project-service-a (война)
    • project-service-b (jar)
  • проект-потребитель (война)
    • поддержка проекта (jar)

Извлечение project-parent.pom

 <modules>
    <module>../project-support</module>
    <module>../project-serviceA</module>
    <module>../project-serviceB</module>
</modules>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <tomcat.version>7.0.50</tomcat.version>
</properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-catalina</artifactId>
            <version>${tomcat.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.6.3</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20140107</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
  

Выдержка из project-support.pom

 <parent>
    <groupId>com.somecompany.project</groupId>
    <artifactId>project-parent</artifactId>
    <version>1.1.0-SNAPSHOT</version>
    <relativePath>../project-parent</relativePath>
</parent>

<artifactId>project-support</artifactId>
<name>projectsupport</name>

<dependencies>
    <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-catalina</artifactId>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
    </dependency>
    <dependency>
        <groupId>org.json</groupId>
        <artifactId>json</artifactId>
    </dependency>
</dependencies>
  

Извлечение project-service-a.pom

 <parent>
    <groupId>com.somecompany.project</groupId>
    <artifactId>project-serviceA</artifactId>
    <version>1.1.0-SNAPSHOT</version>
    <relativePath>../project-parent</relativePath>
</parent>

<artifactId>project-service-a</artifactId>
<name>projectsupport</name>

<dependencies>
    <dependency>
        <groupId>com.somecompany.project</groupId>
        <artifactId>project-support</artifactId>
    </dependency>
    <dependency>
        <groupId>org.quartz-scheduler</groupId>
        <artifactId>quartz</artifactId>
        <version>2.2.1</version>
    </dependency>
</dependencies>
  

Итак, при просмотре иерархии зависимостей project-ServiceA (а также в действующем pom) требуемые зависимости project-support не включены, что приводит к ошибкам компиляции кода. Кроме того, project-support используется в проектах, выходящих за рамки родительского проекта.

Итак, мой вопрос: почему maven не разрешает дерево зависимостей project-support и добавляет их в эффективный pom?

Заранее спасибо.

Ответ №1:

Вы установили для области зависимостей значение, предоставленное в разделе управления зависимостями вашего родителя. Согласно введению в механизм зависимостей, область видимости зависимости используется для ограничения транзитивности зависимости.

Приведенное выше связанное введение также включает таблицу, которая объявляет, какие области играют в игре с транзитивностью, а какие нет. Предоставленная область видимости не является частью транзитивности.

Таким образом, решение состоит в том, чтобы не объявлять никакой области в управлении зависимостями, но объявлять разумную область в использовании зависимостей.

Комментарии:

1. Спасибо за ссылку, на этом фоне мне наконец удалось это понять. Это может повлиять на нашу стратегию развертывания, но решение работает. Спасибо