我想知道从ant管理项目依赖项的最佳方法.Maven Ant任务和Ivy的优点和缺点是什么?
我有一个ivy.xml包含
<dependencies>
<dependency org="commons-lang" name="commons-lang" rev="2.4"/>
<dependency org="foo-bar" name="superwidgets" rev="1.5"/>
</dependencies>
Run Code Online (Sandbox Code Playgroud)
整个superwidget内容托管在http://example.com/m2/的maven存储库中.常春藤文档提到了解析器,但它似乎假设一个常春藤存储库.如何将单个非官方maven存储库添加到我的常春藤设置中,仅供单个模块使用?(或换句话说,什么对应<repository>于常春藤中maven的标签?)没有什么花哨的,所以我希望在我的ivy.xml中有一个单行程.
已经有一些类似的问题,但大多数要么专注于Nexus vs. Artifactory,要么是几年之久.
我想了解这两天的两个项目的立场.我的印象是,Nexus是最受尊敬的存储库管理器,但我确实倾向于(稍微)更喜欢纯粹的自由项目(嘿,一点意识形态从不伤害任何人).
我的用例非常简单:我只想要一个按需依赖缓存,我们有六个自己的工件.我将与Ivy(不是Maven)一起使用它,我们不做自动构建,只有几个开发人员使用它.所以我也想知道Nexus的更高级功能是否是我不需要的东西.
在做出选择之前我应该注意什么?
我使用SBT作为构建Scala项目的构建工具.
我的问题是,我无法配置SBT将依赖项下载到我的用户主目录.因此,我正在寻找一个每用户甚至更好的系统范围设置来告诉SBT将Ivy缓存目录放在其他地方.
使用maven,可以使用每用户settings.xml来配置本地存储库.
我读过如何覆盖常春藤缓存的位置?它是答案,但它似乎只描述了如何在每个项目的基础上配置设置.
如果没有其他选择,我会选择每个项目设置,但我没有从上述问题得到答案.更多细节将是最受欢迎的,例如放置ivysettings.xml的位置.我将它放入项目的根目录,但它不起作用.
使用时ivy:retrieve,它无法解决应下载的依赖项.输出如下所示:
Buildfile: C:\Users\Simon\workspace\apollo\build.xml
init:
resolve:
BUILD FAILED
C:\Users\Simon\workspace\apollo\build.xml:42: Problem: failed to create task or type antlib:org.apache.ivy.ant:retrieve
Cause: The name is undefined.
Action: Check the spelling.
Action: Check that any custom tasks/types have been declared.
Action: Check that any <presetdef>/<macrodef> declarations have taken place.
No types or tasks have been defined in this namespace yet
This appears to be an antlib declaration.
Action: Check that the implementing library exists in one of:
-C:\Users\Simon\eclipse\plugins\org.apache.ant_1.8.2.v20120109-1030\lib
-C:\Users\Simon\.ant\lib
-a directory added on the …Run Code Online (Sandbox Code Playgroud) 有像http://mvnrepository.com/这样的网站让我们搜索"工件"并给出一个定义,我可以添加到我的项目中,以便从公共存储库自动下载库.
但是这个特定的例子(mvnrepository.com)(我实际上唯一知道的工作)是定义限于"按组,工件或描述搜索",而我想按类全名搜索.例如,我想进入org.apache.commons.lang.NotImplementedException以获得<dependency org="commons-lang" name="commons-lang" rev="2.6"/>(或类似)答案.有这个设施吗?
在Java Play 2.1.1应用程序中,我收到以下错误:
[myproject] $ update
[info] Updating {file:/C:/path/myproject/}myproject...
[info] Resolving ...
[error] impossible to get artifacts when data has not been loaded. IvyNode = com.google.guava#guava;12.0
[error] (*:update) java.lang.IllegalStateException: impossible to get artifacts when data has not been loaded. IvyNode = com.google.guava#guava;12.0
[error] Total time: 230 s, completed 17.05.2013 19:16:41
Run Code Online (Sandbox Code Playgroud)
Build.scala
"com.google.guava" % "guava" % "14.0.1",
"org.mydependency" % "mydependency" % "1.0-SNAPSHOT" changing() exclude("org.jboss.netty","netty") exclude("com.google.guava", "guava") exclude("log4j", "log4j"),
Run Code Online (Sandbox Code Playgroud)
导致此错误的事情(之前一切正常)是mydependency中的依赖项更改:
旧:
<dependency>
<groupId>com.thinkaurelius.titan</groupId>
<artifactId>titan-berkeleyje</artifactId>
<version>0.3.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
新:
<dependency>
<groupId>com.thinkaurelius.titan</groupId>
<artifactId>titan-cassandra</artifactId>
<version>0.3.1</version>
</dependency> …Run Code Online (Sandbox Code Playgroud) 我试图找出一些依赖项添加到我在grails项目中使用的grails插件.mvn dependency:tree在Grails/Ivy中是否有maven命令的等价物
我们有一个大型(> 500,000 LOC)Java系统,它依赖于40-50个OSS包.系统使用Ant构建,目前手动处理依赖关系管理.我正在调查Ivy和/或Maven以自动化依赖关系.去年我们将Maven看作是一个构建自动化系统并拒绝它,因为它需要完全重构我们的系统以匹配Maven的架构.现在我正在寻求自动化依赖管理任务.
我已经对常春藤进行了一些实验,但遇到了问题.例如,当我将ActiveMQ指定为依赖项,并告诉Ivy使用Maven存储库中的POM进行依赖项规范时,Ivy检索了一堆我知道不需要的包(例如Jetty,Derby和Geronimo)使用ActiveMQ.
如果我在ivysettings.xml中设置usepoms ="false",它只获取activemq.jar,但这似乎打败了Ivy的目的,并将其降级为具有手动构建的依赖规范的简单jar-fetcher.
这里有一个更大的问题,在Windows中曾经被称为"DLL Hell".在某些情况下,两个直接的第一级依赖项将指向相同传递依赖项的不同版本(例如log4j.jar).只有一个log4j.jar可以在类路径中,因此依赖性解析涉及手动确定哪个版本与我们系统中的所有客户端兼容.
我想这一切都归结为每个包的依赖规范(POM)的质量.在ActiveMQ的情况下,没有范围声明,因此任何对ActiveMQ的引用都将下载其所有依赖项,除非我们手动排除我们不知道的那些依赖项.
在log4j的情况下,自动依赖性解析将要求所有log4j的客户端(依赖于log4j的其他包)对所有先前版本的log4j进行验证,并在POM中提供兼容的log4j版本的范围(或列表).这可能太多了.
这是目前的状况,还是我错过了什么?
是否有可能使用本地Maven存储库(〜/ .m2)作为本地常春藤缓存(〜/ .ivy)?它们有不同的布局.
有时候我会使用Maven,有时我会使用下面使用Ivy的SBT,所以我在Maven和Ivy中都有2个相同的lib副本.我想使用相同的目录,从而节省磁盘空间和网络.
谢谢.