发布成功了,但staging dirrepositories 没有

自使用maven以来,没少使用maven中央仓库中的各种jar包,方便有效,但是咱们也不能总是只取不予,也应该懂得奉献,当你写好了一个十分好用的jar包,想贡献出去给大家使用的时候,应该怎么做呢?当然是发布到maven的中央仓库了,不过要说这个发布过程,还真是比较复杂,本文就来详细说下如何发布jar包到maven中央仓库。&开始之前,请注意几个地址:&1、工单管理:
说明:注册账号、创建和管理issue,Jar包的发布是以解决issue的方式起步的
2、构件仓库:
说明:算是正式发布前的一个过段仓库,使用maven提交后的jar包先到这个库中
1、创建工单
在上述的工单管理的地址中进行创建,如果没有账号,需要先注册一个,记住用户名密码,后边要配置到setting.xml中。&Create Issue 填写内容说明:&
===Step 1===
Project:Community Support - Open Source Project Repository Hosting
Issue Type:New Project
===Step 2===
Summary:JAR包名称,如:marathon-client
Group Id:你懂得,不用多说,如com.cloudnil
Project URL:项目站点,如:https:
其他内容不用填写,创建Issue后需要等待一小段时间,Sonatype的工作人员审核处理,速度还是很快的,一般一个工作日以内,当Issue的Status变为RESOLVED后,就可以进行下一步操作了,否则,就等待&&
2、配置Maven
在工程的pom.xml文件中,引入Sonatype官方的一个通用配置oss-parent,这样做的好处是很多pom.xml的发布配置不需要自己配置了:
并增加Licenses、SCM、Developers信息:
修改maven配置文件setting.xml,在servers中增加server配置,找不到这个文件的同学请自己去旁边哭会先。
3、配置gpg-key
如果是使用的windows,可以下载gpg4win,地址:https://www.gpg4win.org/download.html,安装后在命令行中执行&gpg --gen-key生成,过程中需要填写名字、邮箱等,其他步骤可以使用默认值,不过有个叫:Passphase的参数需要记住,这个相当于是是密钥的密码,下一步发布过程中进行签名操作的时候会用到。&
这步就简单了,就是一套命令:
mvn clean deploy -P sonatype-oss-release -Darguments="gpg.passphrase=密钥密码"
如果使用eclipse的mvn插件发布的话,配置如下:&&如果发布成功,就可以到构件仓库中查看了。
5、Release
进入https://oss.sonatype.org/#stagingRepositories查看发布好的构件,点击左侧的Staging Repositories,一般最后一个就是刚刚发布的jar了,此时的构件状态为open。&打开命令行窗口,查看gpg key并上传到第三方的key验证库:
E:\98_code\workSpace\marathon-client&gpg --list-keys
C:/Users/VF/AppData/Roaming/gnupg/pubring.gpg
---------------------------------------------
2048R/824B4D7A 2016-01-06
[ultimate] cloudnil &cloudnil@126.com&
2048R/7A10AD69 2016-01-06
E:\98_code\workSpace\marathon-client&gpg --keyserver hkp://keyserver.ubuntu.com:11371 --send-keys 824B4D7A
gpg: sending key 824B4D7A to hkp server keyserver.ubuntu.com
E:\98_code\workSpace\marathon-client&
回到https://oss.sonatype.org/#stagingRepositories,选中刚才发布的构件,并点击上方的close&&Confirm,在下边的Activity选项卡中查看状态,当状态变成closed后,执行Release&&Confirm,并在下边的Activity选项卡中查看状态,成功后构件自动删除,一小段时间(约1-2个小时)后即可同步到maven的中央仓库。
http://blog.csdn.net/tiger435/article/details/
/archives/1807.html
SCM Implementation: Git
General Info
License: GNU General Public License v2
For all URLs below, we use a colon (:) as separator. If you use a colon for one of the variables (e.g. a windows path), then use a pipe (|) as separator. The separator for the port has to be a colon in any case since this part is specified in the git URL specification. See man git-fetch.
scm:git:git://server_name[:port]/path_to_repository
scm:git:http://server_name[:port]/path_to_repository
scm:git:https://server_name[:port]/path_to_repository
scm:git:ssh://server_name[:port]/path_to_repository
scm:git:file://[hostname]/path_to_repository
scm:git:git:///path_to_repository
scm:git:/path_to_repository
scm:git:/path_to_repository
scm:git:ssh:///path_to_repository
scm:git:file://localhost/path_to_repository
Different Fetch and Push URLs
In some cases a different URL has to be used for read and write operations. This can happen if e.g. fetch is performed via the http protocol, but writing to the repository is only possible via ssh. In this case both URLs may be written into the&developerConnection&tag. The fetch URL has to be prefixed with&[fetch=]&and the push URL with&[push=]
&developerConnection&scm:git:[fetch=]http://mywebserver.org/path_to_repository[push=]ssh://username@otherserver:8898/~/repopath.git&/developerConnection&
Working with branches
Since version 1.3, we assume that the name of the branch in the upstream repo is the same as the name of the current local branch. So whenever you invoke a maven-scm action which has to access the upstream repository, e.g. start a release, you should be on that very branch.
In other words: If no branch is specified manually, every git-fetch, git-pull, git-push, etc will always work on the branch in the upstream repository which has the same branch name as your current local branch
git push pushUrl currentBranch:currentBranch
Provider Configuration
The provider configuration is defined in&$user.home/.scm/git-settings.xml.
&git-settings&
&!-- will had the option --no-verify to the commit command can be helpfull to ignore trailing spaces issues with cygwin and the release plugin --&
&commitNoVerify&false&/commitNoVerify&
&/git-settings&
http://maven.apache.org/scm/git.html
阅读(...) 评论()Android Studio使用Gradle上传AAR至Maven - 推酷
Android Studio使用Gradle上传AAR至Maven
这几天有个开源library要上传到Maven Central Repository,找到某大神的博客,他用
上传的库,我依葫芦画瓢搞了两天,卧槽,可能是人品问题,mvn一直报一个莫名其妙的异常,Google了半天完全没有头绪,恨死那个Windows的黑框框了。
后来从国外某大神的开源project那学到到可以用
来上传AAR到maven central repository,终于可以和那个坑爹的黑框框说good bye了- -
前期我们要做一些准备工作,包括:
注册Sonatype帐号
创建一个JIRA ticket
注册帐号,注册好之后打开
创建一个JIRA ticket,一个JIRA ticket对应一个项目。
其中Summary填写项目名,例如AndroidTagGroup;Description填写项目描述;Group Id必须是项目包名的父级,比如我的包名为me.gujun.android.taggroup,那么为了我所有的项目都可以发布,Group Id填写为me.gujun。
其它按照提示填写,完成后大概两个工作日左右,该issue会变成 RESOLVED 状态,表示可用,在可用前除了最后一步正式发布之外,其它都可以正常进行。
使用GnuPG生成密钥
发布release版本时需要对上传的文件加密和签名,GPG用于生成签名,管理密钥。
上传前我们需要做两件事:
生成密钥对
下载地址:
安装之后验证一下
$ gpg --version
gpg (GnuPG) 2.0.26 (Gpg4win 2.2.3)
libgcrypt 1.6.2
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later &http://gnu.org/licenses/gpl.html&
$ gpg --gen-key
除了姓名、邮箱、备注外其它都可以使用默认设置,最后需要输入一个passphrase,妥善保管这个口令,后面配置Gradle脚本时需要用到。
查看公钥:
$ gpg --list-keys
C:/Users/PingGe/AppData/Roaming/gnupg/pubring.gpg
-------------------------------------------------
2048R/F874D485
[ultimate] JunGu (Sonatype) &&
2048R/F5-02-10
输出的路径为公钥文件,F874D485为keyId,需要上传给服务器。
查看私钥:
$ gpg --list-secret-keys
C:/Users/PingGe/AppData/Roaming/gnupg/secring.gpg
-------------------------------------------------
2048R/F874D485
JunGu (Sonatype) &&
2048R/F5-02-10
私钥文件路径在配置Gradle脚本时需要用到。
$ gpg --keyserver hkp://pool.sks-keyservers.net --send-keys F874D485
gpg: sending key F874D485 to hkp server pool.sks-keyserver.net
把之前生成的公钥上传至服务器,系统需要你上传的公钥来验证发布时的文件。
F874D485为之前生成的公钥的keyId,一旦提交至一个key server,公钥会自动同步到其它key server。
配置Gradle脚本
Gradle脚本使用了开源项目
,Thx Chris大神!
添加maven-push.gradle
把下面的脚本复制到工程目录,新建文件maven-push.gradle。
* Copyright 2013 Chris Banes
* Licensed under the Apache License, Version 2.0 (the &License&);
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an &AS IS& BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
apply plugin: 'maven'
apply plugin: 'signing'
def isReleaseBuild() {
return VERSION_NAME.contains(&SNAPSHOT&) == false
def getReleaseRepositoryUrl() {
return hasProperty('RELEASE_REPOSITORY_URL') ? RELEASE_REPOSITORY_URL
: &https://oss.sonatype.org/service/local/staging/deploy/maven2/&
def getSnapshotRepositoryUrl() {
return hasProperty('SNAPSHOT_REPOSITORY_URL') ? SNAPSHOT_REPOSITORY_URL
: &https://oss.sonatype.org/content/repositories/snapshots/&
def getRepositoryUsername() {
return hasProperty('NEXUS_USERNAME') ? NEXUS_USERNAME : &&
def getRepositoryPassword() {
return hasProperty('NEXUS_PASSWORD') ? NEXUS_PASSWORD : &&
afterEvaluate { project -&
uploadArchives {
repositories {
mavenDeployer {
beforeDeployment { MavenDeployment deployment -& signing.signPom(deployment) }
pom.groupId = GROUP
pom.artifactId = POM_ARTIFACT_ID
pom.version = VERSION_NAME
repository(url: getReleaseRepositoryUrl()) {
authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
snapshotRepository(url: getSnapshotRepositoryUrl()) {
authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
pom.project {
name POM_NAME
packaging POM_PACKAGING
description POM_DESCRIPTION
url POM_URL
url POM_SCM_URL
connection POM_SCM_CONNECTION
developerConnection POM_SCM_DEV_CONNECTION
licenses {
name POM_LICENCE_NAME
url POM_LICENCE_URL
distribution POM_LICENCE_DIST
developers {
developer {
id POM_DEVELOPER_ID
name POM_DEVELOPER_NAME
required { isReleaseBuild() && gradle.taskGraph.hasTask(&uploadArchives&) }
sign configurations.archives
task apklib(type: Zip){
appendix = extension = 'apklib'
from 'AndroidManifest.xml'
into('res') {
from 'res'
into('src') {
from 'src'
task androidJavadocs(type: Javadoc) {
source = android.sourceSets.main.java.srcDirs
classpath += project.files(android.getBootClasspath() .join(File.pathSeparator))
task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
classifier = 'javadoc'
from androidJavadocs.destinationDir
task androidSourcesJar(type: Jar) {
classifier = 'sources'
from android.sourceSets.main.java.srcDirs
artifacts {
archives androidSourcesJar
archives androidJavadocsJar
archives apklib
配置Project属性
在工程目录下的gradle.properties文件中设置属性,把属性修改成自己的。
VERSION_NAME=1.0
VERSION_CODE=1
GROUP=me.gujun.android.taggroup
POM_DESCRIPTION=Android Library to display a set of tags
POM_URL=https:///2dxgujun/AndroidTagGroup
POM_SCM_URL=https:///2dxgujun/AndroidTagGroup
POM_SCM_CONNECTION=scm:https:///2dxgujun/AndroidTagGroup.git
POM_SCM_DEV_CONNECTION=scm:https:///2dxgujun/AndroidTagGroup.git
POM_LICENCE_NAME=The Apache Software License, Version 2.0
POM_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt
POM_LICENCE_DIST=repo
POM_DEVELOPER_ID=2dxgujun
POM_DEVELOPER_NAME=Jun Gu
SNAPSHOT_REPOSITORY_URL=https://oss.sonatype.org/content/repositories/snapshots
RELEASE_REPOSITORY_URL=https://oss.sonatype.org/service/local/staging/deploy/maven2
注意:VERSION_NAME后面加-SNAPSHOT表示发布的是版本快照。
GROUP设置成项目包名,注意,父级要和之前创建JIRA ticket时的Group Id一致。
配置Project构建脚本
之后修改工程目录下的build.gradle:
buildscript {
repositories {
dependencies {
classpath 'com.android.tools.build:gradle:1.0.1'
allprojects {
version = VERSION_NAME
group = GROUP
repositories {
配置Module属性
工程配置好之后,我们还需要给上传的Module配置(我们的工程中可能有多个Module需要上传到仓库中,要给每个Module添加配置)
给需要上传到Maven仓库的Module提供一个gradle.properties文件:
POM_NAME=Android TagGroup Library
POM_ARTIFACT_ID=library
POM_PACKAGING=aar
POM ARTIFACT ID设置成Module名。
这个组件对应的依赖已经浮出水面了:GROUP:POM ARTIFACT ID:VERSION_NAME
me.gujun.android.taggroup:library:1.0
配置Module构建脚本
修改Module目录的build.gradle,在最后加上:
apply from: '../maven-push.gradle'
配置全局属性
这个全局的Gradle配置文件默认在 USER_HOME/.gradle/gradle.properties ,没有的话可以新建一个。
在这里配置Maven服务器的用户名和密码,还需要配置之前生成的keyId, password和一个secretKeyRingFile,这个文件用来在上传release版本时对文件进行签名。
NEXUS_USERNAME=2dxgujun
NEXUS_PASSWORD=123456
signing.keyId=F874D485
signing.password=123456
signing.secretKeyRingFile=C:/Users/PingGe/AppData/Roaming/gnupg/secring.gpg
Windows的secretKeyRingFile路径如上所示,其它系统可以使用 gpg --list-secret-keys 命令查看。
部署release版本
所有的配置已经完成,现在可以上传了,在Android Studio的Terminal输入命令:
gradle uploadArchives
如果上传成功,最后你会看到控制台打印类似的信息:
Uploading: me/gujun/android/taggroup/library/1.0/library-1.0.aar to repository remote at https://oss.sonatype.org/service/local/staging/deploy/maven2
Transferring 19K from remote
Uploaded 19K
Uploading: me/gujun/android/taggroup/library/1.0/library-1.0.aar.asc to repository remote at https://oss.sonatype.org/service/local/staging/deploy/maven2
Transferring 0K from remote
Uploaded 0K
Uploading: me/gujun/android/taggroup/library/1.0/library-1.0-sources.jar to repository remote at https://oss.sonatype.org/service/local/staging/deploy/maven2
Transferring 7K from remote
Uploaded 7K
Uploading: me/gujun/android/taggroup/library/1.0/library-1.0-sources.jar.asc to repository remote at https://oss.sonatype.org/service/local/staging/deploy/maven2
Transferring 0K from remote
Uploaded 0K
Uploading: me/gujun/android/taggroup/library/1.0/library-1.0.apklib to repository remote at https://oss.sonatype.org/service/local/staging/deploy/maven2
Transferring 11K from remote
Uploaded 11K
Uploading: me/gujun/android/taggroup/library/1.0/library-1.0.apklib.asc to repository remote at https://oss.sonatype.org/service/local/staging/deploy/maven2
Transferring 0K from remote
Uploaded 0K
Uploading: me/gujun/android/taggroup/library/1.0/library-1.0-javadoc.jar to repository remote at https://oss.sonatype.org/service/local/staging/deploy/maven2
Transferring 34K from remote
Uploaded 34K
Uploading: me/gujun/android/taggroup/library/1.0/library-1.0-javadoc.jar.asc to repository remote at https://oss.sonatype.org/service/local/staging/deploy/maven2
Transferring 0K from remote
Uploaded 0K
Uploading: me/gujun/android/taggroup/library/1.0/library-1.0.pom.asc to repository remote at https://oss.sonatype.org/service/local/staging/deploy/maven2
Transferring 0K from remote
Uploaded 0K
上传成功后,打开
登录,选择左侧 Build Promotion 菜单中的 Staging Repositories 选项,在出现的选项卡右上角的搜索框输入关键字,筛选出你上传的组件所在的repository。
部署时创建的repository会根据部署项目的groupId来命名,例如我的groupId为me.gujun,那么我的repository即为megujun-xxxx,后面的xxxx为4个数字,初次部署为1000,后面每次部署这个数字都会+1。选择这个repository,列表下面的面板会显示一些详细信息。
部署完成之后,上传的组件会存储在一个独立的临时staging repository,在正式发布之前如果你在测试时遇到任何问题,都可以删除这个staging repository,在修复之后重新部署。正式发布才会同步到maven central repository。
通常情况下正式发布操作需要手动完成。
登录,打开 Staging Repositories 列表,筛选出之前部署的repository。
部署完成之后,这个repository会处于 Open 状态,你可以切换到 Content 标签页检查这个repository,如果确信没有问题,可以点击列表上面的 Close 按钮,这样会触发系统对这个repository进行评估。
如果你的组件不满足评估要求, Close 操作会失败。
遇到这种情况,可以切换到 Activity 标签查看系统评估时出现的具体问题,修复问题,再尝试 Close 操作;如果需要重新部署,可以点击列表上面的 Drop 按钮删除这个repository,在本地修改之后,再重新部署。
成功close之后,可以点击 Release 按钮正式发布repository,组件会被移动到OSSRH的release repository,这个仓库会同步到maven central repository。
注意:如果你是第一次发布,需要到之前创建的JIRA ticket评论一下,告诉他们你已经release了,需要同步下。
Gradle文件的配置可以参考我的项目:
我的JIRA ticket:
androidJavadocs 错误: 编码GBK的不可映射字符。
解决方法:把中文注释替换成英文注释。
androidJavadocs task 错误:不允许使用自关闭元素。
解决方法:删除注释中 &br/& 、 &p/& 之类的标签,把整段注释内容使用 &p&&/p& 标签包裹起来。
Close时评估出现错误:Failed: Signature Validation
解决方法:重试上传GPG生成的keyId
在正式发布时可能会出现403错误:
Release failed
Nexus returned an error: ERROR 403: Forbidden
这是因为之前创建的JIRA ticket的状态还未变成 RESOLVED ,等待可用既可。
本文出自2dxgujun,转载时请注明出处及相应链接。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致提交 library 项目到 Maven Central · linroid提交 library 项目到 Maven Central
提交到 GitHub 后,在 README.md 的 Getting Started 里仅仅写上
Download the source to use it as library project
这唯一使用途径,居然没有 gradle/maven ?作为 Android Studio 的忠实用户,自己写的库怎么能只提供这么麻烦的方法!!!于是决定把它提交到 Maven Central 中。
虽然 AS 的 gradle 默认使用的是 jcenter 仓库,但我们只需要提交到 Maven Central 即可,jcenter 会自动同步。
如果还没有账号先去 Maven Central 注册:
提交工单等待管理员的回复,填 groupId 时,请使用顶级 groupId,比如我只需要填写 com.linroid,就可以发布到任何 com.linroid.* 下的groupId。
我是早上提交的,到晚上0:30的时候收到回复。
Configuration has been prepared, now you can:Deploy snapshot artifacts into repository Deploy release artifacts into the staging repository Promote staged artifacts into repository ‘Releases’Download snapshot and release artifacts from group Download snapshot, release and staged artifacts from staging group please comment on this ticket when you promoted your first release, thanks
然后通过下面的方法 Release,再次回复那个 issue,几分钟后又收到回复:
Central sync is activated for com.linroid. After you successfully release, your component will be published to Central, typically within 10 minutes, though updates to search.maven.org can take up to two hours.
通过 gradle-mvn-push 大神很早前写了一个插件 (终于有机会用它了^﹏^),让你通过一条gradle命令就可以自动构建好aar并提交到 Maven Central。下面介绍这个插件的使用方法。
配置用于上传的认证信息配置文件默认在${HOME}/.gradle/gradle.properties,如果没有则自己创建。
1NEXUS_USERNAME=linroid
NEXUS_PASSWORD=YOUR_MAVEN_CENTRAL_PASSWORD

signing.keyId=YOUR_GPG_KEY_ID
signing.password=YOUR_GPG_PASSWORD
signing.secretKeyRingFile=${HOME}/.gnupg/secring.gpg
NEXUS_USERNAME 和 NEXUS_PASSWORD 是你注册的用户名和密码,下面的是用于 GPG 校验的配置信息,关于 GPG 的使用可以参见阮一峰的博文:
配置版本信息在你的module目录创建gradle.properties文件,添加配置:
1POM_NAME=Android FilterMenu Library
POM_ARTIFACT_ID=library
POM_PACKAGING=aar
VERSION_NAME=0.1.1
VERSION_CODE=1
GROUP=com.linroid.filtermenu

POM_DESCRIPTION=Android FilterMenu Library
POM_URL=/linroid/FilterMenu
POM_SCM_URL=/linroid/FilterMenu
POM_SCM_CONNECTION=scm:/linroid/FilterMenu.git
POM_SCM_DEV_CONNECTION=scm:/linroid/FilterMenu.git
POM_LICENCE_NAME=The Apache Software License, Version 2.0
POM_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt
POM_LICENCE_DIST=repo
POM_DEVELOPER_ID=linroid
POM_DEVELOPER_NAME=linroid
POM_DEVELOPER_URL=
根据你的项目修改吧(‘?ω?’)
添加gradle-mvn-push插件在 library module 的build.gradle文件中添加
1apply from: '/chrisbanes/gradle-mvn-push/master/gradle-mvn-push.gradle
或者可以将
文件下载下来,然后将上面的url该为本地路径。
执行gradle task输入下面的命令,就可以自动构建并上传啦
1$ gradle clean build uploadArchives
出现如下结果就说明上传成功了:) 还没结束,此时你的库并没有发布.
最后一步:close staging repositories登陆
点开左边 Build Promotion 的 Staging Repositories ,滚到最下面找到你最新上传的(可以点Content确保是你上传的),选中之后点击上面的 Close 按钮 和 Release 按钮(多谢的提示)。
Ok 了,还需要等待一小段时间才能在
搜索到你的包。将jar发布到maven中央仓库小记
dexcoder-assistant发布也经历几个版本了,很多人反映使用不太方便,需要将源码下来后本地编译安装一下,如果能直接使用就好了。
osc提供了第三方的maven库,但终究没有官方的maven库来得方便。
本文是将dexcoder-assistant发布到Maven中央库的记录。
注册一个 Sonatype 用户
注册地址:
使用了JIRA来管理流程,记住用户名和密码,后面会用到。
此外,Sonatype 还提供了一个名为 OSS 的系统,具体的构件发布是在这个oss系统上,
Sonatype OSS 地址:
这里的用户名和密码就是上面在JIRA中注册的,在这里可以查询到全世界已发布的构件,当然我们发布构件的操作也在这里进行。
创建一个发布构件的 Issue
上面已经提到使用了JIRA来管理流程,提交发布构件申请的方式就是创建一个Issue。
点击Create按钮
会弹出一个层让你填写Issue的详细信息,把带*号的填一下,其它的默认就行。
这里最重要的就是Group Id,一般会带上域名,千万别弄错了,这关系到以后发布其它的构件。
我这里是com.dexcoder。
一般来说Sonatype是不会要求验证域名的,我是没有碰到,这可能也跟我发布的构件命名和包名及项目主页有的链接有关。
等待 Issue 审核通过
这个审核还是很及时的,但是因为时间差的关系那边是晚上上班(按北京时间算),因此需要等到第二天才能看到审核结果。
审核通过后会收到邮件通知(我收到的邮件被划到了垃圾箱内-.-),同时在Issue下面会看到 Sonatype 工作人员的回复,一般是添加一个comment,内容大致如下:
Configuration has been prepared, now you can:
Deploy snapshot artifacts into repository https://oss.sonatype.org/content/repositories/snapshots
Deploy release artifacts into the staging repository https://oss.sonatype.org/service/local/staging/ deploy/maven2
Promote staged artifacts into repository 'Releases'
Download snapshot and release artifacts from group https://oss.sonatype.org/content/groups/public
Download snapshot, release and staged artifacts from staging group https://oss.sonatype.org/content/groups/staging
please comment on this ticket when you promoted your first release, thanks
使用 GPG 生成密钥对
Windows 系统,可以下载 Gpg4win 软件来生成密钥对。下载地址:https://www.gpg4win.org/download.html
推荐使用 Gpg4win-Vanilla 版本,因为它仅包括 GnuPG,这个工具才是我们所需要的。
Linux 系统,直接从源中安装gpg软件包就行。
安装 GPG 软件后,打开命令行窗口,依次做以下操作:
查看是否安装成功
gpg --version
出现版本等信息说明安装成功了。
生成密钥对
gpg --gen-key
会让你选择加密的方式:
lease select what kind
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
这里选择默认的第一个。
之后往下,会让你输入用户名和邮箱,还有一个Passphase,相当于密钥库密码,不要忘记。
gpg --list-keys
输出如下:
C:\Users\liyd&gpg --list-keys
C:/Users/liyd/AppData/Roaming/gnupg/pubring.gpg
-----------------------------------------------
2048R/48981BD3 2015-12-23
[ultimate] selfly &selfly@foxmail.com&
2048R/F2CBBD66 2015-12-23
我这里的公钥ID是48981BD3,马上就会用到了。
将公钥发布到 PGP 密钥服务器
C:\Users\liyd&gpg --keyserver hkp://pool.sks-keyservers.net --send-keys 48981BD3
gpg: sending key 48981BD3 to hkp server pool.sks-keyservers.net
此后,可使用本地的私钥来对上传构件进行数字签名,而下载该构件的用户可通过上传的公钥来验证签名,也就是说,大家可以验证这个构件是否由本人上传的,因为有可能该构件被坏人给篡改了。
查询公钥是否发布成功
C:\Users\liyd&gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 48981BD3
gpg: requesting key 48981BD3 from hkp server pool.sks-keyservers.net
gpg: key 48981BD3: "selfly &&" not changed
gpg: Total number processed: 1
unchanged: 1
修改Maven配置文件
需要修改全局的setting.xml和项目的pom.xml文件。
setting.xml
找到maven的全局配置文件settings.xml,在里面找到 节点,这个节点默认是注释掉的,增加如下配置:
&id&oss&/id&
&username&用户名&/username&
&password&密码&/password&
&/servers&
这里的id是要在pom.xml里面使用的,用户名和密码就是在Sonatype上面注册的用户名和密码。
&name&dexcoder-assistant&/name&
&description&dexcoder-assistant is a rapid development kit.&/description&
&url&/&/url&
&licenses&
&name&The Apache Software License, Version 2.0&/name&
&url&http://www.apache.org/licenses/LICENSE-2.0.txt&/url&
&/license&
&/licenses&
&developers&
&developer&
&name&selfly&/name&
&email&&/email&
&/developer&
&/developers&
&connection&scm:git::selfly/dexcoder-assistant.git&/connection&
&developerConnection&scm:git::selfly/dexcoder-assistant.git&/developerConnection&
&url&:selfly/dexcoder-assistant.git&/url&
&profiles&
&id&release&/id&
&!-- Source --&
&groupId&org.apache.maven.plugins&/groupId&
&artifactId&maven-source-plugin&/artifactId&
&version&2.2.1&/version&
&executions&
&execution&
&phase&package&/phase&
&goal&jar-no-fork&/goal&
&/execution&
&/executions&
&!-- Javadoc --&
&groupId&org.apache.maven.plugins&/groupId&
&artifactId&maven-javadoc-plugin&/artifactId&
&version&2.9.1&/version&
&executions&
&execution&
&phase&package&/phase&
&goal&jar&/goal&
&/execution&
&/executions&
&!-- GPG --&
&groupId&org.apache.maven.plugins&/groupId&
&artifactId&maven-gpg-plugin&/artifactId&
&version&1.5&/version&
&executions&
&execution&
&phase&verify&/phase&
&goal&sign&/goal&
&/execution&
&/executions&
&/plugins&
&distributionManagement&
&snapshotRepository&
&id&oss&/id&
&url&https://oss.sonatype.org/content/repositories/snapshots/&/url&
&/snapshotRepository&
&repository&
&id&oss&/id&
&url&https://oss.sonatype.org/service/local/staging/deploy/maven2/&/url&
&/repository&
&/distributionManagement&
&/profile&
&/profiles&
&/project&
pom.xml中必须包括:name、description、url、licenses、developers、scm 等基本信息,使用了 Maven 的 profile 功能,只有在 release 的时候,创建源码包、文档包、使用 GPG 进行数字签名。
此外,snapshotRepository 与 repository 中的 id 一定要与 setting.xml 中 server 的 id 保持一致。
如果是多模块项目的话,只需要在父pom.xml中声明这些,子pom.xml中只需要修改相应的一些信息,如name标签。
上传构件到 OSS 中
mvn clean deploy -P release
当执行以上 Maven 命令时,会自动弹出一个对话框,需要输入上面提到的 Passphase,它就是刚才设置的 GPG 密钥库的密码。
随后会看到大量的 upload 信息,因为在国内网络的缘故,时间有点久,耐心等待吧。
注意:此时上传的构件并未正式发布到中央仓库中,只是部署到 OSS 中了,下面才是真正的发布。
在 OSS 中发布构件
在 OSS 中,使用自己的 Sonatype 账号登录后,可在 Staging Repositories 中查看刚才已上传的构件,这些构件目前是放在 Staging 仓库中,可进行模糊查询,快速定位到自己的构件。
此时,该构件的状态为 Open,需要勾选它,然后点击 Close 按钮。系统会自动验证该构件是否满足指定要求,当验证完毕后,状态会变为 Closed。
最后,点击 Release 按钮来发布该构件,这一步没有截图,将就看吧知道就行:
这里页面可能要刷新一下才能看到新的状态。
通知 Sonatype 构件已成功发布
这个前面的Sonatype工作人员其实在审核你的Issue时,在comment中已经提示你了,
在Issue下面回复一条“构件已成功发布”的评论,这是为了通知 Sonatype 的工作人员为需要发布的构件做审批,发布后会关闭该Issue。
等待构件审批通过
这个,又只能等待了,当然他们晚上上班,还是第二天看。当审批通过后,将会收到邮件通知。
从中央仓库中搜索构件
这时,就可以在maven的中央仓库中搜索到自己发布的构件了,以后可以直接在pom.xml中使用了!
中央仓库搜索网站:http://search.maven.org/
第一次成功发布之后,以后就不用这么麻烦了,可以直接使用Group Id发布任何的构件,当然前提是Group Id没有变。
以后的发布流程:
a)构件完成后直接使用maven在命令行上传构建;
b)在https://oss.sonatype.org/ close并release构件;
c)等待同步好(大约2小时多)之后,就可以使用了
参考引用:}

我要回帖

更多关于 staging 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信