2020年最新使用gradle构建、上传并发布jar包/aar包到jcenter方法整理

原文链接:http://halohoop.com/2020/03/05/meals-2020publish2jcenter/


文章目录

      • 1. 构建Jar包,并且上传到JCenter;
      • 2. 构建Aar包,并且上传到JCenter;
      • 3. 跳过1和2,直接使用打包封装好的上传发布插件,省去较为繁琐的配置;
    • References


下文中的所有操作基于的环境为:
MacOS v10.15.3 + Java v1.8 + Gradle v6.4 + Kotlin v1.3.41 + Android SDK
假设你已经具备以上环境;

1. 构建Jar包,并且上传到JCenter;

  • TOC:
    1. gradle命令生成项目
    1. 添加发布插件;
    1. 定义生成相关产物的Gradle Tasks;
    1. 配置相关参数;
    1. 执行上传task bintrayUpload

  1. gradle命令生成项目
    我们在命令行用gradle命令帮我们生成一个项目;

    mkdir 2020jcenterpublish
    cd 2020jcenterpublish
    mkdir javaLibraryJarKotlin
    cd javaLibraryJarKotlin
    gradle init
    # 选择library ->..-> Kotlin项目(也可以选择Java)
    

    这个时候在javaLibraryJarKotlin文件夹下,我们就得到了一个Gradle为我们生成的一个项目。
    目录树如下:

    .
    ├── build.gradle
    ├── gradle
    │   └── wrapper
    │       ├── gradle-wrapper.jar
    │       └── gradle-wrapper.properties
    ├── gradlew
    ├── gradlew.bat
    ├── settings.gradle
    └── src
        ├── main
        │   ├── kotlin
        │   │   └── com
        │   │       └── halohoop
        │   │           └── librarykotlinpublish
        │   │               └── Library.kt
        │   └── resources
        └── test
            ├── kotlin
            │   └── com
            │       └── halohoop
            │           └── librarykotlinpublish
            │               └── LibraryTest.kt
            └── resources
    15 directories, 8 files
    

    我们在这个工程的基础上再进行各种功能的迭代完善,现在假设这个就是我们最终编码完成的工程,我们要将其打包发布到JCenter。

  2. 添加发布插件;

    // rootProject/build.gradle
    plugins {
        //省略一些代码...
        id 'com.jfrog.bintray' version '1.8.5'
        id 'maven-publish'
    }
    
  3. 定义生成相关产物的Gradle Tasks;

    // rootProject/build.gradle
    //生成源码jar包task
    task sourcesJar(type: Jar) {
        from sourceSets.main.allJava
        archiveClassifier = 'sources'
    }
    //生成javadoc jar包task
    task javadocJar(type: Jar) {
        from javadoc
        archiveClassifier = 'javadoc'
    }
    
  4. 配置相关参数;

    // rootProject/build.gradle
    bintray {
        user = 'TODO 设置你的bintray.com用户名'
        key = "${project.hasProperty('apiKey') ? project.apiKey : ""}"
        override = true//TODO 如果有相同版本是否覆盖
        publish = true//TODO 是否上传后直接发布
        pkg {
            repo = 'maven'//TODO 设置发布的maven库,在“bintray.com/你的用户名页面”就能够看到所有逇maven库名称
            name = project.name//TODO 项目的名称
            userOrg = user//TODO 用户所在组织
            licenses = ['Apache-2.0']//TODO 设置开源库的开源协议
            vcsUrl = "github.com/halohoop/2020jcenterpublish"//TODO 设置开源库地址
            issueTrackerUrl = "github.com/halohoop/2020jcenterpublish/issue"//TODO 设置开源库issue地址
            version {
                name = '0.0.1'//TODO 设置版本号
                desc = "javaLibraryJarKotlin 0.0.1 final"
                released = new Date()//TODO 发布时间
                vcsTag = '0.0.1'//TODO 设置版本tag
    //            attributes = ['gradle-plugin': 'com.use.less:com.use.less.gradle:gradle-useless-plugin']//可忽略的属性,有需求可以查看官方文档进行相关配置
            }
        }
        //TODO 添加publishing DSL中定义的名称
        publications = ['MyPublication']
    }
    publishing {
        publications {
            MyPublication(MavenPublication) {
                //标准开源库,以下都三个文件是标配
                artifact(jar)//TODO 配置库jar包
                artifact(sourcesJar)//TODO 配置库源码jar包
                artifact(javadocJar)//TODO 配置库javadoc jar包
                groupId "com.halohoop"//包名
                artifactId 'javalibraryjarkotlin'//库id
                version '0.0.1'//TODO 设置版本号
            }
        }
    }
    
  5. 执行上传task bintrayUpload
    bintrayUpload这个任务是com.jfrog.bintray插件提供给我们的,只要我们配置好相关的DSL就能够顺利执行这个task。
    为了不让我们的bintray.com账户密码信息暴露在项目的源码中,上文中的bintray DSL中的key属性采用的是动态获取apiKey属性的方式进行取值,因此我们在执行上传task bintrayUpload的时候需要使用-P传递一个apiKey属性参数.
    格式:-Pkey=value
    示例:./gradlew bintrayUpload -PapiKey=你的bintray.com密码或者apikey
    这个apiKey我们在https://bintray.com/profile/edit就能够获取到,如下图:
    2020年最新使用gradle构建、上传并发布jar包/aar包到jcenter方法整理_第1张图片

