2020年最新使用gradle构建、上传并发布jar包/aar包到jcenter方法整理
原文链接:http://halohoop.com/2020/03/05/meals-2020publish2jcenter/
文章目录
下文中的所有操作基于的环境为:MacOS v10.15.3 + Java v1.8 + Gradle v6.4 + Kotlin v1.3.41 + Android SDK
假设你已经具备以上环境;
1. 构建Jar包,并且上传到JCenter;
- TOC:
-
- gradle命令生成项目
-
- 添加发布插件;
-
- 定义生成相关产物的Gradle Tasks;
-
- 配置相关参数;
-
- 执行上传
task bintrayUpload
- 执行上传
-
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。
-
添加发布插件;
// rootProject/build.gradle plugins { //省略一些代码... id 'com.jfrog.bintray' version '1.8.5' id 'maven-publish' }
-
定义生成相关产物的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' }
-
配置相关参数;
// 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 设置版本号 } } }
-
执行上传
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. 构建Aar包,并且上传到JCenter;
- TOC:
-
- 使用IDE Android Studio生成一个Android项目
-
- 添加发布插件;
-
- 定义生成相关产物的Gradle Tasks;
-
- 配置相关参数;
-
- 执行上传
task bintrayUpload
- 执行上传
- 使用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
- 将App Module修改为Library Module
- 打开文件
./androidlibrary/build.gradle
- 将其中的插件
apply plugin: 'com.android.application'
修改为apply plugin: 'com.android.library'
- 删去applicationId:
android { defaultConfig { applicationId "xxx.xxxxx.xx" }}
- 打开文件
- 添加发布插件;
- 打开文件
./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文件中 //省略一些代码 }
- 打开文件
- 定义生成相关产物的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.4 //省略一些代码 publishing { publications { MyPublication(MavenPublication) { //标准开源库,以下都三个文件是标配 artifact(bundleReleaseAar)//TODO 配置库aar包 artifact(androidSourcesJar)//TODO 配置库源码jar包 artifact(androidJavadocsJar)//TODO 配置库javadoc jar包 //省略一些代码 } } }
- 执行上传
task bintrayUpload
(参考1.5)
3. 跳过1和2,直接使用打包封装好的上传发布插件,省去较为繁琐的配置;
- 引入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文件中 //省略一些代码 }
- Java/Kotlin工程;
- 引入打包封装好的上传发布插件;
//java工程:rootProject/build.gradle //android工程:rootProject/module/build.gradle apply from: "https://cdn.jsdelivr.net/gh/halohoop/aaa@qq.com/utils/gradle/bintrayIntegrated.gradle"
- 定义属性参数
各个属性的意义可以通过名称命名去体现;//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: [email protected]
References
- Creating New Gradle Builds
- https://github.com/sky-uk/gradle-maven-plugin
- https://developer.android.com/studio/build/maven-publish-plugin
原文链接:http://halohoop.com/2020/03/05/meals-2020publish2jcenter/