Blog
Blog copied to clipboard
上传Jar到JCenter
前言
Android Studio采用gradle管理jar包,很方便,易于管理,同时避免了多个位置重复存放Jar包的问题。本文记录使用Android Studio将Jar上传到JCenter的过程及遇到的问题和解决办法。
示例项目
rlib,在这里你可以看到必要的配置信息。
构建lib项目
创建普通Android项目,创建一个Android Lib。
创建项目过程略,在项目上右键点击->Open Module Setting(F12)->New Module(右上角小加号,Alt+Insert)->Android Library(然后点击Next)->填写信息(Application/Library Name: Rlib, Module Name: rlib, Package name: cn.renyuzhuo.rlib,可以更改)->点击Finish,点击OK。可以在项目中看见多出来一个module。
此时类库算构建完成,实际上相当于创建了一个rlib文件夹,里面包含lib文件。同时在项目settings.gradle中添加了", ':rlib'",修改".idea/modules.xml"文件添加了:
<module fileurl="file://$PROJECT_DIR$/rlib/rlib.iml" filepath="$PROJECT_DIR$/rlib/rlib.iml" />
本地直接使用该module
本项目可以直接使用这个module,在app项目build.gradle中添加"compile project(':rlib')",此时可以使用其中类及方法:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:24.1.1'
compile project(':rlib')
}
准备上传
如果本地使用,这些设置就够了,但是如果需要上传到jCenter中,这还远远不够。接下来,将这个module上传到jCenter中。
Android Studio以前默认的中央仓库是Maven Central,由sonatype.org维护,在这里可以查询,例如:查询rlib,在项目build.gradle中使用"mavenCentral()"。但是它太难用了,需要更多的操作,因此,后来Android Studio将默认仓库设置为了jCenter,它更好用(对于上传Library,使用起来没差别)。
jCenter由bintray.com维护,在这里可以查询,例如:查询rlib,在项目build.gradle中使用"jcenter()"。也是默认使用的。
关于Maven Center和jCenter的差别对比可以参考这里
注册JFrog Bintray
上传到jCente需要注册JFrog Bintray,选择Maven进入,Add New Package,填写必要信息,创建包。
上传到Bintray
有了仓库,该往上上传Library了。在Android Studio中进行配置。
- 配置项目下build.gradle,这里
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.0'
// 注意这里,如果版本不匹配,Sync Now会报错,各种奇怪的错误,
// 可以参考:https://goo.gl/6WNu4b,官网查找最新/合适版本
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
// 可以参考:https://goo.gl/TfKKgA,官网查找最新/合适版本
classpath "com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.1"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
- 配置module下build.gradle,这里
apply plugin: 'com.android.library'
// 添加插件
apply plugin: 'com.github.dcendents.android-maven'
apply plugin: 'com.jfrog.bintray'
// 定义变量
version = "0.0.1"
def siteUrl = 'https://github.com/RWebRTC/rlib'
def gitUrl = 'https://github.com/RWebRTC/rlib.git'
group = "cn.renyuzhuo.rlib"
android {
compileSdkVersion 24
buildToolsVersion "24.0.1"
// 这里添加了一行
resourcePrefix "rlib"
defaultConfig {
minSdkVersion 15
targetSdkVersion 24
versionCode 1
versionName version
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:24.1.1'
}
// 重点来了,下面都是
install {
repositories.mavenInstaller {
pom {
project {
packaging 'aar'
name 'rlib' //项目名称
description 'A Simple Android Lib.' // 项目描述
url siteUrl
licenses {
license {
name 'MIT'
url 'https://github.com/RWebRTC/rlib/LICENSE'
}
}
developers {
developer {
id 'RWebRTC' //填写的一些基本信息
name 'rwebrtc'
email '[email protected]'
}
}
scm {
connection gitUrl
developerConnection gitUrl
url siteUrl
}
}
}
}
}
// 生成jar/aar包并上传
task sourcesJar(type: Jar) {
from android.sourceSets.main.java.srcDirs
classifier = 'sources'
}
task javadoc(type: Javadoc) {
source = android.sourceSets.main.java.srcDirs
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
options.encoding = "utf-8"
options.charSet = "utf-8"
}
task javadocJar(type: Jar, dependsOn: javadoc) {
classifier = 'javadoc'
from javadoc.destinationDir
}
artifacts {
archives javadocJar
archives sourcesJar
}
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
bintray {
user = properties.getProperty("bintray.user")
key = properties.getProperty("bintray.apikey")
configurations = ['archives']
pkg {
repo = "maven"
name = "rlib" //发布到JCenter上的项目名字
websiteUrl = siteUrl
vcsUrl = gitUrl
licenses = ["MIT"]
publish = true
// 下面几行在上传到Maven Center时是必须的,参见本文最后gpg相关部分。
// gpg.password是执行gpg --gen-key时弹出框要求输入的密码
version {
gpg {
sign = true
passphrase = properties.getProperty("bintray.gpg.password")
}
}
}
}
其中,上面的properties.getProperty是读项目目录下local.properties文件中的定义的变量,包含用户名和apikey,gpg.password(这一个后面说是什么)。local.properties文件类似于这样:
ndk.dir=/home/×××××××/Android/Sdk/ndk-bundle
sdk.dir=/home/×××××××/Android/Sdk
bintray.user=××××××××× # bintray的用户名
bintray.apikey=××××××××××××××××××××××××××××× # 在https://goo.gl/smxnNR点击API Key可以查看
bintray.gpg.password=××××××× # 执行gpg --gen-key时弹出框设置的密码
- 上传
有仓库配置结束了,该上传了。Terminal(终端)进入项目目录,执行,参考这里:
// 生成Bintray文件
./gradlew install
// 上传
./gradlew bintrayUpload
进入Bintray可以发现上传成功了。
- 上传到jCenter
此时,你将Library上传到私人仓库了,别人可以通过URL使用,但是那不方便,需要将其上传到jCenter。网页上进入项目,点击Add to JCenter,Send。然后需要管理员审核,一般一两个小时,审核结束会发送邮件。然后,可以使用了。
compile 'cn.renyuzhuo.rlib:rlib:0.0.1'
后续
到这里,应该说已经达到上传到jCenter的目的了。
后续就是同时将其上传到Maven Center中。通过jCenter直接同步到Maven Center。
参考这里。
You need to create an account in Sonatype JIRA. Those will be your https://oss.sonatype.org (and Maven Central) username and password. Then you need to create a new issue to set your permissions right. Once done, you'll be able to login with the credentials to https://oss.sonatype.org and get the user token needed for Bintray from the user account management there.
gpg --version # 查看gpg版本号
gpg --gen-key # 生成gen-key
您需要一个用户标识来辨识您的密钥;本软件会用真实姓名、注释和电子邮件地址组合
成用户标识,如下所示:
“Heinrich Heine (Der Dichter) <[email protected]>”
真实姓名: RWebRTC
电子邮件地址: [email protected]
注释: RWebRTC
您选定了这个用户标识:
“RWebRTC (RWebRTC) <[email protected]>”
更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)? O
您需要一个密码来保护您的私钥。
我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动
鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。
随机字节不够多。请再做一些其他的琐事,以使操作系统能搜集到更多的熵!
(还需要189字节)
sudo apt-get install gnupg2 # 安装gpg2
gpg2 --list-keys
gpg2 --list-secret-keys
gpg2 --keyserver hkp://pool.sks-keyservers.net --send-keys B861C367
# 参考下图,下图为网络图片,原图在:https://goo.gl/Pt3hbD
gpg --armor --export [email protected] > mykey-public.asc
gpg --armor --export-secret-keys [email protected] > mykey-private.asc
# 分别将内容添加到GPG Signing中
- 审核成功
- 从jCenter同步到Maven Center。
获取token,点击用户->Profile->User Token->获取到token。
<server>
<id>${server}</id>
<username>User token key</username>
<password>User token password</password>
</server>
- 同步,结束。
别忘了给issues一个comments。
然后可以在Maven Center中找到了。
问题记录
- Android Studio配置出错,Sync Now不成功,参见上文,官网查看版本关系。
- jCenter中没有asc文件时,同步到Maven Center不成功。
- build.gradle中没有description时,同步到Maven Center不成功。
- User token key和User token password开始时不知道是什么东西,错误的使用用户名,不成功。