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

问题描述 投票:20回答:4

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

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

由于jaas和jaac是Sun库,因此它们成为了一个显示阻止因素,因此他们的许可证禁止将它们放置在Maven回购中,因此Ivy无法在那里找到它们。

  • 如何使常春藤下载Hibernate而不是这两个?
  • 作为奖励,如果我真的需要那些并从Sun下载他们的Jars,我的机器中的哪个文件夹会常春藤寻找它们?
ant dependencies ivy
4个回答
19
投票

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

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

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

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

常春藤查找常春藤文件和工件的“目录”由您正在使用的解析器列表指定。解析器列表在常春藤设置文件中指定(通常命名为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任务上的resolver属性或常春藤设置文件中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>

25
投票

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

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

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>


0
投票

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

编辑:然后再看看下面的讨论,看看不这样做的考虑因素。

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

© www.soinside.com 2019 - 2024. All rights reserved.