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

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

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

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

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

【问题讨论】:

    标签: ant dependencies 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})。
      猜你喜欢
      • 2017-08-06
      • 2017-08-13
      • 2013-10-14
      • 2010-11-06
      • 2017-02-23
      • 2012-08-05
      • 2017-07-21
      • 2011-10-24
      • 2014-05-07
      相关资源
      最近更新 更多