jenkins - 在 gradle 中解决来自 Artifactory 的传递依赖

标签 jenkins gradle artifactory maven-publish

我的项目有两个模块,liblib-api,具有以下职责

  • lib-api - 纯java模块,仅包含接口(interface)文件
  • lib - Android 库

我希望 Jenkins 将这两个模块(作为 jar)发布到内部 Artifactory 服务器,以便其他项目能够使用。

使用 Jenkins Artifactory 插件,我能够将两个模块的 jar 发布到 Artifactory,但我依赖于 lib 的其他项目无法构建,并出现以下 gradle 错误

Could not find com.mygroup:lib-api:1.0.0-SNAPSHOT

我的设置

构建脚本

lib-api/build.gradle

apply plugin: 'java'
apply plugin: 'maven-publish'

group = 'com.mygroup'
version = project.version

publishing {
    publications {
        api(MavenPublication) {
            from components.java
        }
    }
}

lib/build.gradle

apply plugin: 'com.android.library'
apply plugin: 'com.github.dcendents.android-maven'

android { ... }

dependencies {
    compile project(':lib-api')
}

group = 'com.mygroup'
version = project.version

Jenkins Artifactory 插件配置

  • Gradle-Artifactory 集成
    • 将 Artifactory 发布到 Artifactory
      • 发布 Maven 描述符
    • 使用 Maven 兼容模式
  • 调用 Gradle 脚本
    • 使用 Gradle 包装器
    • 任务:clean assemble -x preDexDebug -x preDexDAT -x preDexRelease

Artifactory 存储库中的结果

+-- libs-snapshot-local
|   +-- com
|   |   +-- mygroup
|   |   |   +-- lib
|   |   |   |   +-- 1.0.0-SNAPSHOT
|   |   |   |   |   `-- lib-1.0.0-20150508-1.jar
|   |   |   |   |   `-- lib-1.0.0-20150508-1.pom
|   |   |   |   |   `-- maven-metadata.xml
|   |   |   |   `-- maven-metadata.xml
|   |   |   +-- lib-api
|   |   |   |   +-- 1.0.0-SNAPSHOT
|   |   |   |   |   `-- lib-1.0.0-20150508-1.jar

问题

我的理解是,artifactory/gradle 应该足够智能,能够将 -SNAPSHOT 解析为最新的带时间戳的快照,并且它设法解析 lib< 的事实似乎证明了这一点 我是否指定 latest.integration 还是 1.0.0-SNAPSHOT

如何让 gradle 解决来自神器的传递快照依赖关系?或者让artifactory插件以gradle可以解析的方式发布jar?

工作原理

我注意到 lib-api 文件夹没有 maven-metadata.xml 文件,并且快照版本文件夹没有...或 pom 文件。我怀疑这可能是问题所在。

Artifactory 的 Jenkins 插件在后台使用 gradle artifactory 插件来处理启用了 Gradle-Artifactory 集成的作业。根据gradle artifactory plugin docs插件 ID 会根据您使用的是新的 (maven-publish) 还是旧的 (maven) 发布机制而变化。

这可能是问题所在吗? Artifactory 插件是否应用了错误的插件 ID,也许是因为它是根据 android 库模块做出决定的?

最佳答案

tl;dr 切换到旧的 gradle Maven 插件修复了它。

我的 lib-api/build.gradle 现在看起来像这样

apply plugin: 'java'
apply plugin: 'maven'

group = 'com.mygroup'
version = project.version
ext.artifactId = project.name.toLowerCase()
project.archivesBaseName = project.artifactId

uploadArchives {
    repositories {
        mavenDeployer {
            pom.artifactId = project.artifactId
        }
    }
}

Note: According to the gradle docs for the maven plugin, pom.artifactId must be explicitly defined if you've set archivesBaseName. That may have been the underlying issue with my previous configuration, but I did not go back and test it.

关于jenkins - 在 gradle 中解决来自 Artifactory 的传递依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30134320/

相关文章:

java - 从 Artifactory 下载元数据信息

xml - 关于 Jenkins JUnit XML 格式

linux - Gradle 停留在配置项目

java - Jenkins:Gerrit 触发器问题的设置

java - 导入模块后 list 合并失败

java - 如何使用 gradle 为 Junit 测试授予写入权限

android - 如何运行 gradle 任务 --info

maven - 我的共享(Gradle)库没有被正确读取...Artifactory Maven Pom 文件未发布排除项可能是原因

regex - Jenkins Gerrit 在除 master 之外的所有分支上触发

Gradle artifactory 插件无法解决对配置阶段的依赖