2015年10月22日星期四

利用Sonatype将jar提交到Maven的中央仓库

1、Sonatype简介
Sonatype使用Nexus为开源项目提供托管服务。你可以通过它发布快照(snapshot)或是稳定版(release)到Maven中央仓库。我们只要注册一个Sonatype的JIRA账号、创建一个JIRA ticket,然后对POM文件稍作配置即可。
2、注册账号
打开https://issues.sonatype.org/ 注册Sonatype的JIRA账号,这个账号在后面配置maven server时需要使用。
打开Create a OSSRH ticke 创建一个JIRA ticket,你的一个项目对应着这里的一个JIRA ticket,
其中Summary可以填写项目名,Description填写项目介绍。
Group Id非常重要,必须是你项目pom.xml中的group id的父级,做为你账号和该项目关联的标记。如我项目pom.xml中group id为com.github.eagoo,为了我所有项目都可以发布,申请填写的Group Id为com.github.eagoo
其他按照提示填写即可。完成后大概2个工作日左右,该Issue会变为 _resolved_ 状态表示可用,在可用前下面的过程除了第7步 正式发布外,其他的都没有问题
ps:管理员会查看申请的Group Id是否为你名下的域名
3、软件环境
(1) JDK5以上
(2) Subversion 或是 Git
这是根据你项目需要的,你项目用什么版本控制管理工具
(3) Maven 2.2.1+
(4) GPG,用于对需要上传的文件加密和签名
下载地址:https://www.gnupg.org/download/index.html,windows版下载地址:http://gpg4win.org/
安装完成后通过在命令行模式下通过
命令生成自己的public key,除了姓名、邮箱、备注外其他都可以使用默认配置,最后需要填写一个passphase,注意它在后面mvn release签名时需要。
public key生成结束后用
命令查看key内容,如下:
其中C6EED57A为key id,需要将他上报给服务器,命令如下:
这样便完成了gpg public key的创建和上报操作。
如果有兴趣深入了解可见:How To Generate PGP Signatures With Maven
4、配置Maven仓库地址
在.m2目录下的settings.xml文件中添加
将其中的your-jira-id和your-jira-pwd替换为你在https://issues.sonatype.org/上的用户名和密码。
m2 目录在linux下路径为/home/user-name/.m2,windows下路径为C:\Users\your-user-name\.m2
如果后面步骤中发现settings修改不生效可参考:Maven Sonatype Nexus return 401
5.使用SBT 的plugin
addSbtPlugin("com.github.gseitz" % "sbt-release" % "0.8.5")
addSbtPlugin("org.xerial.sbt" % "sbt-sonatype" % "0.2.1")
可以直接发布你的项目到sonatype仓库
具体可参考如下build.sbt配置
lazy val root = (project in file("."))
  .settings(basicSettings: _*)
  .settings(dependencySettings: _*)
  .settings(publishSettings: _*)
  .settings(releaseSettings: _*)
  .settings(addCompilerPlugin("org.scalamacros" % "paradise" % "2.0.1" cross CrossVersion.full))

lazy val basicSettings = Seq(
  name := "config-annotation",
  organization := "com.github.eagoo",
  scalaVersion := "2.11.5",
  scalacOptions += "-encoding",
  scalacOptions += "utf8",
  scalacOptions += "-feature",
  scalacOptions += "-unchecked",
  scalacOptions += "-deprecation",
  scalacOptions += "-Xmacro-settings:conf.output.dir=src/test/resources",
  scalacOptions += "-language:_"
)

pgpSecretRing := file("C:/Users/eagooqi/AppData/Roaming/gnupg/secring.gpg")

pgpPublicRing := file("C:/Users/eagooqi/AppData/Roaming/gnupg/pubring.gpg")

lazy val dependencySettings = Seq(
  libraryDependencies <+= scalaVersion("org.scala-lang" % "scala-reflect" % _),
  libraryDependencies += "com.typesafe" % "config" % "1.2.1",
  libraryDependencies += "org.scalatest" %% "scalatest" % "2.2.1" % "test"
)

lazy val publishSettings = Seq(
  publishTo := {
    val nexus = "https://oss.sonatype.org/"
    if (version.value.trim.endsWith("SNAPSHOT"))
      Some("snapshots" at nexus + "content/repositories/snapshots")
    else
      Some("releases" at nexus + "service/local/staging/deploy/maven2")
  },
  publishMavenStyle := true,
  publishArtifact in Test := false,
  pomIncludeRepository := { (repo: MavenRepository) => false},
  pomExtra := pomXml) ++ xerial.sbt.Sonatype.sonatypeSettings

lazy val pomXml = {
  <url>https://github.com/eagoo/config-annotation</url>
    <licenses>
      <license>
        <name>Apache License 2.0</name>
        <url>http://www.apache.org/licenses/</url>
        <distribution>repo</distribution>
      </license>
    </licenses>
    <scm>
      <url>git@github.com:eagoo/config-annotation.git</url>
      <connection>scm:git:git@github.com:eagoo/config-annotation.git</connection>
    </scm>
    <developers>
      <developer>
        <id>eagoo</id>
        <name>eagooqi</name>
        <url>http://github.com/eagoo</url>
      </developer>
    </developers>
}

lazy val releaseSettings = sbtrelease.ReleasePlugin.releaseSettings ++ Seq(
  sbtrelease.ReleasePlugin.ReleaseKeys.publishArtifactsAction := PgpKeys.publishSigned.value
)

// sbt release sonatypeRelease
 sbt>release
ps:代码先commit到本地
不久后就同步完成。

没有评论:

发表评论