使用Gradle发布SNAPSHOT版本到JCenter(oss.jfrog.org)

本文涉及的产品
对象存储 OSS,标准 - 本地冗余存储 20GB 3个月
对象存储 OSS,内容安全 1000 次 1年
对象存储OSS,敏感数据保护2.0 200GB 1年
简介: 回顾历史发布SNAPSHOT版本的问题解决问题完整脚本使用方法本文原创。 转载请注明CSDN博客出处: http://blog.csdn.net/maosidiaoxian/article/details/47608573在以前我发过一篇 使用Gradle发布Android开源项目到JCenter ,但随后发布SNAPSHOT版本却折腾了好久没弄出来,而昨晚在参考了两篇博客后终于成功。

本文原创。
转载请注明CSDN博客出处:
http://blog.csdn.net/maosidiaoxian/article/details/47608573

在以前我发过一篇 使用Gradle发布Android开源项目到JCenter ,但随后发布SNAPSHOT版本却折腾了好久没弄出来,而昨晚在参考了两篇博客后终于成功。

回顾历史

在发布 aar 到JCenter的时候,一开始指定上传文件的时候是使用publications,然后使用bundleRelease任务的输出做为aar的artifact。

publishing {
    publications {
        mavenJava(MavenPublication) {
            artifactId PROJ_ARTIFACTID
            artifact javadocJar
            artifact sourcesJar
            artifact bundleRelease
            //省略
        }
    }
}

bintray {
    user = BINTRAY_USER 
    key = BINTRAY_KEY

    publications = ['mavenJava']
    // 省略
}

但是在当时却导致了Android Studio里编译失败,理由是没有bundleRelease这个属性(或任务)。其原因是,这个任务一开始的时候是没有的,是在分析计算了build.gradle之后才创建的。
后来找到了一个迂回的方法,那就是使用artifacts方法来把源码和注释的jar包添加到artifact中,然后上传的时候publicationsconfigurations一起用。如下:

