Найти скрытые зависимости в плюще - PullRequest
10 голосов
/ 23 марта 2011

Я использую Apache Ivy + IvyDE для получения зависимостей моего проекта:

    <dependency org="com.google.guava" name="guava" rev="r08" />

    <!-- logging -->
    <dependency org="org.slf4j" name="jcl-over-slf4j" rev="1.6.1" />
    <dependency org="ch.qos.logback" name="logback-classic" rev="0.9.27" />

    <!-- database -->
    <dependency org="org.hibernate" name="hibernate-entitymanager" rev="3.6.2.Final" />
    <dependency org="org.hibernate" name="hibernate-validator" rev="4.1.0.Final" />
    <dependency org="org.hibernate" name="hibernate-c3p0" rev="3.6.2.Final" />
    <dependency org="mysql" name="mysql-connector-java" rev="5.1.14" />

Источниками являются репозитории Maven и JBoss (Hibernate).

Как видите, я использую logback + SLF4J для ведения журнала, но по какой-то причине Айви также загрузит log4j и slf4j-log4j, что вызывает несколько небольших проблем в моем приложении.

Есть ли способ узнать, почему это происходит, чтобы увидеть, какие из приведенных выше зависимостей зависят от log4j? Могу ли я получить график / дерево зависимостей, сгенерированный из Ivy / IvyDE?

И есть ли способ предотвратить это?

Ответы [ 2 ]

20 голосов
/ 23 марта 2011

У нас есть цель ant, которая выглядит следующим образом:

<target name="report" depends="init">
    <mkdir dir="report" />
    <!-- 
     The type attribute is optional, we're using it to exlude other dependcy types we're not interested in. 
     Note that each resolve uses that list (via a property) in our build. 
    -->
    <ivy:resolve type="jar,ejb,tld,bundle"/> 
    <ivy:report todir="report" />
</target>

Тогда это просто вызов ant report, и Айви сгенерирует отчет в виде HTML в заданном каталоге.

Взятьвзгляните на документацию Ivy для ivy: report .

Edit:

Чтобы предотвратить включение этих артефактов / зависимостей, вы можете попробовать transitive="false" на <dependency ..> элемент, или используйте <exclude>.Например, мы используем Hibernate 3, но не хотим иметь JTA 1.1, поэтому наш ivy.xml содержит это: <exclude module="jta"/> для исключения всех транзитивных зависимостей JTA.

4 голосов
/ 23 марта 2011

Я хотел бы опираться на ответ Томаса и рекомендовать добавить объявление "conf" в зависимости:

    <dependency org="org.slf4j" name="jcl-over-slf4j" rev="1.6.1" conf="default"/>
    <dependency org="ch.qos.logback" name="logback-classic" rev="0.9.27" conf="default"/>

Это уменьшит транзитивные зависимости до подмножества по умолчанию, которое в терминологии Maven представляет собой jar-файлы в области «compile».

Без этой настройки вы получите все зависимости, которые включают в себя множество дополнительных вещей, которые вам не понадобятся.

...