在实际开发中,我们会使用很多开源项目,有时我们需要对其中的一些逻辑进行修改或者添加一些功能,这时候就需要获取源码并且做相应改动。为便于团队成员共享,需要将修改好的代码再次发布,基本流程如下,以修改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>
主要包括如下几个部分:
- 域(Realm)一般是:
Sonatype Nexus Repository Manager
- 主机名: com.xxx.xxx 或者是 ip地址(不需要端口)
- Nexus repository用户名
- Nexus repository密码
接下来我们需要在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发布