Blog icon indicating copy to clipboard operation
Blog copied to clipboard

上传Jar到JCenter

Open RWebRTC opened this issue 8 years ago • 0 comments

前言

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。

issues16-1

此时类库算构建完成,实际上相当于创建了一个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,使用起来没差别)。

jCenterbintray.com维护,在这里可以查询,例如:查询rlib,在项目build.gradle中使用"jcenter()"。也是默认使用的。

关于Maven Center和jCenter的差别对比可以参考这里

注册JFrog Bintray

上传到jCente需要注册JFrog Bintray,选择Maven进入,Add New Package,填写必要信息,创建包。

上传到Bintray

有了仓库,该往上上传Library了。在Android Studio中进行配置。

  1. 配置项目下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
}
  1. 配置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时弹出框设置的密码
  1. 上传

有仓库配置结束了,该上传了。Terminal(终端)进入项目目录,执行,参考这里

// 生成Bintray文件
./gradlew install
// 上传
./gradlew bintrayUpload

进入Bintray可以发现上传成功了。

issues16-2

  1. 上传到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.

  1. 注册Sonatype。登陆后在JIRA中创建issue,参考这里
  2. 等待审核。
  3. 等待过程中,使用gpg创建asc文件并上传。asc文件是Maven Center需要但是JCenter不需要的。
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中

issues16-4

issues16-5

  1. 审核成功

issues16-6

  1. 从jCenter同步到Maven Center。

获取token,点击用户->Profile->User Token->获取到token。

issues16-3

<server>
  <id>${server}</id>
  <username>User token key</username>
  <password>User token password</password>
</server>

issues16-7

  1. 同步,结束。

别忘了给issues一个comments。

然后可以在Maven Center中找到了。

问题记录

  1. Android Studio配置出错,Sync Now不成功,参见上文,官网查看版本关系。
  2. jCenter中没有asc文件时,同步到Maven Center不成功。
  3. build.gradle中没有description时,同步到Maven Center不成功。
  4. User token key和User token password开始时不知道是什么东西,错误的使用用户名,不成功。

RWebRTC avatar Nov 24 '16 07:11 RWebRTC