Как я могу использовать зависимости проекта, отмеченного как предоставленный?

У меня есть следующий упрощенный сценарий:

projectX  ---> projectA ---> projectB

Где ---> означает «зависит от».

ProjectB действительно прост. Он не объявляет никаких зависимостей. Фактически, единственная важная часть такова:

<packaging>jar</packaging>

В pom.xml projectA я объявил зависимость от projectB:

<packaging>jar</packaging>
<dependencies>
    <dependency>
        <groupId>com.mycompany</groupId>
        <artifactId>projectB</artifactId>
        <version>1.0.0</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

И в pom.xml projectX у меня есть:

<packaging>war</packaging>
<dependencies>
    <dependency>
        <groupId>com.mycompany</groupId>
        <artifactId>projectA</artifactId>
        <version>1.0.0</version>
        <scope>compile</scope>
    </dependency>
</dependencies>

Проблема в том, что projectX должен использовать компоненты (классы и т. Д.), Которые определены в projectB. Если я изменю область видимости в projectA, чтобы использовать compile для projectB, все будет работать, но тогда projectB будет включен при генерации войны в projectX, и мне нужно, чтобы эта библиотека была вне созданной войны, потому что я предоставляю projectB в других часть проекта.

В реальном сценарии у меня есть несколько зависимостей, таких как projectB, которые влияют на projectA, поэтому, чтобы уменьшить размер сгенерированной войны, я хотел бы установить их как указано, но тогда projectX не может использовать компоненты, определенные в любой из этих библиотек. Пример компонентов: Spring, Hibernate и др.

Вопрос: есть ли способ добиться этого простым способом без повторного объявления зависимостей во многих местах?


person Luiggi Mendoza    schedule 26.04.2016    source источник
comment
Предоставленные зависимости не являются транзитивными. / questions / 34904558 /. Это встроено в Maven и, скорее всего, никогда не изменится.   -  person Tunaki    schedule 27.04.2016
comment
@Tunaki это мотивация для этого вопроса (:   -  person Luiggi Mendoza    schedule 27.04.2016
comment
Да, но вот вывод: неправильно использовать зависимость, которую вы не объявляете. См. Мой ответ там, для этого есть отчет об ошибке. Вам придется заявить об этом прямо.   -  person Tunaki    schedule 27.04.2016
comment
@Tunaki, мой вопрос: как избежать повторного объявления нескольких зависимостей в нескольких проектах снова и снова? А под несколькими я имею в виду более 10 зависимостей.   -  person Luiggi Mendoza    schedule 27.04.2016
comment
@LuiggiMendoza считаете обычным родительским помпом?   -  person A_Di-Matteo    schedule 27.04.2016
comment
Или подумайте о создании спецификации, которую вы импортируете в каждый из своих проектов (если вы не можете создать родительский POM, как предложил @ A.DiMatteo)? Как здесь и документ здесь. Это может решить вашу проблему.   -  person Tunaki    schedule 27.04.2016
comment
@Tunaki, этот последний комментарий очень подходит в качестве ответа.   -  person Luiggi Mendoza    schedule 27.04.2016
comment
@Tunaki ОК, тогда сделайте это, и я удалю свой, для меня не проблема   -  person A_Di-Matteo    schedule 27.04.2016
comment
@ A.DiMatteo оставьте свое, нет проблем с несколькими сообщениями, пытающимися ответить на вопрос. Это я решу, какой из них принять.   -  person Luiggi Mendoza    schedule 27.04.2016
comment
@LuiggiMendoza ну, может быть, пора было получить значок дисциплины, потому что я действительно не был достаточно дисциплинирован в последнее время :) чувство, которое у меня было   -  person A_Di-Matteo    schedule 27.04.2016
comment
Дело в том, что я не уверен, что он действительно отвечает на ваш вопрос, поскольку вам придется объявлять зависимость везде, где она вам понадобится (а это то, чего вы не хотите). В спецификации будет учитываться только версия (это ее цель). Думаю, единственный ответ на ваш вопрос - это то, что ответил @ A.DiMatteo :).   -  person Tunaki    schedule 27.04.2016


Ответы (1)


Проблема в том, что projectX должен использовать компоненты (классы и т. Д.), Которые определены в projectB.

Тогда ProjetB действительно должен быть зависимостью от ProjectX в provided области, опять же. Повторное объявление зависимости изменит то, как Maven будет обрабатывать ее как транзитивную зависимость (то есть вы можете переопределить ее поведение, сказав: Я хочу эту зависимость в моем проекте с этой областью действия).

но тогда projectB будет включен при генерации войны в projectX, и мне нужно, чтобы эта библиотека была вне сгенерированной войны

Этого не произойдет, если повторно объявить это в provided области. Кроме того, вы можете изменить объем ProjectB в ProjectA на compile, а затем настроить _4 _, чтобы исключить их, используя включения / исключения.
Перед тем как это сделать, вам следует дважды проверить, почему семантически (или с точки зрения требований) ProjectB был установлен как provided в ProjectA, и как это повлияет на другие потребительские проекты.


Обновление
Оба вышеперечисленных подхода могут удовлетворить ваши потребности. В качестве альтернативы, как предлагается в комментариях, в долгосрочной перспективе дополнительные варианты могут быть более устойчивыми и понятными в направлении улучшения управления и обслуживания (централизации):

  • Используйте общий родительский pom, где вы можете объявить список общих зависимостей, то есть зависимости, которые будут использоваться всеми дочерними проектами, определенные (и поддерживаемые) один раз.
  • Используйте раздел dependencyManagement в ProjectX, чтобы изменить способ Посредник зависимостей Maven будет обрабатывать транзитивные зависимости от ProjectA без изменения ProjectA или ProjectB (аналогично опции 1 вверху этого ответа, причем разница в том, что он применяется только всякий раз, когда зависимость входит в область видимости и игнорируется в противном случае). Опять же, чтобы централизовать это управление, было бы лучше сделать это в общем родителе (вариант выше).
person A_Di-Matteo    schedule 26.04.2016