2011-03-23 24 views
8

estoy usando Apache Ivy + IvyDE para conseguir las dependencias de mi proyecto, que son:dependencias ocultas en Ivy

<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" /> 

Las fuentes son el JBoss Hibernate (repositorios) y Maven.

Como puede ver, estoy usando logback + SLF4J para el registro, pero por alguna razón Ivy también descargará log4j y slf4j-log4j, lo que causa un pequeño problema en mi aplicación.

¿Hay alguna manera de ver por qué sucede esto, para ver cuál de las dependencias anteriores depende de log4j? ¿Puedo obtener un árbol/gráfico de dependencia generado por Ivy/IvyDE?

¿Existe alguna forma de evitar que esto suceda?

Respuesta

19

Tenemos una tarea ant que tiene este aspecto:

<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> 

Entonces es sólo una llamada ant report e Ivy va a generar el informe como HTML en el directorio dado.

Eche un vistazo a the Ivy documentation for ivy:report.

Editar:

Para evitar la inclusión de esos artefactos/dependencias, podría intentar transitive="false" en el elemento <dependency ..>, o utilizar <exclude>. Por ejemplo, usamos Hibernate 3 pero no queremos tener JTA 1.1, por lo que nuestro ivy.xml contiene esto: <exclude module="jta"/> para excluir todas las dependencias transitivas de JTA.

+0

Funciona perfectamente, informe para encontrar al culpable (hibernate-validator), excluya para cortar log4j fuera –

+0

Sin esperar, todavía consigo log4j cuando compila con Ant o ejecuta desde Eclipse, aunque no aparece en el ivy.xml [*] listado en Eclipse. –

+0

Bueno, puede haber otra dependencia que tenga log4j como dep transitivo. ¿Excluyó globalmente log4j, no solo para hibernate-validator? – Thomas

4

me gustaría construir sobre la respuesta de Thomas y recomendar la adición de una declaración 'conf' a las dependencias:

<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"/> 

Esto reducirá las dependencias transitivas en el valor predeterminado de sub-conjunto, que en la terminología de Maven es las jarras en el alcance "compilar".

Sin esta configuración, usted obtiene todas las dependencias que incluyen muchas cosas opcionales que no necesitará.

+0

Tienes razón, nosotros hacemos eso también (+1). – Thomas

+0

@mark: Intenté seguir pero no funciona: ¿Alguna ayuda? – tejas

+0

@tejas necesita proporcionar más detalles sobre lo que está pasando mal.Mi primera suposición es que quizás estás detrás de un proxy de red. Sugiero publicar una nueva pregunta. –