声明:博文未经授权一律不允转载
下文中的所有操作基于的环境为:
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命令帮我们生成一个项目;123456mkdir 2020jcenterpublishcd 2020jcenterpublishmkdir javaLibraryJarKotlincd javaLibraryJarKotlingradle init选择library ->..-> Kotlin项目(也可以选择Java)
这个时候在javaLibraryJarKotlin文件夹下,我们就得到了一个Gradle为我们生成的一个项目。
目录树如下:
12345678910111213141516171819202122232425
.├── 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 └── resources15 directories, 8 files
我们在这个工程的基础上再进行各种功能的迭代完善,现在假设这个就是我们最终编码完成的工程,我们要将其打包发布到JCenter。
添加发布插件;
123456// rootProject/build.gradleplugins {//省略一些代码...id 'com.jfrog.bintray' version '1.8.5'id 'maven-publish'}定义生成相关产物的Gradle Tasks;
1234567891011// rootProject/build.gradle//生成源码jar包tasktask sourcesJar(type: Jar) {from sourceSets.main.allJavaarchiveClassifier = 'sources'}//生成javadoc jar包tasktask javadocJar(type: Jar) {from javadocarchiveClassifier = 'javadoc'}配置相关参数;
12345678910111213141516171819202122232425262728293031323334353637// rootProject/build.gradlebintray {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'//库idversion '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”- 见:https://developer.android.com/studio/tools/help/android123456789101112131415161718192021222324252627282930313233343536373839已删去了不必要的文件.├── 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
- 见:https://developer.android.com/studio/tools/help/android
将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
12345678910111213buildscript {//省略一些代码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;
12345678910111213141516171819202122232425262728293031//生成源码jar包tasktask 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.srcDirsclasspath += 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包tasktask androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {classifier = 'javadoc'from androidJavadocs.destinationDir}配置相关参数;
123456789101112131415//这里仅仅列出差异部分,其他部分可以参考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工程;
12345// rootProject/build.gradleplugins {//省略一些代码...id 'com.jfrog.bintray' version '1.8.5'}Android工程;
12345678910111213// rootProject/build.gradlebuildscript {//省略一些代码dependencies {//省略一些代码classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.5'}}allprojects {apply plugin: 'com.jfrog.bintray'//也可以将插件apply到相应的module的build.gradle文件中//省略一些代码}
引入打包封装好的上传发布插件;
123//java工程:rootProject/build.gradle//android工程:rootProject/module/build.gradleapply from: "https://cdn.jsdelivr.net/gh/halohoop/cdn@latest/utils/gradle/bintrayIntegrated.gradle"定义属性参数
各个属性的意义可以通过名称命名去体现;1234567891011121314151617181920//java工程:rootProject/build.gradle//android工程:rootProject/module/build.gradleproject.ext {bintrayUser = "halohoop"groupId = "com.halohoop"artifactId = project.nameversion = "0.0.3"javadocDir = "src/main/java"sourceDir = "src"bintrayOverride = truebintrayPublish = truebintrayPkgRepo = "maven"bintrayPkgName = project.namebintrayPkgUserOrg = project.ext.bintrayUserbintrayPkgLicenses = ['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