【问题标题】:Gradle: retrieve only one of multiple published artifacts?Gradle:仅检索多个已发布工件中的一个?
【发布时间】:2014-01-17 14:41:15
【问题描述】:

我有一个 Ivy 存储库,其中包含多个已发布的工件,如下所示:

/mygroup/mymodule/1.1.1/mymodule-1.1.1.jar
/mygroup/mymodule/1.1.1/mymodule-client-1.1.1.jar
/mygroup/mymodule/1.1.1/ivy-1.1.1.xml

如果我放入以下 ​​gradle 依赖行,它会检索两个 jar。我只想检索 mymodule-client.jar,但我无法弄清楚使这项工作发挥作用的咒语。这是我现在的线路。出于其他原因,我故意排除了传递依赖。

compile ('mygroup:mymodule:1.1.11') {transitive=false}

Gradle 文档似乎表明有一种方法可以获得特定的工件,但我无法正确地获得咒语。

这是 ivy 文件的内容。为简洁起见,仅更改了模块/工件名称并删除了一些标准依赖项。

<?xml version="1.0" encoding="UTF-8"?>
<ivy-module version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd">

    <info organisation="mygroup" module="mymodule" revision="1.1.1" status="integration" publication="20120111091627"/>

    <publications>
        <artifact name="mymodule"/>
        <artifact name="mymodule-client"/>
    </publications>

    <dependencies> 
       ...          
    </dependencies>
</ivy-module>

【问题讨论】:

  • 在我看来,您的 Maven 存储库报告此工件 (mymodule) 是多个 JAR + 一个 XML 文件的组合。也许问题出在那儿,而不是 Gradle 方面(您的 Gradle 语法似乎正确)。
  • 它实际上是人工制品,当我认为曾经导入了一个较旧的 Ivy 存储库时。如果您查看 ivy-1.1.1.xml 文件,您可以看到它发布了两个 jar,它们都是 中的 元素。 gradle 行有效,它只是拉入了两个工件,我只想要“客户端”一个。
  • 可以发一下ivy-1.1.1.xml的内容吗?
  • 您在dependencies 中列出了mymodule-client 吗?
  • 不,依赖关系只是我们公司创建的几个其他 jar,比如“myorg-common-utils”类型的东西,它们没有其他依赖关系。

标签: gradle


【解决方案1】:

经过大量的尝试和错误,终于找到了合适的线路:

compile ('mygroup:mymodule:1.1.1:client@jar')

我认为它之所以有效,是因为“客户端”是模块名称的扩展(显然称为分类器)。如果我有不同的名字,我不确定我会如何解决它。

我在这里找到了给我线索的示例: http://scratchpad.pietschy.com/gradle/dependency_management.html

20.2.2.2。仅工件表示法 仅工件表示法创建仅下载一个工件文件的模块依赖项。符号 对于这样的依赖,遵循以下模式: [组]:[工件]:[版本]@[扩展] 或 [组]:[工件]:[版本]:[分类器]@[扩展]。例如:

依赖{ 编译“org.apache.ant:ant-junit:1.7.0@jar”}

【讨论】:

  • 我在 IVY 存储库中遇到了同样的问题,该存储库的实现 jar、源 jar 和 javadoc jar 工件都在同一个模块中。由于实现 jar 没有设置分类器属性,我不能仅仅将它与 javadoc 和源区分开来。使用“@jar”符号效果很好。
  • 仅供参考,目前“Artifact only notation”部分的官方文档是here
【解决方案2】:

Ivy 模块描述符不会将工件分配给不同的配置,因此无法独立检索它们。如果您只想将两个工件之一放在编译类路径上,那么应该可以使用以下内容:

configurations {
    mymodule
}

dependencies {
    mymodule 'mygroup:mymodule:1.1.1'
    compile configurations.mymodule.filter { it.name == 'mymodule-client-1.1.1.jar' } 
}

【讨论】:

  • 嗯,这给了我&gt; Could not find property 'mymodule' on org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler_Decorated@a5792d9.
  • 听起来您缺少配置部分(或拼写错误)。
  • configurations 部分在那里,只是仔细检查了拼写错误,但我在一个 Android 项目中这样做。这有什么不同吗?
  • 不应该(但这必须在android外部完成)。
  • 当然,我一直把它放在android 块之外。为了好玩,还尝试将您的代码从特定于应用程序的build.gradle 移动到顶级代码,仍然不行。
猜你喜欢
  • 2021-02-19
  • 2013-09-21
  • 1970-01-01
  • 2017-11-01
  • 1970-01-01
  • 2016-06-21
  • 1970-01-01
  • 1970-01-01
  • 2019-11-07
相关资源
最近更新 更多