将 Gradle 与自定义 Ivy 存储库一起使用

Posted

技术标签:

【中文标题】将 Gradle 与自定义 Ivy 存储库一起使用【英文标题】:Using Gradle with custom Ivy repository 【发布时间】:2014-05-14 06:07:58 【问题描述】:

我是 Gradle/Groovy 的新手,所以我可能遗漏了一些明显的东西。你能帮忙吗?

我们使用 Ivy 进行依赖管理。我正在试用 Gradle,并希望与我们现有的 Ivy 基础设施集成。通常这应该是可能的,但是我们常春藤的布局有点特殊,而且……我无法让它工作。

以 commons-lang-2.4.jar 为例。

通常,您会像这样通过 ivy 获取此文件(参见http://mvnrepository.com/artifact/commons-lang/commons-lang/2.4):

<dependency org="commons-lang" name="commons-lang" rev="2.4"/>

但我们必须这样做:

<dependency org="org.apache" name="commons-lang" rev="2.4" conf="compile"/>

这是因为我们的 Ivy 布局考虑了组织的 url,例如像这样:

<ivyrepository>/org/apache/commons-lang/2.4/commons-lang-2.4.jar

我现在尝试将其翻译为 Gradle:

repositories 
    ivy 
        url 'http://svnserver/svn_public/trunk/ivyrepository'
        layout 'pattern', 
            artifact '[organisation]/[module]/[revision]/[artifact]-[revision].[ext]'
            ivy '[organisation]/[module]/[revision]/[module]-[revision].ivy'
        
    


dependencies 
    compile 'org.apache:commons-lang:2.4'

这当然是失败的,因为 '[organisation]/[module]' 转换为 'org.apache/commons-lang',它应该转换为 org/apache/commons-lang!

所以我尝试了这个,天真地认为 replaceAll() 会用斜杠替换那些点:

repositories 
    ivy 
        url 'http://svnserver/svn_public/trunk/ivyrepository'
        layout 'pattern', 
            artifact '[organisation].replaceAll(\'.\',\'/\')/[module]/[revision]/[module]-[revision].jar'
            ivy '[organisation].replaceAll(\'.\',\'/\')/[module]/[revision]/[module]-[revision].ivy'
        
    

唉,函数没有被评估!救命!

【问题讨论】:

我认为你需要使用maven模式,然后像上面一样重新配置它。 不确定您的意思?我将在哪里使用 Maven 模式?我无法更改现有的 ivy 布局... 对不起,我的意思是 maven 布局。 换句话说,你会使用layout 'maven', ... 。这应该提供 Maven 样式的组分隔符。 谢谢。但这给了我以下例外:“找不到参数 [[organisation]/[module]/[revision]/[artifact]-[revision](-[classifier]).[ext]] 的方法 artifact() ...MavenRepositoryLayout_Decorated@5c2445"。我使用的是 1.11 版 【参考方案1】:

要获得组织部分的 Maven 样式布局,请使用:

repositories 
    ivy 
        url ...
        layout 'pattern', 
            m2compatible = true
            ...
        
    

【讨论】:

我还应该包括人工制品和常春藤图案吗?如果我这样做了,我会在日志中看到以下内容:[HTTP HEAD:svnserver/svn_public/trunk/ivyrepository/org.apache/…。所以 Gradle 仍在目录 'org.apache' 中搜索。如果我不添加这些模式,我看不到任何下载尝试;我刚刚得到:“找不到 org.apache:commons-lang:2.4”。不知道它是否相关,但 m2Compatible 属性似乎已被弃用(“Deprecated dynamic property: "m2Compatible")? 对不起,它是m2compatible(带有小写的c)。是的,您应该包括模式。 “不推荐使用的 dynamic 属性”通常是拼写错误的结果。在 Gradle 2.x 中,这将是错误而不是警告。

以上是关于将 Gradle 与自定义 Ivy 存储库一起使用的主要内容,如果未能解决你的问题,请参考以下文章

Gradle 搜索 Ivy 服务但未定义 Ivy 配置/存储库

如何使用自定义 gradle 插件而不将其发布到 maven/ivy 存储库?

使用 gradle 解决代理存储库上的 ivy 依赖关系会导致资源丢失

将公共 maven 存储库与 ivy 一起使用

将 Shiro 的 PasswordMatcher 与自定义领域一起使用

将 Qt 与自定义 MinGW 一起使用