【问题标题】:Find hidden dependencies in Ivy在 Ivy 中查找隐藏的依赖项
【发布时间】:2011-07-21 06:58:09
【问题描述】:

我正在使用 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 进行日志记录,但由于某种原因,Ivy 也会下载 log4j 和 slf4j-log4j,这会导致我的应用程序出现一些小问题。

有没有办法看看为什么会发生这种情况,看看上面哪些依赖项依赖于 log4j?我可以获得从 Ivy/IvyDE 生成的依赖图/树吗?

那么有没有办法防止这种情况发生?

【问题讨论】:

    标签: java log4j ivy dependency-management


    【解决方案1】:

    我们有一个如下所示的 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,Ivy 就会在给定目录中生成 HTML 格式的报告。

    看看the Ivy documentation for ivy:report

    编辑:

    为防止包含这些工件/依赖项,您可以在&lt;dependency ..&gt; 元素上尝试transitive="false",或使用&lt;exclude&gt;。例如,我们使用 Hibernate 3,但不想拥有 JTA 1.1,因此我们的 ivy.xml 包含:&lt;exclude module="jta"/&gt; 以排除所有传递的 JTA 依赖项。

    【讨论】:

    • 完美运行,报告找到罪魁祸首(hibernate-validator),排除删除log4j
    • 不用等待,当我使用 Ant 构建或从 Eclipse 运行时,我仍然会得到 log4j,即使它没有出现在 Eclipse 的 ivy.xml [*] 列表中。
    • 嗯,可能还有另一个依赖项将 log4j 作为传递 dep。您是否全局排除了 log4j,而不仅仅是针对 hibernate-validator?
    • 我没有在全球范围内排除它,但根据报告,只有 hibernate-validator 依赖它。
    • @AnnKilzer 是的,这个 sn-p 必须添加到 build.xml。当然,您还必须添加 ivy 插件/taskdefs。
    【解决方案2】:

    我想以 Thomas 的回答为基础,建议在依赖项中添加“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。

    如果没有此设置,您将获得所有依赖项,其中包括许多您不需要的可选内容。

    【讨论】:

    • @mark :我尝试了以下但它不起作用: 有什么帮助吗?跨度>
    • @tejas 您需要提供有关问题所在的更多详细信息。我的第一个猜测是您可能在网络代理后面?我建议发布一个新问题。
    • @tejas Ahhh,那么我猜你已经创建了自己的配置并且“默认”不存在。没有更多信息无法确认。
    • 哦!现在我懂了。是的,你是对的,我确实创建了编译、运行时、运行时测试配置。我不知道默认来自那里。我假设它是无论如何都支持的。感谢您的帮助。
    猜你喜欢
    • 2015-11-05
    • 2013-09-08
    • 2016-10-16
    • 2019-03-17
    • 1970-01-01
    • 2023-03-07
    • 2014-06-06
    • 2011-12-10
    • 2013-06-30
    相关资源
    最近更新 更多