首页 > 代码库 > 随笔一记-Maven
随笔一记-Maven
一、Maven的基本概念
Maven(翻译为"专家", "内行")是跨平台的项目管理工具。主要服务于基于Java平台的项目构建, 依赖管理和项目信息管理
1.1、项目构建
项目构建过程包括【清理项目】→【编译项目】→【测试项目】→【生成测试报告】→【打包项目】→【部署项目】这几个步骤, 这六个步骤就是一个项目的完整构建过程, 理想的项目构建是高度自动化, 跨平台, 可重用的组件, 标准化的, 使用maven就可以帮我们完成上述所说的项目构建过程。
1.2、依赖管理
依赖指的是jar包之间的相互依赖, 比如我们搭建一个Struts2的开发框架时, 光光有struts2-core-2.3.16.3.jar这个jar包是不行的, struts2-core-2.3.16.3.jar还依赖其它的jar包, 依赖管理指的就是使用Maven来管理项目中使用到的jar包, Maven管理的方式就是“自动下载项目所需要的jar包, 统一管理jar包之间的依赖关系”。
1.3、使用Maven的好处
Maven中使用约定, 约定java源代码代码必须放在哪个目录下, 编译好的java代码又必须放到哪个目录下, 这些目录都有明确的约定。
Maven的每一个动作都拥有一个生命周期, 例如执行 mvn install 就可以自动执行编译, 测试, 打包等构建过程
只需要定义一个pom.xml,然后把源码放到默认的目录, Maven帮我们处理其他事情
使用Maven可以进行项目高度自动化构建, 依赖管理(这是使用Maven最大的好处), 仓库管理。
二、Maven下载
下载地址:https://maven.apache.org/download.cgi
下载完成后, 得到一个压缩包, 解压, 可以看到maven的组成目录
Maven目录分析
- bin:含有mvn运行的脚本
- boot:含有plexus-classworlds类加载器框架
- conf:含有settings.xml配置文件
- lib:含有Maven运行时所需要的java类库
- LICENSE.txt, NOTICE.txt, README.txt针对Maven版本,第三方软件等简要介绍
三、Maven安装
2.1、首先要确保电脑上已经安装了JDK
(最好jdk 1.6+的版本),配置好JDK的环境变量,使用如下的两个命令检查检查JDK安装的情况
1 Echo %JAVA_HOME% 2 Java -version
2.2、对apache-maven-3.2.3-bin.zip进行解压缩
对apache-maven-3.2.3-bin.zip进行解压缩, (解压目录最好不要有中文)
2.3、设置系统环境变量:MAVEN_HOME
2.4、设置环境变量Path
将%MAVEN_HOME%\bin加入Path中,一定要注意要用分号;与其他值隔开
2.5、验证Maven安装是否成功
cmd窗口输入"mvn –v"命令 查看Maven的相关信息
2.6、设置MAVEN_OPTS环境变量(可选配置)
由于Maven命令实际上是执行了Java命令,所以可以通过JAVA命令参数的方式来设置MAVEN运行参数。MAVEN_OPTS环境变量正是用于此用途
MAVEN_OPTS = -Xms128m -Xmx512m,分别设置JVM的最小和最大内存
四、Maven的简单使用
4.1、Maven项目的目录约定
MavenProjectRoot(项目根目录)
|----src
| |----main
| | |----java ——存放项目的.java文件
| | |----resources ——存放项目资源文件,如spring, hibernate配置文件
| |----test
| | |----java ——存放所有测试.java文件,如JUnit测试类
| | |----resources ——存放项目资源文件,如spring, hibernate配置文件
|----target ——项目输出位置
|----pom.xml ----用于标识该项目是一个Maven项目
4.2、手动创建Maven项目,使用Maven编译
1、创建项目根文件夹,例如Maven01
2、在Maven01文件夹中创建“pom.xml”文件
pom.xml文件中的内容如下
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 5 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 6 <!--所有的Maven项目都必须配置这四个配置项--> 7 <modelVersion>4.0.0</modelVersion> 8 <!--groupId指的是项目名的项目组,默认就是包名--> 9 <groupId>cn.gacl.maven.hello</groupId> 10 <!--artifactId指的是项目中的某一个模块,默认命名方式是"项目名-模块名"--> 11 <artifactId>hello-first</artifactId> 12 <!--version指的是版本,这里使用的是Maven的快照版本--> 13 <version>SNAPSHOT-0.0.1</version> 14 </project>
3.编写Java类文件
Maven项目规定,所有的*.java文件必须放在src目录下的main目录下的java目录中,在Maven01项目根目录中创建一个src目录,然后在src目录中创建main目录,在main目录中再创建java文件夹
在java文件夹下创建一个Hello.java文件
在Hello.java文件中编写如下代码:
1 public class Hello{ 2 public static void main(String[] args){ 3 System.out.println("Hello Maven"); 4 } 5 }
4.使用Maven编译Hello.java
首先进入到项目根目录,然后使用命令”mvn compile”进行编译
使用Maven编译完成之后,在项目根目录下会生成一个target文件夹
打开target文件夹,可以看到里面有一个classes文件夹, classes文件夹存放的就是编译成功后生成的.class文件
5.使用"mvn clean"命令清除编译结果,也就是把编译生成的target文件夹删掉
4.3、Maven坐标主要组成
· groupId:组织标识(包名)
· artifactId:项目名称
· version:项目的当前版本
· packaging:项目的打包方式,最为常见的jar和war两种
4.4、依赖范围
依赖范围scope用来控制依赖和编译,测试,运行的classpath的关系. 主要的是三种依赖关系如下:
1.compile:默认编译依赖范围。对于编译,测试,运行三种classpath都有效
2.test:测试依赖范围。只对于测试classpath有效
3.provided:已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为由容器已经提供,例如servlet-api
4.runtime:运行时提供。例如:jdbc驱动
4.5、Maven仓库布局
根据Maven坐标定义每个构建在仓库中唯一存储路径,
大致为:groupId/artifactId/version/artifactId-version.packaging
4.6、仓库的分类
4.6.1、本地仓库
每个用户只有一个本地仓库,默认是在~/.m2/repository/,~代表的是用户目录
4.6.2、远程仓库
1、中央仓库:Maven默认的远程仓库,URL地址:http://search.maven.org/
2、私服:是一种特殊的远程仓库,它是架设在局域网内的仓库
五、生命周期
5.1、何为生命周期?
Maven生命周期就是为了对所有的构建过程进行抽象和统一,包括项目清理,初始化,编译,打包,测试,部署等几乎所有构建步骤
5.2、Maven三大生命周期
Maven有三套相互独立的生命周期,请注意这里说的是"三套",而且"相互独立",这三套生命周期分别是:
Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。
Site Lifecycle 生成项目报告,站点,发布站点。
再次强调一下它们是相互独立的,你可以仅仅调用clean来清理工作目录,仅仅调用site来生成站点。当然你也可以直接运行 mvn clean install site 运行所有这三套生命周期。
clean生命周期每套生命周期都由一组阶段(Phase)组成,我们平时在命令行输入的命令总会对应于一个特定的阶段。比如,运行mvn clean ,这个的clean是Clean生命周期的一个阶段。有Clean生命周期,也有clean阶段。Clean生命周期一共包含了三个阶段:
pre-clean 执行一些需要在clean之前完成的工作
clean 移除所有上一次构建生成的文件
post-clean 执行一些需要在clean之后立刻完成的工作
"mvn
clean" 中的clean就是上面的clean,在一个生命周期中,运行某个阶段的时候,它之前的所有阶段都会被运行,也就是说,"mvn clean"等同于
mvn pre-clean clean ,如果我们运行 mvn post-clean ,那么
pre-clean,clean 都会被运行。这是Maven很重要的一个规则,可以大大简化命令行的输入。
Site生命周期pre-site 执行一些需要在生成站点文档之前完成的工作
site 生成项目的站点文档
post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
site-deploy 将生成的站点文档部署到特定的服务器上
这里经常用到的是site阶段和site-deploy阶段,用以生成和发布Maven站点,这可是Maven相当强大的功能,Manager比较喜欢,文档及统计数据自动生成,很好看。
Default生命周期Default生命周期是Maven生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中。这里,只解释一些比较重要和常用的阶段:
validate
generate-sources
process-sources
generate-resources
process-resources 复制并处理资源文件,至目标目录,准备打包。
compile 编译项目的源代码。
process-classes
generate-test-sources
process-test-sources
generate-test-resources
process-test-resources 复制并处理资源文件,至目标测试目录。
test-compile 编译测试源代码。
process-test-classes
test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。
prepare-package
package 接受编译好的代码,打包成可发布的格式,如 JAR 。
pre-integration-test
integration-test
post-integration-test
verify
install 将包安装至本地仓库,以让其它项目依赖。
deploy 将最终的包复制到远程的仓库,以让其它开发人员与项目共享。
运行任何一个阶段的时候,它前面的所有阶段都会被运行,这也就是为什么我们运行mvn install 的时候,代码会被编译,测试,打包。此外,Maven的插件机制是完全依赖Maven的生命周期的,因此理解生命周期至关重要。
六、Maven插件
1.Maven的核心仅仅定义了抽象的生命周期,具体的任务都是交由插件完成的。
2.每个插件都能实现多个功能,每个功能就是一个插件目标。
3.Maven的生命周期与插件目标相互绑定,以完成某个具体的构建任务,例如compile就是插件maven-compiler-plugin的一个插件目标
6.1、聚合配置代码
<modules> <module>模块一</module> <module>模块二</module> <module>模块三</module> </modules>
6.2、继承配置代码
<parent> <groupId>me.gacl.maven</groupId> <artifactId>ParentProject</artifactId> <version>0.0.1-SNAPSHOT</version> <relativePath>../ParentProject/pom.xml</relativePath> </parent>
6.3、继承代码中定义属性
访问属性的方式为${junit.version}
随笔一记-Maven