赞
踩
原文地址: http://www.blogjava.net/youxia/archive/2013/12/29/408182.html
参考资料:
1.Maven官方文档http://maven.apache.org/guides/index.html
2.Git官方文档http://git-scm.com/documentation
3.SpringSide4官方文档https://github.com/springside/springside4/wiki
本博文不同于网上随处可见的《Maven使用教程》《Git使用教程》等之类的文章。我并不会从软件的安装和基本的命令开始讲起,而是通过探讨他们包含了哪些设计哲学和能为我们带来什么样的项目管理体验,让大家能在最短的时间内通过一篇博客上手Maven和Git。
Maven是一个优秀的Java项目管理工具。在用Java做项目时,项目的创建、编译、测试、打包和安装部署都需要敲入不少的命令,而且在编译和运行Java程序时,必须能从CLASSPATH中找到该项目依赖的jar包,否则编译无法顺利进行,更不可能成功运行。为解决这些问题,Maven应运而生。
Maven的特点:
1.可以根据模板创建项目,也可以从已有的项目生成模板,这里的模板,Maven术语叫archetype;
2.自动管理依赖的jar;
3.配置文件非常简短;
4.可以有非常丰富的插件,对大部分人来说,使用插件非常简单,不需要了解插件怎么编写,而且插件的下载和管理都是自动的。
Maven关键词:convention; phase; archetype; groupId; artifactId; plugin; task; dependency; repository
以下是我对Maven的理解。
Maven管理一个项目时,会在项目的目录下放一个pom.xml配置文件,该配置文件非常简短。之所以能够做到让配置文件非常简短,是因为Maven管理项目的时候遵循的是一种惯例(convention),Maven项目的目录结构基本是固定的,而且对项目管理中的各个阶段(phase)的定义也是固定的,所以即使不在pom.xml配置文件中做任何特殊定义,也可以使用Maven的标准命令mvn compile、mvn test、mvn package、mvn install自动进行项目的编译、测试、打包、安装。
对于复杂的任务则是通过插件(plugin)来完成,定义在插件中的操作称为任务(task),使用的格式为mvn plugin:task。使用Maven创建一个新项目就是通过archetype插件的generate任务做到的,命令格式为mvn archetype:generate。同样,可以为Maven管理的项目生成Eclipse的项目文件,命令为mvn eclipse:eclipse。插件和依赖项一样,也是自动下载和管理的,不需要用户干预。
自动下载的依赖项和插件都存放在本地仓库(repository)中,该仓库一般位于用户目录的.m2目录下。我们自己的项目执行mvn install时,也默认安装到该仓库中。每一个项目都需要用groupId、artifactId和version来标识,包括我们自己的项目、依赖项、插件、创建新项目要用到的模板等都是如此。使用mvn archetype:generate创建新项目时需要指定archetypeGroupId和archetypeArtifactId。groupId代表该项目所在的小组,比如org.apache.maven,这是Java世界的命名哲学,在这里不详细叙述,artifactId则只需要简单指定一个项目的名字即可,打包成jar文件的时候,会生成名字为artifactId-version.jar的文件。
下面看具体示例。如果要创建一个空项目,使用如下命令:
重点补充:
Git和Eclipse的EGit插件对于关键词Repository的理解不一致,需要重点强调。在Git中,Repository的定义就是工作目录下的.git目录,工作目录就是是一个Project的根目录。Repository是工作目录的子目录。
为了证明不是我对Repository理解错误,下面是《Pro Git》中的部分原文:
而Eclipse的EGit插件则不一样。在Eclipse的世界里,Project是一个比较小的概念,而且不能嵌套,否则IDE会出问题,再加上Eclipse世界的观点认为我们经常需要在一个workspace中开多个Project。所以Git中的working directory不是一个Project的工作目录,而是一个workspace的工作目录.而Project是workspace的子目录,所以.git目录不应该放到Project的根目录下,而应该放到workspace的根目录下。在workspace目录下放一个.git目录有很多好处,比如可以同时追踪多个项目的源代码,比如可以在删除workspace时同时删除.git目录。但是在Eclipse遍历workspace的时候,.git目录的存在会不会出现问题还说不准。所以最好的办法是把.git目录、Project目录放到workspace之外。如上所述,按Eclipse的哲学,.git目录不应该是Project的子目录,而是Project的平级目录,那么当.git目录和Project目录都放到workspace之外的话,总得有一个目录来存放它们吧,Eclipse就把这个存放它们的那个目录叫Repository。其概念和Git中原有的Repository概念不一样,Eclipse的Repository不是指.git目录,而是Project目录的父目录,在Eclipse中,.git目录叫metadata folder,如果和Git中的Repository是Project的子目录的概念相比较,这两个Repository的概念差了两个辈份。
如下图,将Project纳入Git管理,选择快捷菜单Team->Share Project命令弹出的对话框:
在这个对话框,有一个Use or create repository in parent folder of project的单选框,这里的repository就是指.git目录的祖父目录,所以选中这个单选框,则workspace就相当于是repository,而.git目录就会放到Project目录下。这和我们平时单独使用Git的习惯是一致的,比较容易理解,但是却是Eclipse不推荐的。
按照Eclipse的哲学,我们应该点这个对话框中的Create按钮,这样会弹出如下对话框:
按照我上面这么填写后,相当于创建了一个Repository,其路径为/home/youxia/git/examples,.git目录就会创建在这个目录下,Project目录也会移动到这个目录下,而workspace依然不变。点Finish,会返回上一个对话框,可以看到下面的表格中,显示该项目的current location为/home/youxia/workspace/rcp-example,而创建Repository后,将会将该项目移动到/home/youxia/git/examples/rcp-example,.git目录和rcp-example的项目目录是平级的,都是examples的子目录,examples就是Repository。而且使用这一个.git目录,可以追踪多个项目,也就是说,以后凡是我为了做示范写的代码,不管是swt-example也好,还是springside-example也好,都可以放到examples下,用这一个.git目录保管他们的版本库。
为了证明我没有误解Eclipse的哲学,下面是EGit/User Guide(http://wiki.eclipse.org/EGit/User_Guide)的部分原文:
另一段,关于.git目录不应该放到Project目录下,而应该和Project目录平级,并放到workspace之外的:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。