概述¶
Maven 最初的目的是在Jakarta Turbine项目中使构建处理简单化。几个项目之间使用到的Ant build文件差异很小,各个JAR都存入CVS。因此希望有一个标准的方法构建各个工程,清晰的定义一个工程的组成,一个容易的方法去发布项目信息并且去提供一种在各个项目之间共享JAR包。
结果出现了一种功能能用于构建和管理任何基于java的工程。Maven小组希望他们已经做到了一些事情,这将有助于Java开发者更容易的完成每天的工作并且有助于理解任何基于java的项目。
Maven的目标¶
- 使构建过程更容易
- 提供统一构建系统
- 提供高质量的项目信息
- 提供开发的最佳实践指南
- 能无缝的加入新的特性
对Maven的错误理解¶
- Maven是一个站点和文档制作工具。
- Maven扩展了Ant,使其能下载到各种依赖包
- Maven是一系列可重用的Ant脚本
Maven的版本¶
Maven现在主要有Maven 1.x和Maven 2.x,其中现在最新版本是Maven 2.02。
Maven 2完成了对Maven 1的重写。重写的首要目的是要提供了强大的Jave构建和包含API的项目,允许Maven被植入任何地方,尤其是高级别的产品如IDEs、质量工具、报告工具等这些。Maven 2构建生命周期的概念正式化,其比Maven更易扩展。
因此现在我们主要研究的就是Maven 2。
Maven的安装¶
Windows 2000/xp下的安装¶
- 解压缩maven-2.0.2-bin.zip到你希望安装Maven 2.0.2的所在目录。这里假设你选择了C:\ProgramFiles\Apache Software Foundation\maven-2.0.2.
- 将C:\Program Files\Apache Software Foundation\maven-2.0.2\bin目录加入到你的%path%环境变量中。
- 同时,确认JAVA_HOME是否正确设置成功。
- 运行 mvn --version 确认是否安装成功。
显示Maven version: 2.0.2 则表示安装成功。
基于Unxi-based的操作系统(Linux,Solaris and Mac OS X)¶
- 解压缩发布包到你希望安装Maven 2.0.2的所在目录。这里假设你选择了/usr/local/maven-
- 将/usr/local/maven-2.0.2/bin目录加入到你的path环境变量中,例如:PATH=/usr/local/maven-2.0.2y/bin: $PATH。
- 同时,确认JAVA_HOME是否正确设置成功。
- 运行 mvn --version 确认是否安装成功。
显示Maven version: 2.0.2 则表示安装成功。
查看依赖库的位置
http://mvnrepository.com/ ¶
Maven主要功能¶
Maven是一种对项目的管理工具,它提供了一种方式来管理以下项目中涉及到的工作内容,同时以下也是Maven的主要功能:
- 构建项目(Builds)
- 文档编制(Documentation)
- 报告(Reporting)
- 依赖管理(Dependencies)
- 配置管理(SCMs)
- 发布管理(Releases)
构建项目¶
首先创建一个Maven工程。Maven可用于构建java应用工程和java web应用工程。
web项目¶
mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-webapp -DarchetypeArtifactId=maven-archetype-webapp
目录结果如下:
my-webapp |-- pom.xml `-- src `-- main |-- webapp | |-- WEB-INF | | `-- web.xml | `--index.jsp `-- resources
其他的目录则需要自己补充。
其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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany.app</groupId> <artifactId>my-webapp</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name>Maven Webapp Archetype</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> <build> <finalName>my-webapp</finalName> </build> </project>
java应用程序¶
mvn archetype:create -DgroupId=com.mycompany.ap -DartifactId=my-app
命令正确执行后,生成如下目录:
my-app |-- pom.xml `-- src |-- main | `-- java | `-- com | `-- mycompany | `-- app | `-- App.java `-- test `-- java `-- com `-- mycompany `-- app `-- AppTest.java
其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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany.ap</groupId> <artifactId>my-app</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>Maven Quick Start Archetype</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project>
Maven项目的标准目录介绍¶
Maven提倡使用一个共同的标准目录结构,使开发人员能在熟悉了一个Maven工程后,对其他的Maven工程也能清晰了解。这样做也省去了很多设置的麻烦。
以下的文档介绍是Maven希望的目录结构,并且也是目录创建工程是采用的目录结构。Maven推荐大家尽可能的遵守这样的目录结构。
src/main/java - 应用程序/库源码
src/main/resources - 应用程序/库资源
src/main/filters - 资源的filter文件
src/main/assembly - assembly描述符
src/main/config - 配置文件
src/main/webapps - Web应用程序源码
src/test/java - 测试源码
src/test/resources - 测试资源
src/test/filters - 测试资源的filter
src/site - 站点
LICENSE.txt - 项目许可
README.txt - 项目readmine
在顶级目录上是工程的描述文件pom.xml(如果使用Ant则还包括其他属性文件,maven.xml或build.xml),另外还包括提供给最终用户的文件,如,README.txt, LICENSE.txt等等。
顶级目录还包括两个子目录:src,target。顶级目录下可能出现的其他目录仅仅是CVS或.svn和其他多模块工程的工程目录,最好不要再有其他目录。
Target目录是所有工程编译构建的输出目录。
Src目录包含所有工程的源码文件,配置文件,资源文件等等。它下面的子目录一般包含main(主要的工程源文件),test(测试文件),site(项目站点文件)。
项目构建的生命周期的介绍¶
Maven 2是围绕着构建生命周期概念设计的。这意味着,构建或者发布的过程已经被清晰的定义了。
当我们使用Maven构建工程时,我们只需要了解几个Maven定义好的命令即可,其他的工作则交给POM来完成。
以下给出Maven提供的构建生命周期列表:
validate 验证项目是否正确,所有必要信息是否可用。
generate-sources 生成编译所需的任意源码。
process-sources 处理源码,比如过滤一些数值。
generate-resources 生成包里所需包含的资源。
process-resources 处理资源,并拷贝到目标目录中,以便打包。
compile 编译项目源码
process-classes 对编译生成的文件进行后期处理。比如,对Java类的字节码进行修改。
generate-test-sources 生成编译所需的任意测试代码
process-test-sources 处理测试代码,比如过滤一些数值。
generate-test-resources 生成测试用资源
process-test-resources 处理资源,并拷贝到测试用的目标目录中。
test-compile 编译测试代码,放到测试目标目录
test 用合适的单元测试框架来运行测试。这些测试不应当要求代码被打包或部署。
package 把编译好的代码打包成可以发布的格式,例如JAR
pre-integration-test 执行集成测试之前必须完成的动作,比如,设置集成测试所需的环境。
integration-test 执行集成测试。如果需要,会事先把包部署到集成测试所需的运行环境中。
post-integration-test 执行集成测试之后必须完成的动作,比如运行环境的清理。
verify 检查包是否合法,是否满足特定的质量要求
install 把包安装在本地仓库中,以便作为本地其他项目的依赖。
deploy 在集成或发布环境中完成部署,并且把最终的包拷贝到远程仓库中,以便被其他开发人员和工程所共享。
因此,当我们构建一个项目时,只需要了解自己希望做什么,然后执行以上对应的生命周期即可。
例如,我们希望编译我们的工程。在命令行状态下进入到工程的pom.xml文件所在的目录中,使用命令:mvn compile;希望构建打包我们的工程,使用mvn package即可。
当然了,maven的构建生命周期也是可以扩展和自定义的,这里就先不做介绍了。
pom.xml介绍¶
pom.xml包含了一个项目的项目对象模型(POM)。项目对象模型(POM)是Maven工作的基本单元。请记住,这个是非常重要的,因为POM包含了工程的非常重要的信息块,并且基本上包含了和项目相关的任何要素。
让我们熟悉一下pom.xml包含的基本项:
- poject 这是pom.xml的顶级元素。
- modelVersion 这是元素指出了这个POM使用的是那个版本的对象模型。这个模型的版本自身么是经常改变的,但这种改变是为了使模型更加的稳定。
- groupId 这个元素指出创建这个工程的组织或团队的唯一标识,并且这个也是一个项目的关键标识,推荐使用这个组织或团队的完整域名。例如:org.apache.maven.plugins是为Maven plug-ins定义的groupId。
- artifactId 这个元素指出这个工程的主要制品的基本名称。一个工程的主要制品如果是jar文件,次要制品如果是源码包,则次要制品的名称的一部分也使用 artifactId。典型的制品名称使用这样的格式:<artifactId>-<version>.<extension>(例如,myapp- 1.0.jar)。
- packaging 这个元素指出制品的类型(例如:JAR,WAR,EAR等等)。这个元素不仅仅指示出制品的类型,同时也指示出工程构建过程中的部分生命周期。Packaging的默认值是JAR。
- version 这个元素指出这个项目产生的制品的版本号,Maven在帮助开发人员管理版本号时走了很长的路,以后你将经常看到SNAPSHOT在一个版本中,这个表示一个工程仍然在开发状态。
- name 这个元素指出这个工程显示的名称。这个常用于Maven产生的文档中。
- url 这个员算指出在哪里能发现工程的站点。这个常用于Maven产生的文档中。
- desription 这个元素提供了这个工程基本的描述。这个也常用于Maven产生的文档中。
以上只是pom.xml中的一些基本项,完整的pom.xml的元素介绍请参考:
http://maven.apache.org/maven-model/maven.html
文档编制¶
文档创建:¶
对于如何创建和编制文档,maven有一个简单的示例命令:
mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-site
执行了以上命令后,我们将得到这样一个目录结构:
my-app |-- pom.xml `-- src |-- site |-- apt | |-- format.apt | `-- index.apt |-- fml | `-- faq.fml |-- fr | |-- apt | | |-- format.apt | | `-- index.apt | |-- fml | | `-- faq.fml | `-- xdoc | `-- xdoc.xml |-- site.xml |-- site_fr.xml `-- xdoc `-- xdoc.xml
你现在可以看到一个$basedir/src/site目录,以及它包含的一些站点描述文件(site.xml,site_fr_xml),和各种maven支持的文档格式相对应的目录和示例文档都已经产生。
以上的创建只是示例,我们自己创建时就没有命令行使用了,只能按照上面的目录结构创建我们需要的文档,并在文档中写入我们工程的信息。
让我们再来看看maven所支持的文档格式。
文档格式¶
Maven支持3种文档格式:
- Xdoc format 这个是一种简单快捷的,基于original Anakia format的文件格式。
- APT format “Almost Plain Text”,(接近普通文本格式),这是一种允许你采用接近普通文本格式的方式简单的写出类似于wiki格式的结构性文档。
如果你对此很感兴趣,请参考完整的APT format的书写规范
http://maven.apache.org/guides/mini/guide-apt-format.html
- FML formate 这个是一种FAQ结构形式的文档格式。
了解了以上的文档格式,我们就可以按照以上文档格式的要求,选用我们喜欢的文档格式编写我们的文档。当编写完成后,我们需要生成所有文档。这里生成文档,maven的处理是生成站点(site),也就是身成html页面,这样所有对此项目感兴趣的人员都可以通过访问此站点来了解所有的信息。生成站点的命令是:
mvn site
文档国际化¶
当然,你可能早就想到文档国际化的问题,这里maven也早就处理了。在pom.xml中
<project> ... <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-site-plugin</artifactId> <configuration> <locales>en,fr</locales> </configuration> </plugin> </plugins> ... </project>
注意到<locales>en,fr</locales>了吗?这里就支持了英语(en)和法语(fr)两种语言的文档。请注意以下生成的目录,由于英语是在第一个,属于默认语言,所以$basedir/src/site目录下并没有en的文件夹,而有fr的文件夹,而且这个文件夹里包含了maven支持的文档格式相对应的目录和示例文档。
报告设置¶
Maven有多个报告能添加在你的文档站点中,来显示项目当前的状态,这些报告采用插件的形式可在项目中配置。
为了为你的文档站点增加这些报告,必须增加reporting部分在pom.xml中,下面这个为标准的项目信息报告插件在pom.xml中的配置。
<project> ... <reporting> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-project-info-reports-plugin</artifactId> </plugin> </plugins> </reporting> ...
Maven在执行mvn site命令时,除了产生开发人员编制的文档信息外,根据pom.xml中设置的报告,会同时生成这个项目信息的报告文档。并且这个是默认的生成项。
这个默认的生成项将根据项目的信息生成以下报告:
- 持续集成信息(Continuous Integration)
- 依赖性信息(Dependencies)
- 发布追踪信息(Issue Tracking)
- 邮件列表信息(Mailing Lists)
- 工程协议信息(Project License)
- 项目团队信息(Project Team)
- 源码库信息(Source Repository)
根据笔者测试,以上信息均是在pom.xml进行设置的。
- 持续集成信息根据以下配置信息生成:
<ciManagement> <system/> <url/> <notifiers> <notifier> <type/> <sendOnError/> <sendOnFailure/> <sendOnSuccess/> <sendOnWarning/> <address/> <configuration/> </notifier> </notifiers> </ciManagement>
依赖性信息根据以下配置信息有关
<dependencies> <dependency> <groupId/> <artifactId/> <version/> <type/> <classifier/> <scope/> <systemPath/> <exclusions> <exclusion> <artifactId/> <groupId/> </exclusion> </exclusions> <optional/> </dependency> </dependencies>
issue追踪信息
<issueManagement> <system/> <url/> </issueManagement>
邮件列表信息
<mailingLists> <mailingList> <name/> <subscribe/> <unsubscribe/> <post/> <archive/> <otherArchives/> </mailingList> </mailingLists>
笔者在pom.xml中设置以上信息后,运行 mvn site 总会报错。如果哪位了解到报错原因请告诉我,谢谢。zhangxl@sintal.cn
工程协议信息
<licenses> <license> <name/> <url/> <distribution/> <comments/> </license> </licenses>
项目团队信息
<organization> <name/> <url/> </organization> <developers> <developer> <id/> <name/> <email/> <url/> <organization/> <organizationUrl/> <roles/> <timezone/> <properties/> </developer> </developers> <contributors> <contributor> <name/> <email/> <url/> <organization/> <organizationUrl/> <roles/> <timezone/> <properties/> </contributor> </contributors>
源码库信息
<scm> <connection/> <developerConnection/> <tag/> <url/> </scm>
默认情况下这些文档将生成在$basedir/src/site目录下。
需要得到其他的报告,则需要配置其他的报告插件。
要想了解更多的信息,请参考以下网页:http://cvs.peopleware.be/training/maven/maven2/morePlugins.html