Home > Archives > 获取开源项目并发布到Maven私库的流程

获取开源项目并发布到Maven私库的流程

Published on

在实际开发中,我们会使用很多开源项目,有时我们需要对其中的一些逻辑进行修改或者添加一些功能,这时候就需要获取源码并且做相应改动。为便于团队成员共享,需要将修改好的代码再次发布,基本流程如下,以修改elastic4s并发布为例。

获取项目源码

通过git clone获取源码之后,我们需要考虑基于那个版本进行改动。基于git的项目,每发布一个版本就会对应一个tag,我们需要做的就是基于tag切出一个分支然后进行改动

# 列出tag
git tag

v1.1.1.0
v2.2.0
v2.2.1
v2.3.0
v2.3.1
v2.3.2

# 基于v2.3.2切出开发分支
git checkout -b branch_name v2.3.2

发布到远程仓库

修改完成之后,接下来我们需要将项目编译并部署到远程Maven私库中。这里涉及到的一个重点就是: 配置相应的认证信息(credentials)

(1) Maven中配置

Maven的部署主要借助deploy插件

# 部署命令
mvn deploy

相应的crentials配置: ${HOME}/.m2/settings.xml

<servers>
    <server>
      <id>nexus-releases</id>
      <username>username</username>
      <password>passwd</password>
    </server>

    <server>
      <id>snapshots</id>
      <username>username</username>
      <password>passwd</password>
    </server>
</servers>

pom.xml中的repository配置,pom.xml中的repository优先级高于settings.xml中的,而pom.xml中的repository又是按照顺序来依次尝试的

<repositories>
    <repository>
      <id>releases</id>
      <name>Private Releases Repository</name>
      <url>http://hostname/nexus/content/repositories/releases/</url>
    </repository>
    <repository>
      <id>snapshots</id>
      <name>Private Snapshots Repository</name>
      <url>http://hostname/nexus/content/repositories/snapshots/</url>
    </repository>
    <repository>
      <id>aliyun</id>
      <name>Aliyun Maven Repository</name>
      <url>http://Maven.aliyun.com/nexus/content/groups/public/</url>
    </repository>
    <repository>
      <id>central</id>
      <name>Maven Central Repository</name>
      <url>http://repo1.Maven.org/Maven2/</url>
    </repository>
</repositories>

(2) sbt中配置

主要包括如下几个部分:

接下来我们需要在Build.scala或者build.sbt中配置如下信息:

// 确保生成相应的pom文件
publishMavenStyle := true

credentials += Credentials("Sonatype Nexus Repository Manager", hostname, username, passwd)

// 根据版本发布到不同的仓库中去
publishTo <<= version {
  (v: String) =>
    // val repo = "http://hostname"
    val repo = "http://ip:port/"
    if (v.trim.endsWith("SNAPSHOT"))
      Some("snapshots" at repo + "nexus/content/repositories/snapshots")
    else
      Some("releases" at repo + "nexus/content/repositories/releases")
}

之后便可以通过sbt publish进行发布,不过即使上面的credentials信息无误,也会报权限错误,目前需要通过sbt-aether-deploy插件解决,在plugins.sbt中添加addSbtPlugin(“no.arktekk.sbt” % “aether-deploy” % “0.19.0”), 将发布命令改为sbt aether-deploy即可。

对于多模块项目,如果想控制发布到私库的项目,可以通过aggregate来定义需要发布的子模块。

// build.sbt
lazy val root = Project("elastic4s", file("."))
  // 不发布package生成的main jar
  .settings(publishArtifact := false)
  .settings(name := "elastic4s")
  // 控制需要发布的子模块
  .aggregate(core, streams)

参考

> sbt发布

声明: 本文采用 BY-NC-SA 授权。转载请注明转自: Allen写字的地方