artifacts {
    archives javadocJar
    archives sourcesJar
}
publishing {
    publications {
        mavenJava(MavenPublication) {
            artifactId PROJ_ARTIFACTID
            // 省略
    }
}
bintray {
    user = BINTRAY_USER 
    key = BINTRAY_KEY
    configurations = ['archives']
    publications = ['mavenJava']
    //省略
}

发布SNAPSHOT版本的问题

首先参考了这篇博客,知道如何传上SNAPSHOT版本到oss.jfrog.org(JCenter是不支持SNAPSHOT版本的)。但是这里却只能用publications而不像bintray那样有configurations

artifactory {
    contextUrl = 'http://oss.jfrog.org/artifactory'
    resolve {
        repository {
            repoKey = 'libs-release'
        }
    }
    publish {
        repository {
            repoKey = 'oss-snapshot-local' //The Artifactory repository key to publish to
            username = bintray.user
            password = bintray.key
            maven = true
        }
        defaults {
//这里的名字和上面红色的名字一致即可,会将其包含的输出上传到jfrog上去
            publications('mavenJava')
            publishArtifacts = true
        }
    }
}

解决问题

于是只能再次面对以前那个问题,那就是怎么解决打包输出aar并加到mavenJava的配置中。先是找到一个github上的issue,老外用指定的文件路径来添加。stackoverflow上也有不少类似的答案。但这并不是我想要的,因为这样的指定并不灵活,而且也没有对打包aar的任务形成依赖,所以最后还是回归到如何解决在配置中添加bundleRelease的问题上。google之后,终于在小日本的这篇博客找到答案:

afterEvaluate {
    publishing.publications.aar.artifact(bundleRelease)
    publishing.publications.jar.artifact(packageReleaseJar)
}

即,使用afterEvaluate,在这里的闭包中进行添加。因为在这个时候,已经有bundleRelease这个任务了。

完整脚本

完整脚本如下:

group = PROJ_GROUP
version = PROJ_VERSION
project.archivesBaseName = PROJ_ARTIFACTID

apply plugin: 'com.jfrog.bintray'
apply plugin: "com.jfrog.artifactory"
apply plugin: 'maven-publish'

task sourcesJar(type: Jar) {
    from android.sourceSets.main.java.srcDirs
    classifier = 'sources'
}

task javadoc(type: Javadoc) {
    source = android.sourceSets.main.java.srcDirs
    classpath += configurations.compile
    classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}

task javadocJar(type: Jar, dependsOn: javadoc) {
    classifier = 'javadoc'
    from javadoc.destinationDir
}

javadoc {
    options{
        encoding "UTF-8"
        charSet 'UTF-8'
        author true
        version true
        links "http://docs.oracle.com/javase/7/docs/api"
        title PROJ_ARTIFACTID
    }
}


def pomConfig = {
    licenses {
        license {
            name "The Apache Software License, Version 2.0"
            url "http://www.apache.org/licenses/LICENSE-2.0.txt"
            distribution "repo"
        }
    }
    developers {
        developer {
            id DEVELOPER_ID
            name DEVELOPER_NAME
            email DEVELOPER_EMAIL
        }
    }
}

publishing {
    publications {
        mavenJava(MavenPublication) {
            artifactId PROJ_ARTIFACTID
            artifact javadocJar
            artifact sourcesJar

            pom{
                packaging 'aar'
            }
            pom.withXml {
                def root = asNode()
                root.appendNode('description', PROJ_DESCRIPTION)
                root.children().last() + pomConfig
            }
        }
    }
}

afterEvaluate {
    publishing.publications.mavenJava.artifact(bundleRelease)
}

bintray {
    user = hasProperty("bintrayUser")?getProperty("bintrayUser"):getProperty("BINTRAY_USER") 
    key = hasProperty("bintrayKey")?getProperty("bintrayKey"):getProperty("BINTRAY_KEY")

    publications = ['mavenJava']
    publish = true

    pkg {
        repo = 'maven'
        name = PROJ_NAME
        desc = PROJ_DESCRIPTION
        websiteUrl = PROJ_WEBSITEURL
        issueTrackerUrl = PROJ_ISSUETRACKERURL
        vcsUrl = PROJ_VCSURL
        licenses = ['Apache-2.0']
        publicDownloadNumbers = true
    }
}

artifactory {
    contextUrl = 'http://oss.jfrog.org/artifactory'
    resolve {
        repository {
            repoKey = 'libs-release'
        }
    }
    publish {
        repository {
            repoKey = 'oss-snapshot-local' //The Artifactory repository key to publish to
            username = bintray.user
            password = bintray.key
            maven = true
        }
        defaults {
            //这里的名字和上面红色的名字一致即可,会将其包含的输出上传到jfrog上去
            publications('mavenJava')
            publishArtifacts = true
        }
    }
}

使用方法

使用方法与之前的一样,这里不多赘述。稍有区别的是,在build.gradle中需要添加多一个依赖:

    classpath "org.jfrog.buildinfo:build-info-extractor-gradle:3.1.1"

这里可以参考gradle-publish项目上的build.gradle文件。
还有,发布SNAPSHOT版本的时候,在配置里的版本名称应该是xxx.xxx.xxx-SNAPSHOT,执行gradle artifactoryPublish就可以发布上去了。如果要使用,需要声明以下仓库:

    maven { url "http://oss.jfrog.org/oss-snapshot-local/" }

另外就是建议把bintray.gradle文件拷到项目中使用。

如果使用过程有问题,欢迎在我的项目中提issue

相关实践学习
通义万相文本绘图与人像美化
本解决方案展示了如何利用自研的通义万相AIGC技术在Web服务中实现先进的图像生成。
目录
相关文章
|
人工智能 移动开发 Java
Android Studio插件版本与Gradle 版本对应关系
Android Studio插件版本与Gradle 版本对应关系
3964 0
Android Studio插件版本与Gradle 版本对应关系
|
Java 开发工具 Android开发
Cocos Creator 2.4.6 Android Gradle 版本升级为 6.5.1(插件4.1.0)
Cocos Creator 2.4.6 Android Gradle 版本升级为 6.5.1(插件4.1.0)
518 1
|
JavaScript Java Maven
|
Android开发
Android Studio中修改gradle插件版本和Gradle版本
Android项目中,我们一般要设置gradle插件版本和gradle版本。 项目根目录下的build.gradle文件中,通过classpath可以指定gradle插件的版本。
|
存储 对象存储
使用Ceph对象存储的Amazon S3接口(基于nautilus版本)
使用Ceph对象存储的Amazon S3接口(基于nautilus版本)
942 0
|
9月前
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
622 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
Java Spring
Gradle 如何确保依赖的版本兼容性
Gradle 通过依赖管理机制确保版本兼容性,使用声明式配置定义项目依赖,自动解析和下载所需库。它支持版本范围和动态版本,通过冲突解决策略选择最佳版本,保证构建的一致性和可靠性。
1190 3
|
Cloud Native Java Go
解决 Spring Boot 和 Gradle Java 版本兼容性问题:A problem occurred configuring root project ‘demo1‘. > Could n
解决 Spring Boot 和 Gradle Java 版本兼容性问题:A problem occurred configuring root project ‘demo1‘. > Could n
1698 0
|
缓存 Java API
build.gradle文件介绍,gradle版本对应
build.gradle文件介绍,gradle版本对应
|
Java 测试技术 API
云效流水线构建gradle项目失败提示gradle版本过低如何解决
云效(CloudEfficiency)是阿里云提供的一套软件研发效能平台,旨在通过工程效能、项目管理、质量保障等工具与服务,帮助企业提高软件研发的效率和质量。本合集是云效使用中可能遇到的一些常见问题及其答案的汇总。
591 0

热门文章

最新文章

推荐镜像

更多