我正在使用Ivy来管理我项目的依赖项。
到目前为止,我已经指定了对Hibernate和servlet-api的依赖。但是,hibernate jar本身有许多不需要的依赖项,例如jaas和jacc。
由于jaas和jaac是Sun库,因此它们成为了一个显示阻止因素,因此他们的许可证禁止将它们放置在Maven回购中,因此Ivy无法在那里找到它们。
如何使常春藤下载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>
不下载任何依赖项的另一个选项是使用transitive
属性禁用它们。所以如果你想要hibernate-core
,但没有它的依赖,你可以这样做:
<dependencies>
<dependency org="org.hibernate" name="hibernate-core"
rev="3.3.1.GA" conf='..'
transitive="false" />
</dependencies>
浏览网页和博客,我发现以下常春藤设置可以抓住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>
为了回答你的第二个子问题,到目前为止还没有人做过,“在我的机器中的哪个文件夹中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 /(用户名))。