文章目录

  • 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命令生成项目
  2. 添加发布插件;
  3. 定义生成相关产物的Gradle Tasks;
  4. 配置相关参数;
  5. 执行上传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。

  1. 添加发布插件;
// rootProject/build.gradle
plugins {
    //省略一些代码...
    id 'com.jfrog.bintray' version '1.8.5'
    id 'maven-publish'
}
  1. 定义生成相关产物的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'
}
  1. 配置相关参数;
// 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 设置版本号
        }
    }
}
  1. 执行上传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就能够获取到,如下图:
  2. Android stu kotlin 版本过高打包不成功问题_java

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

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

  1. 使用IDE Android Studio生成一个Android项目
    由于官方已不再支持使用"android"命令行创建一个android工程,因此我们使用Android Studio创建一个Library工程,其中的App module的名称命名为“androidlibrary”
已删去了不必要的文件
.
├── 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
  1. 将App Module修改为Library Module
  • 打开文件./androidlibrary/build.gradle
  • 将其中的插件apply plugin: 'com.android.application'修改为apply plugin: 'com.android.library'
  • 删去applicationId:android { defaultConfig { applicationId "xxx.xxxxx.xx" }}
  1. 添加发布插件;
  • 打开文件./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文件中
    //省略一些代码
}
  1. 定义生成相关产物的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
}
  1. 配置相关参数;
//这里仅仅列出差异部分,其他部分可以参考1.4

//省略一些代码

publishing {
    publications {
        MyPublication(MavenPublication) {
            //标准开源库,以下都三个文件是标配
            artifact(bundleReleaseAar)//TODO 配置库aar包
            artifact(androidSourcesJar)//TODO 配置库源码jar包
            artifact(androidJavadocsJar)//TODO 配置库javadoc jar包
            //省略一些代码
        }
    }
}
  1. 执行上传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文件中
    //省略一些代码
}
  1. 引入打包封装好的上传发布插件;
//java工程:rootProject/build.gradle
//android工程:rootProject/module/build.gradle
apply from: "https://cdn.jsdelivr.net/gh/halohoop/cdn@latest/utils/gradle/bintrayIntegrated.gradle"
  1. 定义属性参数
    各个属性的意义可以通过名称命名去体现;
//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()
}

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

  • Wechat: halohoop
  • E-mail: halohoopwong@gmail.com

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