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

时间:2009-01-28 12:48:21

标签: ant dependencies ivy

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

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

由于jaas和jaac是Sun的图书馆,因此它成为了一个显示阻止者,因此他们的许可证禁止将它们放置在Maven回购中,因此常春藤在那里找不到它们。

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

4 个答案:

答案 0 :(得分:25)

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

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

答案 1 :(得分:19)

如何让常春藤下载Hibernate而不是这两个?

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

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

如果我真的需要这些并从Sun下载他们的Jars,我的机器中的哪个文件夹会常春藤寻找它们?

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

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

以下是常春藤设置文件中的示例本地文件解析程序:

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

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

Here是解析器的文档。

编辑: OP针对他的具体原始问题找到了一个耗时较少的强化解决方法。依赖标记的“exclude”子标记为他完成了这项工作:

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

答案 2 :(得分:0)

浏览网页和博客时,我发现以下常春藤设置可用于抓取jaas / jacc和hibernate

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

答案 3 :(得分:0)

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

编辑:然后,请参阅下面的讨论,看看不这样做的注意事项。

((用户主页)是Windows 7上的C:/ Users /(用户名)。