常春藤:我如何删除传递依赖?

Posted

技术标签:

【中文标题】常春藤:我如何删除传递依赖?【英文标题】:Ivy: how do I remove transitive dependencies? 【发布时间】:2010-10-04 00:03:42 【问题描述】:

我正在使用Ivy 来管理我的项目的依赖关系。

到目前为止,我已经指定了对 Hibernate 和 servlet-api 的依赖。但是,hibernate jar 本身有很多并不真正需要的依赖项,例如jaas 和jacc。

因为 jaas 和 jaac 是 Sun 库,因此它们的许可证禁止将它们放在 Maven 存储库中,因此 Ivy 无法在其中找到它们。

如何让 Ivy 下载 Hibernate 而不是这两个? 作为奖励,如果我真的需要这些并从 Sun 下载了它们的 Jars,Ivy 会在我机器的哪个文件夹中查找它们?

【问题讨论】:

【参考方案1】:

不下载任何依赖项的另一个选项是使用transitive 属性禁用它们。所以如果你想要hibernate-core,但没有它的依赖项,你可以这样做:

<dependencies>  
   <dependency org="org.hibernate" name="hibernate-core"
               rev="3.3.1.GA" conf='..'
               transitive="false" /> 
</dependencies>

【讨论】:

完全移除传递似乎有点冒险,我更喜欢“按conf过滤”的方法。【参考方案2】:

如何让 Ivy 下载 Hibernate 而不是这两个?

Ivy 使用它所谓的“配置”来做到这一点。代表 Hibernate 的 ivy.xml 将需要提供不同的配置来代表 hibernate 的不同用例。 (显然,hibernate 的某些使用确实需要 jaas 和 jacc,但显然您没有使用这种情况。)

Here 是关于配置的文档。如果您想提供用于休眠的ivy.xml,我可以提供有关构建配置的指针,这些配置将删除您要删除的特定库。

如果我真的需要这些并从 Sun 下载了它们的 Jars,Ivy 会在我机器的哪个文件夹中查找它们?

ivy 查找 ivy 文件和工件的“目录”由您正在使用的解析器列表指定。解析器列表在 ivy 设置文件(通常命名为 ivysettings.xml)中指定。通常,这些不是本地目录,而是远程 URL。有;但是,可以使用本地文件解析器类型。

如果您这样做,您将需要提供 ivy 文件和工件(jar),每个文件的文件名都与解析器模式匹配。有关详细信息,请参阅文档。

这是一个来自 ivy 设置文件的本地文件解析器示例:

<filesystem name="myfiles" checkconsistency="false" checksums="" transactional="false">
   <ivy pattern="/data/repo/[organisation]/[module]-[revision].ivy.xml"/>
   <artifact pattern="/data/repo/[organisation]/[module]-[revision].[ext]"/>
</filesystem>

另外请注意,您需要将您的 ivy 任务指向正确的解析器。您可以使用 ant 任务的 resolver 属性或 ivy 设置文件中 settings 元素的 defaultResolver 属性来执行此操作。

Here 是关于解析器的文档。

编辑: OP 为他的特定原始问题找到了一种耗时较少的解决方法。依赖标签的“排除”子标签为他完成了这项工作:

<dependencies>  
   <dependency org="org.hibernate" name="hibernate-core" rev="3.3.1.GA" conf='..'> 
       <exclude name='jaas' /> 
       <exclude name='jacc' />
   </dependency>
</dependencies>

【讨论】:

很好的答案,感谢您的宝贵时间。后来我发现了 exclude 标签,它到目前为止解决了我排除一些库的问题:【参考方案3】:

浏览网页和博客,我发现以下 ivy-settings 可用于抓取 jaas/jacc 和休眠

<ivysettings>

<settings defaultResolver="chained" checkUpToDate="true" />

<resolvers>
    <chain name="chained">
        <url name="com.springsource.repository.bundles.release">
            <ivy pattern="http://repository.springsource.com/ivy/bundles/release/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" />
            <artifact pattern="http://repository.springsource.com/ivy/bundles/release/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" />
        </url>

        <url name="com.springsource.repository.bundles.external">
            <ivy pattern="http://repository.springsource.com/ivy/bundles/external/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" />
            <artifact pattern="http://repository.springsource.com/ivy/bundles/external/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" />
        </url>

        <ibiblio name="ibiblio" m2compatible="true"/>

        <ibiblio name="jboss" root="http://repository.jboss.org/maven2/" m2compatible="true"/>

        <ibiblio name="java-net-maven1" root="http://download.java.net/maven/1" pattern="$java.net.maven.pattern" m2compatible="false"/>

        <ibiblio name="java-net-maven2" root="http://download.java.net/maven/2/" m2compatible="true"/>

        <ibiblio name="compass" m2compatible="true" root="http://repo.compass-project.org" />

    </chain>

</resolvers>

jboss ibibilio 解析器是抓取 JAAS/JAAC 的诀窍

然后我的 ivy.xml 可以使用

将其拉入
<ivy-module version="2.0">

<info organisation="foo" module="Bar"/>
<dependencies>

    <dependency org="com.h2database" name="h2" rev="1.2+"/>

    <dependency org="org.hibernate" name="hibernate-annotations" rev="3.4.0.GA"/>     

</dependencies>

【讨论】:

【参考方案4】:

回答你的第二个子问题字面意思,到目前为止没有人做过,“Ivy 会在我机器的哪个文件夹中查找 JAR?”那要看。假设您没有更改 ivysettings.xml 或其他配置文件中的位置:对于 JAAS, 这将是:(user home)/.ivy2/cache/javax.security/jaas/jars。如果 Ivy 已经尝试在 Maven Central 或其他 repo 中查找 JAAS 失败,则该目录树大部分应该已经存在,您需要做的就是创建“jars”目录并将 jaas-1.0.01.jar 放入其中。 Ivy 在下一次调用中将不再抱怨缺少依赖项。

编辑:再一次,请参阅下面的讨论以了解不这样做的注意事项。

((user home) 在 Windows 7 上是 C:/Users/(username))。

【讨论】:

这里只是缓存,不能直接放jar。对于这种情况,最好使用 FileSystemResolver。 据我所知,FileSystemResolver 仍然不是一个可移植的解决方案,因为 JAR 的位置可能因机器而异。我仍然认为简单地将 JAR 复制到目录比编辑 Ivy 配置以指向目录并让 Ivy 完成与您可以手动完成的完全相同的事情更快(并且不会更脏)。还是 FileSystemResolver 做的不止这些? cleancache 任务可以随时删除常春藤缓存。甚至可以重新定义缓存位置。您可以在 ivysettings 中使用属性,以便文件系统解析器可以指向相对路径(或 $user.home)。

以上是关于常春藤:我如何删除传递依赖?的主要内容,如果未能解决你的问题,请参考以下文章

常春藤从常春藤缓存中删除不需要的(旧)工件

无法使用 Eclipse 中的 IvyDE 插件从常春藤缓存中删除过时的工件

阿帕奇常春藤。未检索到传递依赖项

如何解决具有不同包装常春藤类型的sbt中的依赖关系?

常春藤不使用分类器拉动对 jar 的传递依赖

如何在没有 Ivy 的情况下编译库?