7月10日 第八天
今天接触了下项目,发现我以前使用maven简直就是白痴式的用法,一起觉得maven就是用来添加jar包的,具体为什么要这么添加我自己也说不清楚。今天看了看公司怎么样使用maven,真是汗。然后就重新学习了下maven了。
基本原理:
maven的基本原理很简单,采用远程仓库和本地仓库以及一个pom.xml的配置文件,将在pom.xml中配置的jar包从远程仓库下载到本地仓库,同时采用现在流行的软件体系架构,只保留最小的核心,其余功能都通过插件的形式提供,在执行maven任务的时候,他会自动下载所需要的插件。
项目管理:
Maven一个重要特性是定义了项目的标准模板,可以通过加载插件去创建特定的模板。
比如说建立一个普通项目 ,maven默认使用maven-archetype-quickstart模板,只需要写下下面的命令:
1: mvn archetype:create
2: -DgroupId=packageName
3: -DartifactId=projectNam
创建一个web项目,需要使用maven-archetype-webapp模板,命令如下:
1: mvn archetype:create
2: -DgroupId=packageName
3: -DartifactId=webappName
4: -DarchetypeArtifactId=maven-archetype-webapp
文档和报告:
使用mvn site可以快速生成项目站点,apache很多开源项目站点都采用maven生成,会出现built by maven字样的图标。
而maven提供的针对如junit,checkstyle,pmd等的插件,能够方便的进行测试和检查并能直接生成报告。使用都很简单。
类库管理:
Maven一个很重要的特色就是类库管理。通过在pom.xml中定义jar包版本和依赖,能够方便的管理jar文件。以下是一个简单的jar定义片断:
1: <dependency>
2: <groupId>org.hibernate</groupId>
3: <artifactId>hibernate</artifactId>
4: <version>3.1</version>
5: <type>jar</type>
6: <scope>runtime</scope>
7: </dependency>
这个片断告诉我们,依赖的jar包groupId为org.hibernate,artifactId为hibernate,版本为3.1,scope为runtime。在实际项目中,会将M2_REPO_(maven{}本地仓库地址_)/ org/hibernate / hibernate /3.1/ hibernate -3.1.jar放入classpath。
同时maven会通过pom.xml管理jar包间的依赖。比如上面的hibernate-3.1.jar同级目录肯定会有一个hibernate -3.1.pom,在这个pom文件中指定了这个jar对其它一些jar的依赖。而这个pom文件是远程仓库提供,无需进行修改,执行maven相关命令就会自动根据相关依赖去下载jar包。这样只需定义对hibernate的依赖而无需关心相关jar,在构建项目上方便了很多。
因为pom文件对jar的管理,也产生了一个很吸引人的特性:项目文件很小。以往一个web项目中,jar文件都要放入WEB-INF/lib下,并放入cvs(svn)中,很容易就达到几十M。而通过maven,只需一个pom.xml,在执行mvn eclipse:eclipse时再去远程仓库下载,项目文件一般只需几百K。
发布管理:
使用maven可以方便的进行项目发表管理。在项目开发到一定阶段,可以使用mvn package打包,它会自动先运行mvn test,跑所有的testcase,只有全部通过才能正确打包。生成的war包(如果项目的packaging为war)在target目录下。这个war包与使用ant脚本生成一样,但无需一行脚本,这也是maven对比ant的优势之一。使用mvn install将编译和打包好的文件发布到distributionManager指定的远程repository。使用mvn deploy可以自动管理项目版本。
使用maven:
安装配置:
Maven的安装很简单:
1. 从apache网站上下载maven安装包,实际上就是个压缩文件。将其解压到你想要存放maven的目录中。在这里假设你将maven解压到C:\Program Files\Apache Software Foundation\maven-3.0.4中。
2. 将C:\Program Files\Apache Software Foundation\maven-3.0.4\bin设到你的系统环境变量%PATH%中。
3. 同时确保你已经将你的JDK安装目录设为java_home系统变量。
4. 打开个命令行窗口,运行mvn --version验证是否安装成功。
5. 如果使用eclipse,在运行mvn eclipse:eclipse生成eclipse项目文件后,需加入M2_REPO到Classpath Variables中,指向本地repository,例如:C:/Documents and Settings/Owner/.m2/repository。
基本使用流程
Maven的基本使用如下:
mvn -version(确认maven安装成功) -------》 mvn archetype:create(创建maven项目) -------》 mvn eclipse:eclipse 与IDE结合
mvn test (自动测试说有的testcase)----------》 mvn package (打包) --------》 mvn install (发布jar) ---------》mvn deploy (发布项目)
生命周期的引入:
在Maven2中有了明确的生命周期概念,而且都提供与之对应的命令,使得项目构建更加清晰明了。主要的生命周期阶段:
- validate,验证工程是否正确,所有需要的资源是否可用。
- compile,编译项目的源代码。
- test-compile,编译项目测试代码。
- test,使用已编译的测试代码,测试已编译的源代码。
- package,已发布的格式,如jar,将已编译的源代码打包。
- integration-test,在集成测试可以运行的环境中处理和发布包。
- verify,运行任何检查,验证包是否有效且达到质量标准。
- install,把包安装在本地的repository中,可以被其他工程作为依赖来使用
- deploy,在整合或者发布环境下执行,将最终版本的包拷贝到远程的repository,使得其他的开发者或者工程可以共享。
- generate-sources,产生应用需要的任何额外的源代码,如xdoclet。
如果要执行项目编译,那么直接输入:mvn compile即可,对于其他的阶段可以类推。阶段之间是存在依赖关系(dependency)的,如test依赖test-compile。在执行mvn test时,会先运行mvn test-compile,然后才是mvn test。
Dependency Scope
在POM 4中,<dependency>中还引入了<scope>,它主要管理依赖的部署。目前<scope>可以使用5个值:
- compile,缺省值,适用于所有阶段,会随着项目一起发布。
- provided,类似compile,期望JDK、容器或使用者会提供这个依赖。如servlet.jar。
- runtime,只在运行时使用,如JDBC驱动,适用运行和测试阶段。
- test,只在测试时使用,用于编译和运行测试代码。不会随项目发布。
- system,类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。