Maven2 的新特性可以大大地缩短了开发管理中的工作量,使得开发人员将精力集中在实际的业务问题上。
Maven 无疑是相当成功的,这一点从越来越多的开源项目开始使用 Maven 就可以看出。Maven 取得成功的原因很简单:在简化构建脚本的同时,功能并没有缩水,反而有所增强;提供汇集项目信息的工具,并以相当友好的方式呈现;丰富的插件简化了工作。如此有力的工具出现,自然是争相使用。
1. 更少的配置文件
Maven1 和 Maven2 主要配置文件的对比:
Maven1:project.xml、maven.xml、project.properties和build.properties。
Maven2:pom.xml和settings.xml。
POM是Maven的核心对象模型,在Maven2中POM已由project.xml转移到pom.xml中使用,一般只需要pom.xml就行了。
2. 提供预定义的目录模板
好的目录结构可以使开发人员更容易理解项目,为以后的维护工作也打下良好的基础。Maven2根据业界公认的最佳目录结构,为开发者提供了缺省的标准目录模板。Maven2的标准目录结构如下:
使用目录模板,可以使pom.xml更简洁。因为Maven2已经根据缺省目录,预定义了相关的动作,而无需人工的干预。以resources目录为例:
src/main/resources,负责管理项目主体的资源。在使用Maven2执行compile之后,这个目录中的所有文件及子目录,会复制到target/classes目录中,为以后的打包提供了方便。
src/test/resources,负责管理项目测试的资源。在使用Maven2执行test-compile之后,这个目录中的所有文件及子目录,会复制到target/test-classes目录中,为后续的测试做好了准备。
在src和 test都使用resources,方便构建和测试,这种方式本就已是前人的经验。通过使用Maven2,使这个经验在开发团队中得到普及。
3. 生命周期的引入
在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。
4. 新增Dependency Scope
在POM 4中,<dependency>中还引入了<scope>,它主要管理依赖的部署。目前<scope>可以使用5个值:
compile,缺省值,适用于所有阶段,会随着项目一起发布。
provided,类似compile,期望JDK、容器或使用者会提供这个依赖。如servlet.jar。
runtime,只在运行时使用,如JDBC驱动,适用运行和测试阶段。
test,只在测试时使用,用于编译和运行测试代码。不会随项目发布。
system,类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。
<scope>的使用举例:
<dependency> <groupId>hibernate</groupId> <artifactId>hibernate</artifactId> <version>3.0.3</version> <scope>test</scope> </dependency>
---------------------------------------------
使用Maven的最大好处在于:生成工程骨架和管理JAR包依赖。
Maven自带了很多的工程骨架,想自定义骨架可以使用交互式命令:
mvn archetype:generate
我的是Maven 2.2.1版本,系统自带的骨架一共有41个(下面是常用的几个):
* maven-archetype-archetype * maven-archetype-j2ee-simple * maven-archetype-mojo * maven-archetype-portlet * maven-archetype-profiles * maven-archetype-quickstart * maven-archetype-simple * maven-archetype-site * maven-archetype-site-simple * maven-archetype-webapp ……
当然,我们完全可以通过命令指定骨架,下面列出几常用的用法:
1)、创建普通Java项目:
mvn archetype:create -DgroupId=[your project's group id] -DartifactId=[your project's artifact id] [-Dversion=[version id]]
mvn archetype:create -DgroupId=com.aboy -DartifactId=webmap
2)、创建WEB项目:
mvn archetype:create -DgroupId=[your project's group id] -DartifactId=[your project's artifact id] -DarchetypeArtifactId=maven-archetype-webapp
mvn archetype:create -DgroupId=com.aboy -DartifactId=webmap -DarchetypeArtifactId=maven-archetype-webapp
这里的-DarchetypeArtifactId=maven-archetype-webapp 中的maven-archetype-webapp就是上面提到的常用默认骨架之一。
1、Maven命令属性的简单说明:
1)、archetype( 内建插件,他的create任务将建立项目骨架 ): archetype:create
2)、groupId 项目的java包结构:com.aboy
3)、artifactId 项目的名称:webmap 【工程名】
4)、显示Maven默认设置
mvn help:effective-pom
2、生成清除Eclipse项目结构:
mvn eclipse:eclipse mvn eclipse:clean
3、清理(删除target目录下编译内容)
这个clean和上面的mvn eclipse:clean是不一样的,上面的清除的是.classpath和.project文件,这个是清除的target目录及其内容。
4、仅打包Web页面文件
5、Maven的主要生命周期:
validate: 验证项目是否正确以及相关信息是否可用
compile: 编译
test: 通过junit进行单元测试
package: 根据事先指定的格式(比如jar),进行打包
integration-test: 部署到运行环境中,准备进行集成测试
verify: 对包进行有效性性和质量检查
install: 安装到本地代码库
deploy: 在集成或发布环境,将包发布到远程代码库
创建Maven项目:mvn archetype:create
编译源代码:mvn compile
编译测试代码:mvn test-compile
运行测试:mvn test
产生site:mvn site
打包:mvn package
在本地Repository中安装jar:mvn install
清除产生的项目:mvn clean