艾薇: 我该如何移除传递性依赖项?

21

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

到目前为止,我已经在Hibernate和servlet-api上指定了依赖关系。然而,Hibernate本身有许多不是真正需要的依赖项,比如jaasjacc

这成为了一个难以解决的问题,因为jaas和jacc都是Sun库,因此它们的许可证禁止将它们放置在Maven仓库中,因此Ivy无法在那里找到它们。

  • 我该如何让Ivy下载Hibernate但不包括这两个库?
  • 作为额外奖励,如果我实际上需要这些库并从Sun下载它们的Jars,那么Ivy会在我的机器上哪个文件夹中查找它们?
4个回答

26

不下载任何依赖项的另一种选择是使用 transitive 属性将它们禁用。因此,如果您想要 hibernate-core,但不想要它的任何依赖项,可以这样做:

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

完全删除传递性似乎有些冒险,我更喜欢“按conf过滤”的方法。 - Jan Galinski

19

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

Ivy使用所谓的“配置”来实现此目的。您代表Hibernate的ivy.xml需要提供不同的配置来表示Hibernate的不同用例。(显然,有些Hibernate用例确实需要jaas和jacc,但显然您没有使用该用例。)

这里是有关配置的文档。如果您想提供正在使用的ivy.xml来获取Hibernate,我可以提供指针,以构建将删除要删除的特定库的配置。

如果我真正需要它们并从Sun下载了它们的Jars,那么在我的计算机上哪个文件夹中Ivy会查找它们?

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

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

以下是一个包含本地文件解析器示例的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 属性来实现此目的。

这里是有关解析器的文档。

编辑: OP 找到了一个更少时间密集型的解决方案来解决他最初的问题。 依赖项标记的“排除”子标记对他起作用:

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

3
好的回答,感谢您的时间。后面需要翻译的内容: 我后来发现了排除标签,目前解决了我排除某些库的问题:<dependencies> <dependency org="org.hibernate" name="hibernate-core" rev="3.3.1.GA" conf='..'> <exclude name='jaas' /> <exclude name='jacc' /> - Leonel

0
回答你的第二个子问题,"Ivy会在我的机器的哪个文件夹中查找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/用户名)。

这个地方只是缓存,不应该直接把JAR包放在里面。最好使用FileSystemResolver来处理这种情况。 - oers
据我所知,FileSystemResolver仍然不是一种可移植的解决方案,因为JAR文件的位置可能因机器而异。我仍然认为,将JAR文件简单地复制到目录中比编辑Ivy配置以指向目录更快(也不会更麻烦),并且让Ivy完成您可以手动完成的完全相同的事情。或者FileSystemResolver是否有更多功能? - László van den Hoek
2
Ivy缓存可以随时通过cleancache任务删除。甚至可以重新定义缓存位置。您可以在ivysettings中使用属性,以便文件系统解析器可以指向相对路径(或${user.home})。 - oers

0
在浏览网络和博客时,我发现以下ivy-settings可以用于获取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>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接