背景: html
在客户那边作的一个项目,我中途加入项目组,项目版本管理在SVN上,因为没有分主线,分支,与里程碑版本。在第一次上线时,上了SVN上的一个版本,后来对这次上线的SVN上的版本遗望了。在其后的几回上线中,对于项目功能有部分功能未完成、不上线的、或要更新上部分功能这种状况,处理时简单在一个Checkout下来的最近版本项目进行更改来进行上线,其实还好没遇到一些大问题。另外碰到的一个问题是,上线的一些功能要配合其余项目组的上线的功能,例如一个为咱们提供单点登陆的项目组,他们上线,以前他们的单点登陆在测试没有集群的环境,与咱们项目测试环境通过测试是能够正常使用的。可是线上环境下就不必定了。咱们要准备多一套上线的包,来应付对方若是上线功能有问题,咱们系统仍是缘用以前可使用的功能。 apache
对于上面的状况,咱们考虑到在版本控制管理上,确实还作得不够,要使用一些合理点的方式来进行管理。对于我我的,这也是在摸索之中,也没有什么最佳实践。因而有了这么一次的Spike,主要以实战为主,对于背后的理论大伙能够参考一些资料。凭借着对《maven in action》这本书的一些记忆。动手操做了一下^-^,在这其中也遇到了一些错误跟问题,这里跟分享一下。 服务器
实战: mvc
建立一个SVN的Repository。 我这边使用的是VisualSVN Server, 一个很傻瓜很好用的SVN服务器^-^ maven
Repositories右键,Create New Repository。输入spike-svn-maven、先下面标红的建立主干、分支、里程碑(标签)目录。 svn
如上图建立一个名称为 spike-svn-maven的版本库URL为(https://xzf-pc:8083/svn/spike-svn-maven)。 测试
而后进入到本身准备放工程的目录,我本身而言:e:\project\xzf_20130929\spike-svn-maven。 网站
这些目录用小乌龟(TortoiseSVN客户端)根据上面建立完Repository后给出的SVN的URL,Checkout下来。 ui
这个咱们要的三个目录就准备好了。 url
进入e:\project\xzf_20130929\spike-svn-maven\trunk
打开CMD命令行。建立一个maven工程:
mvc archetype:create -DgroupId=com.fengzidm.spike -DartifactId=spike-svn-maven -DpackageName=com.fengzidm.spike
ps:这里我犯了一个错误是。这里建立了一个工程,会在trunk目录下产生 \trunk\spike-svn-manen\ .... 这样的目录。我后面忘记了将trunk\spkie-svn-maven里面的
东西所有剪切到trunk\下,并将spkie-svn-maven这个目录删除。致使了我后面使用release插件时,报找不到pom.xml文件的错误。
进行到这一步。咱们打开生成工程的pom.xml文件,并修改为如下内容(根据我机器上的配置来进行的修改)
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.fengzidm.spike</groupId> <artifactId>spike-svn-maven</artifactId> <version>1.1-SNAPSHOT</version> <packaging>jar</packaging> <name>spike-svn-maven</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <!-- release插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-release-plugin</artifactId> <version>2.1</version> <configuration> <!-- 设置分支跟里程碑的url --> <branchBase>https://localhost:8083/svn/spike-svn-maven/branches</branchBase> <tagBase>https://localhost:8083/svn/spike-svn-maven/tags</tagBase> </configuration> </plugin> </plugins> </build> <!-- SCM配置 --> <scm> <url>https://localhost:8083/svn/spike-svn-maven/trunk</url> <connection>scm:svn:https://localhost:8083/svn/spike-svn-maven/trunk</connection> <developerConnection>scm:svn:https://localhost:8083/svn/spike-svn-maven/trunk</developerConnection> </scm> <!-- 配置release插件发布到个人Nexus仓库 --> <distributionManagement> <repository> <id>nexus-releases</id> <name>Nexus Releases Repository</name> <url>http://localhost:8081/nexus/content/repositories/releases/</url> </repository> <snapshotRepository> <id>nexus-snapshots</id> <name>Nexus Snapshots Repository</name> <url>http://localhost:8081/nexus/content/repositories/snapshots/</url> </snapshotRepository> </distributionManagement> </project>
里面对maven的scm配置进行了配置,还配置了发布到个人Maven仓库的信息。还有就是release插件。
配置好以后,我用小乌龟进行一下代码提交。
maven 的 scm支持仍是挺好用的。有一些相关的命令,官方网站为:http://maven.apache.org/scm/maven-scm-plugin/
像以前的导入操做,咱们能够经过
mvn scm:checkout 这们的命令进行。
有两个操做是为后面操做奠基基础的,是scm:tag跟scm:branch。我用这两个命令测试了一下。建立里程碑跟分支
mvn scm:tag -Dbasedir=E:\project\xzf_20130929\spike-svn-maven\tags -Dtag=first-tag.0.0.1
建立完成后,进入spike-svn-maven\tags\first-tag.0.0.1这个目录。来继续建立分支
mvn scm:branch -Dbasedir=E:\project\xzf_20130929\spike-svn-maven\branches -Dbranch=first-tag.0.0.1.branch.0.0.1
(这里tag 跟 branch的名字我是乱取的哈) 而后用小乌龟查看svn服务上的改工程的仓库图:
咱们这样就根据主线版本库,建立了里程碑跟在里面碑上面建立分支修改了。
可是这样建立的里程碑跟分支若进行mvn:clean deploy上传在咱们的maven仓库中,都是snapshot版本的。
使用release插件进行操做: 官网:http://maven.apache.org/maven-release/maven-release-plugin/examples/prepare-release.html
将刚才建立的first-tag.0.0.1跟first-tag.0.0.1.branch.0.0.1在svn版本库上删除。而后本地进行更新到最近版本。
而后将我上面以前的犯的一个小错误纠正。将trunk\spike-svn-maven里面的东西所有移动到trunk\目录下,而后删除spike-svn-maven这个目录进行一下提交代码。
咱们的CMD命令行定位到工程目录 :E:\project\xzf_20130929\spike-svn-maven\trunk
mvn release:prepare
里面能够自定版本号之类的,简单起见我就一路回车去了。在显示 BUILD SUCCESS后,咱们的工程目录下多了几个文件
观察pom.xml,会发现里面的version版本号按照上次的规则进行了变化。pom.xml.releaseBackup是备份文件。
若是在上次prepare操做,有修改或以为不满意,能够执行 mvn release:rollback ,而后记得进扩target目录下面把 checkhout目录删除 (或执行mvn release:clean)
而后在版本库上把上面生成的tags文件删除,貌似这个要手工删除。
一切就绪 ok 以后 ,咱们发布。
mvn release:perform
一样的BUILD SUCCESS后,咱们的一次release 里程碑发布就OK了。这时咱们看svn库上:
这时,咱们trunk下的pom.xml里面的版本信息
<groupId>com.fengzidm.spike</groupId> <artifactId>spike-svn-maven</artifactId> <version>1.1-SNAPSHOT</version> <packaging>jar</packaging>
在release:perform操做时,会上传release版本到个人maven仓库nexus服务中去。
若是咱们对trunk\spike-svn-maven进行一下mvn clean deploy操做。登陆到nexus服务器中:
release版本跟snapshot版本已经分布发布。
在里程碑版本建立分支进行开发:
咱们在发布了里程碑版本,并放上线后,若是几个地方放了不一样的版本。我如今要在原来1.0的release版本中发布中建立一个分支来进行修正。
使用release:branch命令建立。
命令行定位到tags\spike-svn-mave-1.0\目录 :
mvn release:branch -DbranchName=spike-svn-maven-1.0.1 -DupdateBranchVersions=true -DupdateWorkingCopyVersions=false
这样操做,maven会提示你要求给此次分支定义的版本,输入 1.0.1-SNAPSHOT,而后回车。而后就提示BUILD SUCCESS啦!
这里的svn上的目录结构:
分支版本建立好了。之于修改后发布。这些操做类似。若是要合并到主版本库去又是一个话题:^) , 这些我没经验就先不说啦。
最后,通过这一次spike实战后,对maven的这几个插件有了必定了解,也尝试解决了一些问题。总的来讲收获很多。
对scm跟svn方面个人理解还比较浅的。若是有出现的明显的错误请见谅:^)。