2013-03-02 3 views
4

Я пытаюсь следовать рекомендациям при определении данных в pom.xml, так что я начал смотреть в исходный код Spring, и я видел:Maven - транзитивные зависимости


<project xmlns="http://maven.apache.org/POM/4.0.0" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId&gtorg.springframework</groupId> 
    <artifactId&gtspring-aop</artifactId> 
    <packaging&gtjar</packaging> 
    <version&gt3.1.1.RELEASE</version> 
..... 

<dependency> 
     <groupId&gtorg.springframework</groupId> 
     <artifactId&gtspring-beans</artifactId> 
     <version>${project.version}</version> 
     <scope&gtcompile</scope> 
</dependency> 

--- 

<dependency> 
     <groupId&gtlog4j</groupId> 
     <artifactId>log4j</artifactId> 
     <scope&gttest</scope> 
</dependency> 
----- 

Но, весна-бобы также имеет зависимость от log4j.

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

Я спрашиваю об этом, потому что моя первая мысль заключалась в том, чтобы не обновлять зависимость log4j, поскольку весна-бобы уже объявили об этом.

ответ

9

Объявите зависимости, на которые вы прямо полагаетесь, независимо от того, предоставляют ли они классы, которые вы напрямую импортируете и используете, или это то, что предоставляет услугу, которую вы используете напрямую, например Log4J. Транзитные зависимости должны предоставлять только зависимости, которые необходимы во время выполнения, но которые вы не используете сами.

1

Есть две части для этого:

log4j является декларируют для «теста» области видимости, и она не будет частью доработанной продукции (баночки/войны ...). Таким образом, когда весна-бобы зависят от log4j для их теста (объема), это не означает, что существует транзитивная зависимость для проектов, использующих весенние бобы при условии или во время выполнения (области применения).

Зависимость - это позволяет включать только зависимости, подходящие для текущего этапа сборки. ... test: Эта область показывает, что зависимость не требуется для нормального использования приложения и доступна только для фаз компиляции и выполнения теста. (Apache)

Вторая часть, которая:

Если версия зависимости не указать, то он опирается на «другой» П для управления зависимостью. Таким образом, зависимость транзитивна и управляется другими. «Управление зависимостями»

Управления зависимостей - это позволяет авторам проекта напрямую указать версии артефактов, которые будут использоваться, когда они встречаются в переходных зависимости или в зависимости, где не указываются ни одна из версий. (Apache)

Maven Apache transitive dependency

+1

Привет devBinnoh, касающееся «log4j это объявить для„теста“сферы, и она не будет частью доработанной продукции (баночки/войны ...). Таким образом, когда весенне бобы зависят от log4j для своего теста (scope), что не означает, что существует транзитивная зависимость для проектов, использующих весенние бобы в предоставленных или исполняемых средах (областями). »: Я проверил и все работает правильно, если вы полагаетесь на факт что зависимость junit транзитивна. Может ли это быть каким-то другим объяснением для использования весны? – Roxana

+0

Да, ты прав. Log4j в этом случае полагается на транзитивную зависимость. Зачем?! Вот вторая часть, которая является транзитивной зависимостью через «Управление зависимостями». когда вы «не укажете» номер версии зависимости, вы полагаетесь на «другие», чтобы указать ее, следовательно, это функциональная зависимость. Первая часть моего ответа заключалась в том, чтобы указать области этих зависимостей, зная, что области могут быть транзитивными только по их областям. Однако, по весне, я думаю, что вторая часть применима. – devBinnooh

Смежные вопросы