3.1. Maven
我们使用maven构建应用环境,因此我们先来简单介绍maven。Maven是什么?如何回答这个问题 要看你怎么看这个问题。绝大部分Maven用户都称Maven是一个"构建工具":一个用来把源代码构建成可发布的构件的工具。构建工程师和项目经理会说Maven是一个更复杂 的东西:一个项目管理工具。那么区别是什么? 像Ant这样的构建工具仅仅是关注预处理,编译,打包,测试和分发,而 Maven 这样的一个项目管理工具提供了构建工具所提供功能的超集, 除了提供构建的功能,Maven还可以生成报告,生成Web站点,并且帮助推动工作团 队成员间的交流。
maven约定由于配置
- maven拥有约定,因为你遵守约定,它就已经知道你的代码在哪里,它把编译文件放到target/classes,然后再targe下面生成一个jar包。这个jar包只单单是你程序的jar,依赖jar是不会和他放在一块的。你写的代码跟开源的东西一样。均是一个jar。
- maven是声明式的。把你的依赖及插件什么的都只需要声明就可以了。
- maven是有生命周期的,当你运行mvn install的时候调用。然后执行一系列的有序步骤,直到你指定的生命周期。那就是目标完成一个jar。
-
mvn archetype:create :创建 Maven 项目
-
mvn compile :编译源代码
-
mvn test-compile :编译测试代码
-
mvn test : 运行应用程序中的单元测试
-
mvn site : 生成项目相关信息的网站
-
mvn clean :清除目标目录中的生成结果(clean能够保证上一次构建的输出不会影响到本次构建)
-
mvn package : 依据项目生成 jar 文件
-
mvn install :在本地 Repository 中安装 jar
-
mvn eclipse:eclipse :生成 Eclipse 项目文件
- mvn -Dmaven.test.skip=true : 忽略测试文档编译
- mvn -U : 该参数能强制让Maven检查所有SNAPSHOT依赖更新,确保集成基于最新的状态,如果没有该参数,Maven默认以天为单位检查更新,而持续集成的频率应该比这高很多
- mvn -B : 该参数表示让Maven使用批处理模式构建项目,能够避免一些需要人工参与交互而造成的挂起状态。
- mvn -Dmaven.repo.loca=××× : 如果持续集成服务器有很多任务,每个任务都会使用本地仓库,下载依赖至本地仓库,为了避免这种多线程使用本地仓库可能会引起的冲突,可以使用-Dmaven.repo.local=/home/juven/ci/foo-repo/这样的参数为每个任务分配本地仓库。
- mvn deploy :使用deploy而不是install,构建的SNAPSHOT输出应当被自动部署到私有Maven仓库供他人使用
POM全称是Project Object Model,即项目对象模型。pom.xml是maven的项目描述文件,它类似与antx的project.xml文件。pom.xml文件以xml的 形式描述项目的信息,包括项目名称、版本、项目id、项目的依赖关系、编译环境、持续集成、项目团队、贡献管理、生成报表等等。总之,它包含了所有的项目 信息。
3.2.1. 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>org.codehaus.mojo</groupId>
<artifactId>my-project</artifactId>
<version>1.0</version>
</project>
modelVersion 描述这个POM文件是遵从哪个版本的项目描述符。
groupId 针对一个项目的普遍唯一识别符。通常用一个完全正确的包的名字来与其他项目的类似名字来进行区分(比如:org.apache.maven)。
artifactId 在给定groupID 的group里面为artifact 指定的标识符是唯一的 , artifact 代表的是被制作或者被一个project应用的组件(产出物)。
version 当前项目产生的artifact的版本
以上4个元素缺一不可,其中groupId, artifactId, version描述依赖的项目唯一标志。
3.2.2. pom.xml文件结构
<project> <modelVersion>4.0.0</modelVersion> <!- The Basics 项目的基本信息-> <groupId>...</groupId> <artifactId>...</artifactId> <version>...</version> <packaging>...</packaging> <dependencies>...</dependencies> <parent>...</parent> <dependencyManagement>...</dependencyManagement> <modules>...</modules> <properties>...</properties> <!- Build Settings 项目的编译设置-> <build>...</build> <reporting>...</reporting> <!- More Project Information 其它项目信息 -> <name>...</name> <description>...</description> <url>...</url> <inceptionYear>...</inceptionYear> <licenses>...</licenses> <organization>...</organization> <developers>...</developers> <contributors>...</contributors> <!-- Environment Settings -> <issueManagement>...</issueManagement> <ciManagement>...</ciManagement> <mailingLists>...</mailingLists> <scm>...</scm> <prerequisites>...</prerequisites> <repositories>...</repositories> <pluginRepositories>...</pluginRepositories> <distributionManagement>...</distributionManagement> <profiles>...</profiles> </project>
project是pom.xml的根节点,至于其它元素请参考POM Reference
3.2.3. POM很重要的3个关系
3.2.3.1. 依赖关系
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.0</version> <type>jar</type> <scope>test</scope> <optional>true</optional> </dependency> ... </dependencies>
如果想依赖一个maven库中没有的一个jar包,方法很简单,就是先将此jar包使用以下的命令安装到本地maven库中:
mvn install:install-file -Dfile=my.jar -DgroupId=mygroup -DartifactId=myartifactId -Dversion=1
再把依赖关系加进去即可。
3.2.3.2. 继承关系
3.2.3.2.1. 定义父项目
<project> <modelVersion>4.0.0</modelVersion> <groupId>com.mygroup </groupId> <artifactId>my-parent</artifactId> <version>2.0</version> <packaging>pom</packaging> </project>
packaging 类型,定义值为 pom用于定义为parent和合成多个项目。 当然我们创建的maven项目的pom都继承maven的super pom, 如果想看项目(父或子)的完全的pom结构,可以运行:
mvn help:effective-pom
就可以了。
3.2.3.2.2. 子项目配置
<project> <modelVersion>4.0.0</modelVersion> <groupId>com.mygroup </groupId> <artifactId>my-child-project</artifactId> <parent> <groupId>com.mygroup </groupId> <artifactId>my-parent</artifactId> <version>2.0</version> <relativePath>../my-parent</relativePath> </parent> </project>
relativePath可以不需要,但是用于指明parent的目录,用于快速查询。
3.2.3.3. 合成关系
一个项目有多个模块,也叫做多重模块,或者合成项目。 如下的定义:
<project> <modelVersion>4.0.0</modelVersion> <groupId>com.mygroup </groupId> <artifactId>my-parent</artifactId> <version>2.0</version> <modules> <module>my-child-project1<module> <module>my-child-project2<module> </modules> </project>
其中module 描述的是子项目的相对路径 。
3.2.4. dependencyManagement和Profile
Maven 还我们提供了一个dependencyManagement元素,用来提供了一种方式来统一依赖版本号。dependencyManagement元素一 般用在顶层的父POM。使用pom.xml中的dependencyManagement元素能让你在子项目中引用一个依赖而不用显式的列出版本号。 Maven会沿着父子层次向上走,直到找到一个拥有dependencyManagement元素的项目,然后它就会使用在这个 dependencyManagement元素中指定的版本号,这样就解决了修改依赖版本号不完全的问题。
Maven的Profile元素可以为一个特殊的环境自定义一个特殊的构建,使得不同环境间构建的可移植性成为可能。比如要使用 production profile来运行mvn install,你需要在命令行传入-Pproduction参数,这里production是profile的id。要验证production profile覆盖了默认的Compiler插件配置,可以像这样以开启调试输入(-X) 的方式运行Maven。
参考:http://cjch.iteye.com/blog/940855
参考:http://healthandbeauty.iteye.com/blog/1618501
参考:http://healthandbeauty.iteye.com/blog/1618464