2

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

  • lib-api - 仅包含接口文件的纯 java 模块
  • lib - 一个安卓库

我想詹金斯将两个模块(作为罐子)发布到内部工件服务器,以便其他项目能够使用。

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

找不到 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
      • 发布 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.integration1.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 库模块做出决定?

4

1 回答 1

2

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
        }
    }
}

注意:根据maven插件的 gradle 文档,pom.artifactId如果您设置了 archivesBaseName,则必须明确定义。这可能是我之前配置的根本问题,但我没有回去测试它。

于 2015-05-22T14:55:12.187 回答