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

声明:博文未经授权一律不允转载

下文中的所有操作基于的环境为:
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命令帮我们生成一个项目;
    1
    2
    3
    4
    5
    6
    mkdir 2020jcenterpublish
    cd 2020jcenterpublish
    mkdir javaLibraryJarKotlin
    cd javaLibraryJarKotlin
    gradle init
    # 选择library ->..-> Kotlin项目(也可以选择Java)
这个时候在javaLibraryJarKotlin文件夹下,我们就得到了一个Gradle为我们生成的一个项目。
目录树如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
.
├── 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。
  1. 添加发布插件;

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // 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'
    }
  3. 配置相关参数;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    // 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 设置版本号
    }
    }
    }
  4. 执行上传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就能够获取到,如下图:
    apikey

    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
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      已删去了不必要的文件
      .
      ├── 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
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      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;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    //生成源码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
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    //这里仅仅列出差异部分,其他部分可以参考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,直接使用打包封装好的上传发布插件,省去较为繁琐的配置;

  7. 引入bintray插件;

    • Java/Kotlin工程;

      1
      2
      3
      4
      5
      // rootProject/build.gradle
      plugins {
      //省略一些代码...
      id 'com.jfrog.bintray' version '1.8.5'
      }
    • Android工程;

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      // 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文件中
      //省略一些代码
      }
  8. 引入打包封装好的上传发布插件;

    1
    2
    3
    //java工程:rootProject/build.gradle
    //android工程:rootProject/module/build.gradle
    apply from: "https://cdn.jsdelivr.net/gh/halohoop/cdn@latest/utils/gradle/bintrayIntegrated.gradle"
  9. 定义属性参数
    各个属性的意义可以通过名称命名去体现;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    //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()
    }

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

文章作者: Halohoop
文章链接: http://halohoop.com/2020/03/05/meals-2020publish2jcenter/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 卖牙膏的芖口钉