2. 构建Aar包,并且上传到JCenter;

  • TOC:
    1. 使用IDE Android Studio生成一个Android项目
    1. 添加发布插件;
    1. 定义生成相关产物的Gradle Tasks;
    1. 配置相关参数;
    1. 执行上传task bintrayUpload

  1. 使用IDE Android Studio生成一个Android项目
    由于官方已不再支持使用"android"命令行创建一个android工程,因此我们使用Android Studio创建一个Library工程,其中的App module的名称命名为“androidlibrary”
    • 见:https://developer.android.com/studio/tools/help/android
    已删去了不必要的文件
    .
    ├── androidlibrary
    │   ├── build.gradle
    │   ├── consumer-rules.pro
    │   ├── libs
    │   ├── proguard-rules.pro
    │   └── src
    │       ├── androidTest
    │       │   └── java
    │       │       └── com
    │       │           └── halohoop
    │       │               └── androidlibraryaarkotlin2
    │       │                   └── ExampleInstrumentedTest.java
    │       ├── main
    │       │   ├── AndroidManifest.xml
    │       │   ├── java
    │       │   │   └── com
    │       │   │       └── halohoop
    │       │   │           └── androidlibraryaarkotlin2
    │       │   │               └── Library.kt
    │       │   └── res
    │       │       └── drawable
    │       └── test
    │           └── java
    │               └── com
    │                   └── halohoop
    │                       └── androidlibraryaarkotlin2
    │                           └── ExampleUnitTest.java
    ├── build.gradle
    ├── gradle
    │   └── wrapper
    │       ├── gradle-wrapper.jar
    │       └── gradle-wrapper.properties
    ├── gradle.properties
    ├── gradlew
    ├── gradlew.bat
    ├── local.properties
    └── settings.gradle
    
  2. 将App Module修改为Library Module
    • 打开文件./androidlibrary/build.gradle
    • 将其中的插件apply plugin: 'com.android.application'修改为apply plugin: 'com.android.library'
    • 删去applicationId:android { defaultConfig { applicationId "xxx.xxxxx.xx" }}
  3. 添加发布插件;
    • 打开文件./build.gradle
      buildscript {
          //省略一些代码
          dependencies {
              //省略一些代码
              classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.5'
          }
      }
      allprojects {
          apply plugin: 'com.jfrog.bintray'
          apply plugin: "maven-publish"
          //也可以将插件apply到相应的module的build.gradle文件中
          //省略一些代码
      }
      
  4. 定义生成相关产物的Gradle Tasks;
    //生成源码jar包task
    task androidSourcesJar(type: Jar) {
        classifier = 'sources'
        from android.sourceSets.main.java.srcDirs
    }
    task androidJavadocs(type: Javadoc) {
        title = "${getStringProperty("mavProjectName")} ${project.version} API"
        description "Generates Javadoc"
        source = android.sourceSets.main.java.srcDirs
        classpath += files(android.bootClasspath)
        android.libraryVariants.all { variant ->
            if (variant.name == 'release') {
                owner.classpath += variant.javaCompileProvider.get().classpath
            }
        }
        exclude '**/R.html', '**/R.*.html', '**/index.html', '**/*.kt'
        options {
            windowTitle("${getStringProperty("mavProjectName")} ${project.version} Reference")
            locale = 'en_US'
            encoding = 'UTF-8'
            charSet = 'UTF-8'
            links("http://docs.oracle.com/javase/7/docs/api/")
            linksOffline("http://d.android.com/reference", "${android.sdkDirectory}/docs/reference")
            setMemberLevel(JavadocMemberLevel.PUBLIC)
        }
    }
    //生成javadoc jar包task
    task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
        classifier = 'javadoc'
        from androidJavadocs.destinationDir
    }
    
  5. 配置相关参数;
    //这里仅仅列出差异部分,其他部分可以参考1.4
    
    //省略一些代码
    
    publishing {
        publications {
            MyPublication(MavenPublication) {
                //标准开源库,以下都三个文件是标配
                artifact(bundleReleaseAar)//TODO 配置库aar包
                artifact(androidSourcesJar)//TODO 配置库源码jar包
                artifact(androidJavadocsJar)//TODO 配置库javadoc jar包
                //省略一些代码
            }
        }
    }
    
  6. 执行上传task bintrayUpload(参考1.5)

