Maven基础简介
2017-01-03 00:00
363 查看
摘要: 本文主要摘自 徐晓斌先生的 “Maven实践”一书。
写此文的目的就是将自己一直以来对Maven的困惑的地方整理并配以官方解答。
本文编写的环境:
Windows系统、Maven 3.0、JDK 5、IDEA
Maven是优秀的构建工具,能够帮助我们自动化构建过程,
从清理clean、编译compile、测试test到自动生成报告,再到打包package和部署deploy。
它是跨平台的,在Windows、Linux、Mac上都可以使用同样的命令。
Maven不仅是构建工具,还是一个依赖管理工具和项目信息管理工具,它提供了中央仓库,能帮助我们自动下载构件。
Maven官网:http://maven.apache.org/index.html
bin:该目录包含mvn运行的脚本,准备好classpath和相关的java系统属性,然后执行java命令,
其中mvn是基于unix平台的脚本,mvn.bat是基于windows的脚本;
m2.conf文件,这是classworlds的配置文件;
boot:只包含一个文件 plexus-classworlds-2.4.2.jar 。plexus-classworlds是一个类加载器框架,相当于默认的java类加载器;
conf:该目录包含了一个非常重要的文件 setting.xml,直接修改该文件,就能在机器上全局的定制Maven的行为;
lib:该目录包含了Maven运行时需要的Java类库;
LICENSE.txt:记录了Maven使用的软件许可证;
NOTICE.txt:记录了Maven包含的第三方软件;
README.txt:包含了Maven的简单介绍,包括安装需求和如何安装的简要指令等。
经常会java.lang.OutOfMemeoryError,
因此通常需要设置MAVEN_OPTS的值为“- Xms128m - Xmx512m”。
方法:将MAVEN_OPTS设定为环境变量,一次制定,一劳永逸。
win7下设置方法如下:
~/.m2/setting.xml : 是用户范围的,只有当前用户才会受到该配置的影响。
其中setting.xml中,localRepository:表示Maven用来在本地储存信息的本地仓库的目录。
默认是用户目录下面的.m2/repository目录。
POM:定义了项目的基本信息,用于描述项目如何构建,声明项目依赖等等。
第一行:XML头,指定了该xml文档的版本和编码格式;
project元素:是所有xml的根元素,它还声明了一些POM相关命名空间和xsd元素;
modelVersion子元素:指定了当前POM模型的版本;
groupId子元素:定义了项目是属于哪一个组,一般和项目所在的组织和公司存在关联;
artifactId子元素:定义了当前Maven项目在组中唯一的ID;
version子元素:指定了当前项目的版本,SNAPSHOT意为快照,说明该项目处于开发中,随着项目的发展,version会不断升级更新;
name子元素:声明了一个对于用户更为友好的项目名称,方便交流。
其中【groupId】、【artifactId】、【version】是任何一个Maven项目最基本的坐标。
代码中添加dependencies元素,该元素下可以包含多个dependency元素以声明项目的依赖,
有了这段声明,Maven会自动下载junit-4.11.jar。
(Maven会自动访问中央仓库【http://repo1.maven.org/maven2/】下载需要的jar)
上述POM代码中还有子元素scope,为依赖范围,就是用来控制依赖与classpath(编译classpath、测试classpath、运行classpath)的关系。
Maven有以下集中依赖范围:
compile:编译依赖范围,如果没有指定,就会默认使用该依赖范围,此依赖范围对于编译、测试、运行三种classpath都有效。
test:测试依赖范围,只对测试classpath有效,在编译主代码或者运行项目的使用时将无法使用此类依赖。
provided:已提供依赖范围,对于编译和测试classpath有效,但在运行时无效。
runtime:运行时依赖范围,对于测试和运行classpath有效,但在编译主代码时无效。
例如,log4j:log4j:1.2.15这一依赖,其对应的仓库路径为log4j/log4j/1.2.15/log4j-1.2.15.jar,
该路径与坐标的大致对应关系为groupId/artifactId/version/artifactId-version.packaging。
当Maven根据坐标寻找构件的时候,它首先查本地仓库,如果本地仓库存在此构件,则直接使用,
否则会去远程仓库寻找,并且下载到本地再使用,
如果本地和远程都不存在,Maven就会报错。
包括项目清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成 等几乎所有构建步骤。
Maven拥有三套互相独立的生命周期,分别是:clean、default、site。
clean生命周期是清理项目;
default生命周期是构建项目;
site生命周期是简历项目站点。
clean:清理上一次构建生成的文件;
post-clean:执行一些清理后需要完成的工作。
以下命令详细使用规则也可以参照官网:
http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
validate:validate the project is correct and all necessary information is available.
initialize:initialize build state, e.g. set properties or create directories.
generate-sources:generate any source code for inclusion in compilation.
process-source:处理项目主资源文件,一般来说,是对src/main/resources目录的内容进行变量替换等工作后,复制到项目输出的主classpath目录中。
generate-resources:generate resources for inclusion in the package.
process-resources:copy and process the resources into the destination directory, ready for packaging.
compile:编译项目的主源码,一般来说,是编译src/main/java目录下的Java文件至项目输出的主classpath目录中。
process-classes:post-process the generated files from compilation, for example to do bytecode enhancement on Java classes.
generate-test-sources:generate any test source code for inclusion in compilation.
process-test-sources:处理项目测试资源文件。一般来说,是对src/test/resources目录的内容进行变量替换等工作后,复制到项目输出的测试classpath目录中。
generate-test-resources:create resources for testing.
process-test-resources:copy and process the resources into the test destination directory.
test-compile:编译项目的测试代码,一般来说,是编译src/test/java目录下的Java文件至项目输出的测试classpath目录中。
process-test-classes:post-process the generated files from test compilation, for example to do bytecode enhancement on Java classes.
test:使用单元测试框架运行测试,测试代码不会被打包或者部署
prepare-package:perform any operations necessary to prepare a package before the actual packaging.
package:接受编译好的代码,打包成可发布的格式,如JAR、WAR
pre-integration-test:perform actions required before integration tests are executed. This may involve things such as setting up the required environment.
integration-test:process and deploy the package if necessary into an environment where integration tests can be run.
post-integration-test:perform actions required after integration tests have been executed. This may including cleaning up the environment.
varify:run any checks to verify the package is valid and meets quality criteria.
install:将包安装到Maven本地仓库,共本地其他Maven项目使用
deploy:将最终的包复制到远程仓库,供其他人员或者Maven项目使用
pre-site:执行一些在生成站点前需要完成的工作;
site:生成项目站点文档;
post-site:执行一些在生成站点后需要完成的工作;
site-deploy:将生成的项目站点发布发哦服务器上。
clean生命周期与对应插件
default生命周期与插件及具体任务
site生命周期与对应插件
如果用IDEA打开Maven项目,在右边栏Maven Projects中有一些常用的Lifecycle和Plugins
可以直接双击执行命令
未完待续......
以上内容如有问题,请帮忙评论告知,不胜感谢!
附件图片来自于徐晓斌先生的 “Maven实践”一书:
写此文的目的就是将自己一直以来对Maven的困惑的地方整理并配以官方解答。
本文编写的环境:
Windows系统、Maven 3.0、JDK 5、IDEA
一、序言
Maven是跨平台项目管理工具,主要服务 基于Java平台的项目构建、依赖管理、项目信息管理。Maven是优秀的构建工具,能够帮助我们自动化构建过程,
从清理clean、编译compile、测试test到自动生成报告,再到打包package和部署deploy。
它是跨平台的,在Windows、Linux、Mac上都可以使用同样的命令。
Maven不仅是构建工具,还是一个依赖管理工具和项目信息管理工具,它提供了中央仓库,能帮助我们自动下载构件。
Maven官网:http://maven.apache.org/index.html
二、Maven的安装和配置
在windows上安装Maven需要检查JDK,maven可以运行在JDK 1.4及以上版本。2.1、Maven安装完后 需要配置Path环境变量
2.2、M2_HOME
看一下该目录的结构和内容:bin:该目录包含mvn运行的脚本,准备好classpath和相关的java系统属性,然后执行java命令,
其中mvn是基于unix平台的脚本,mvn.bat是基于windows的脚本;
m2.conf文件,这是classworlds的配置文件;
boot:只包含一个文件 plexus-classworlds-2.4.2.jar 。plexus-classworlds是一个类加载器框架,相当于默认的java类加载器;
conf:该目录包含了一个非常重要的文件 setting.xml,直接修改该文件,就能在机器上全局的定制Maven的行为;
lib:该目录包含了Maven运行时需要的Java类库;
LICENSE.txt:记录了Maven使用的软件许可证;
NOTICE.txt:记录了Maven包含的第三方软件;
README.txt:包含了Maven的简单介绍,包括安装需求和如何安装的简要指令等。
2.3、设置MAVEN_OPTS环境变量
因为Java默认的最大可用内存往往不能满足Maven运行的需要,经常会java.lang.OutOfMemeoryError,
因此通常需要设置MAVEN_OPTS的值为“- Xms128m - Xmx512m”。
方法:将MAVEN_OPTS设定为环境变量,一次制定,一劳永逸。
win7下设置方法如下:
1 右键我的电脑,选择属性 2 选择 高级系统设置 3 在 高级 tab页下,点击 环境变量 按钮 4 创建一个用户变量,变量名是MAVEN_OPTS 值为 - Xms128m - Xmx512m 5 保存...
2.4、配置用户范围,setting.xml
安装路径下/conf/setting.xml : 全局范围,整台机器上所有用户都会直接受到该配置的影响。~/.m2/setting.xml : 是用户范围的,只有当前用户才会受到该配置的影响。
其中setting.xml中,localRepository:表示Maven用来在本地储存信息的本地仓库的目录。
默认是用户目录下面的.m2/repository目录。
三、Maven的POM【Project Object Model(项目对象模型) 】
Maven项目的核心是pom.xml。POM:定义了项目的基本信息,用于描述项目如何构建,声明项目依赖等等。
3.1、新建pom.xml文件
<?xml version="1.0" encoding="UTF-8"?> <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.movitech.mavenDemo</groupId> <artifactId>maven-demo</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <name>Maven Demo Project</name> </project>
第一行:XML头,指定了该xml文档的版本和编码格式;
project元素:是所有xml的根元素,它还声明了一些POM相关命名空间和xsd元素;
modelVersion子元素:指定了当前POM模型的版本;
groupId子元素:定义了项目是属于哪一个组,一般和项目所在的组织和公司存在关联;
artifactId子元素:定义了当前Maven项目在组中唯一的ID;
version子元素:指定了当前项目的版本,SNAPSHOT意为快照,说明该项目处于开发中,随着项目的发展,version会不断升级更新;
name子元素:声明了一个对于用户更为友好的项目名称,方便交流。
其中【groupId】、【artifactId】、【version】是任何一个Maven项目最基本的坐标。
3.2、为项目添加依赖 dependencies
<?xml version="1.0" encoding="UTF-8"?> <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.movitech.mavenDemo</groupId> <artifactId>maven-demo</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <name>Maven Demo Project</name> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies> </project>
代码中添加dependencies元素,该元素下可以包含多个dependency元素以声明项目的依赖,
有了这段声明,Maven会自动下载junit-4.11.jar。
(Maven会自动访问中央仓库【http://repo1.maven.org/maven2/】下载需要的jar)
上述POM代码中还有子元素scope,为依赖范围,就是用来控制依赖与classpath(编译classpath、测试classpath、运行classpath)的关系。
Maven有以下集中依赖范围:
compile:编译依赖范围,如果没有指定,就会默认使用该依赖范围,此依赖范围对于编译、测试、运行三种classpath都有效。
test:测试依赖范围,只对测试classpath有效,在编译主代码或者运行项目的使用时将无法使用此类依赖。
provided:已提供依赖范围,对于编译和测试classpath有效,但在运行时无效。
runtime:运行时依赖范围,对于测试和运行classpath有效,但在编译主代码时无效。
四、Maven仓库
在maven世界中,任何一个依赖、插件或者项目构建的输入,都可以称为构件。4.1、仓库布局
任何构件都有其唯一的坐标,根据这个坐标可以定义其在仓库中唯一存储路径,这便是Maven的仓库布局方式,例如,log4j:log4j:1.2.15这一依赖,其对应的仓库路径为log4j/log4j/1.2.15/log4j-1.2.15.jar,
该路径与坐标的大致对应关系为groupId/artifactId/version/artifactId-version.packaging。
4.2、仓库分类
对于Maven来说,仓库分为两类:本地仓库和远程仓库。当Maven根据坐标寻找构件的时候,它首先查本地仓库,如果本地仓库存在此构件,则直接使用,
否则会去远程仓库寻找,并且下载到本地再使用,
如果本地和远程都不存在,Maven就会报错。
五、生命周期 Lifecycle
Maven的生命周期就是为了对所有的构建过程进行抽象和统一。包括项目清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成 等几乎所有构建步骤。
Maven拥有三套互相独立的生命周期,分别是:clean、default、site。
clean生命周期是清理项目;
default生命周期是构建项目;
site生命周期是简历项目站点。
5.1、clean生命周期的三个阶段
pre-clean:执行一些清理前需要完成的工作;clean:清理上一次构建生成的文件;
post-clean:执行一些清理后需要完成的工作。
5.2、default生命周期
default生命周期定义了真正构建时所需要执行的所有步骤,是生命周期中最核心的部分以下命令详细使用规则也可以参照官网:
http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
validate:validate the project is correct and all necessary information is available.
initialize:initialize build state, e.g. set properties or create directories.
generate-sources:generate any source code for inclusion in compilation.
process-source:处理项目主资源文件,一般来说,是对src/main/resources目录的内容进行变量替换等工作后,复制到项目输出的主classpath目录中。
generate-resources:generate resources for inclusion in the package.
process-resources:copy and process the resources into the destination directory, ready for packaging.
compile:编译项目的主源码,一般来说,是编译src/main/java目录下的Java文件至项目输出的主classpath目录中。
process-classes:post-process the generated files from compilation, for example to do bytecode enhancement on Java classes.
generate-test-sources:generate any test source code for inclusion in compilation.
process-test-sources:处理项目测试资源文件。一般来说,是对src/test/resources目录的内容进行变量替换等工作后,复制到项目输出的测试classpath目录中。
generate-test-resources:create resources for testing.
process-test-resources:copy and process the resources into the test destination directory.
test-compile:编译项目的测试代码,一般来说,是编译src/test/java目录下的Java文件至项目输出的测试classpath目录中。
process-test-classes:post-process the generated files from test compilation, for example to do bytecode enhancement on Java classes.
test:使用单元测试框架运行测试,测试代码不会被打包或者部署
prepare-package:perform any operations necessary to prepare a package before the actual packaging.
package:接受编译好的代码,打包成可发布的格式,如JAR、WAR
pre-integration-test:perform actions required before integration tests are executed. This may involve things such as setting up the required environment.
integration-test:process and deploy the package if necessary into an environment where integration tests can be run.
post-integration-test:perform actions required after integration tests have been executed. This may including cleaning up the environment.
varify:run any checks to verify the package is valid and meets quality criteria.
install:将包安装到Maven本地仓库,共本地其他Maven项目使用
deploy:将最终的包复制到远程仓库,供其他人员或者Maven项目使用
5.3、site生命周期
site生命周期的目的是建立和发布项目站点,Maven能够基于POM所包含的信息,自动生成一个友好的站点,方便团队交流和发布项目信息,pre-site:执行一些在生成站点前需要完成的工作;
site:生成项目站点文档;
post-site:执行一些在生成站点后需要完成的工作;
site-deploy:将生成的项目站点发布发哦服务器上。
六、Maven插件 Plugins
Maven的核心仅仅是定义了抽象的生命周期,具体任务是交给插件完成的,插件以独立构建形式完成。6.1、插件绑定
Maven的生命周期是和插件互相绑定的,用以完成实际的构建任务。clean生命周期与对应插件
生命周期阶段 | 插件目标 |
---|---|
pre-clean、cean、post-clean | maven-clean-plugin:clean |
生命周期阶段 | 插件目标 | 执行任务 |
---|---|---|
process-resources | maven-resources-plugin:resources | 复制主资源文件至主输出目录 |
compile | maven-compiler-plugin:compile | 编译主代码至主输出目录 |
process-test-resources | maven-resources-plugin:testResources | 复制测试资源文件至测试输出目录 |
test-compile | maven-compiler-plugin:testCompile | 编译测试代码至测试输出目录 |
test | maven-surefire-plugin:test | 执行测试用例 |
package | maven-jar-plugin:jar | 创建项目JAR包 |
install | maven-install-plugin:install | 将项目输出构建安装到本地仓库 |
deploy | maven-deploy-plugin:deploy | 将项目输出构建部署到远程仓库 |
生命周期阶段 | 插件目标 |
---|---|
pre-site、site、post-site | maven-site-plugin:site |
site-deploy | maven-site-plugin:deploy |
可以直接双击执行命令
未完待续......
以上内容如有问题,请帮忙评论告知,不胜感谢!
附件图片来自于徐晓斌先生的 “Maven实践”一书:
相关文章推荐
- Maven基础(1):简介&安装
- maven简介及基础使用
- UML基础: 统一建模语言简介
- UML基础: 统一建模语言简介
- 转贴: BT软件的DHT技术基础——Kademlia协议原理简介
- 位运算简介及实用技巧(一):基础篇
- UML基础: 统一建模语言简介
- MS SQL入门基础:视图简介
- UML基础: 统一建模语言简介
- Maven 应用小简介 (注:maven2是指在maven1后重新开发的maven,如同java与java2)
- Enterprise JavaBeans 基础知识简介
- TCP/IP基础--1.TCP/IP协议体系结构简介
- AJAX 核心基础技术 - 非宣传性简介
- 微软70-536考试教材:.net framework2.0 应用开发基础书籍简介.属于MCTS自学教材
- OpenMP 线程化(Threading)基础(1)--并行计算简介
- AJAX 核心基础技术 - 非宣传性简介
- Visual Basic COM基础讲座之简介
- [导入]视频游戏开发系列课程(2):基础编程概念及C#简介
- Dreamweaver基础教程 (一)之新功能简介
- 3D游戏基础 Direct3D(一) D3D基本概念及渲染流水线简介