原文链接:http://halohoop.com/2020/03/05/meals-2020publish2jcenter/
下文中的所有操作基于的环境为:
MacOS v10.15.3 + Java v1.8 + Gradle v6.4 + Kotlin v1.3.41 + Android SDK
假设你已经具备以上环境;
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就能够获取到,如下图:
task bintrayUpload
已删去了不必要的文件
.
├── 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
./androidlibrary/build.gradle
apply plugin: 'com.android.application'
修改为apply plugin: 'com.android.library'
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文件中
//省略一些代码
}
//生成源码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)// rootProject/build.gradle
plugins {
//省略一些代码...
id 'com.jfrog.bintray' version '1.8.5'
}
// 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工程:rootProject/build.gradle
//android工程:rootProject/module/build.gradle
apply from: "https://cdn.jsdelivr.net/gh/halohoop/cdn@latest/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()
}
个人水平有限,欢迎读者勘误。
原文链接:http://halohoop.com/2020/03/05/meals-2020publish2jcenter/