3. 跳过1和2,直接使用打包封装好的上传发布插件,省去较为繁琐的配置;

  1. 引入bintray插件;
    • Java/Kotlin工程;
      // rootProject/build.gradle
      plugins {
          //省略一些代码...
          id 'com.jfrog.bintray' version '1.8.5'
      }
      
    • Android工程;
      // rootProject/build.gradle
      buildscript {
          //省略一些代码
          dependencies {
              //省略一些代码
              classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.5'
          }
      }
      allprojects {
          apply plugin: 'com.jfrog.bintray'
          //也可以将插件apply到相应的module的build.gradle文件中
          //省略一些代码
      }
      
  2. 引入打包封装好的上传发布插件;
    //java工程:rootProject/build.gradle
    //android工程:rootProject/module/build.gradle
    apply from: "https://cdn.jsdelivr.net/gh/halohoop/cdn@latest/utils/gradle/bintrayIntegrated.gradle"
    
  3. 定义属性参数
    各个属性的意义可以通过名称命名去体现;
    //java工程:rootProject/build.gradle
    //android工程:rootProject/module/build.gradle
    project.ext {
        bintrayUser = "halohoop"
        groupId = "com.halohoop"
        artifactId = project.name
        version = "0.0.3"
        javadocDir = "src/main/java"
        sourceDir = "src"
        bintrayOverride = true
        bintrayPublish = true
        bintrayPkgRepo = "maven"
        bintrayPkgName = project.name
        bintrayPkgUserOrg = project.ext.bintrayUser
        bintrayPkgLicenses = ['Apache-2.0']
        bintrayPkgVcsUrl = "github.com/${project.ext.bintrayUser}/${project.ext.bintrayPkgName}.git"
        bintrayPkgIssueTrackerUrl = "github.com/${project.ext.bintrayUser}/${project.ext.bintrayPkgName}/issue"
        bintrayPkgVersionDesc = "${project.ext.bintrayPkgName} ${project.ext.version} final"
        bintrayPkgVersionReleased = new Date()
    }
    

个人水平有限,欢迎读者勘误。

References

  1. Creating New Gradle Builds
  2. https://github.com/sky-uk/gradle-maven-plugin
  3. https://developer.android.com/studio/build/maven-publish-plugin

原文链接:http://halohoop.com/2020/03/05/meals-2020publish2jcenter/

你可能感兴趣的:(Android)