Maven
1.Maven简介
1.1 什么是Maven
maven是apache下的一个开源项目,是纯java开发,并且只是用来管理java项目的.
1.1.1 项目对象模型
POM对象模型,每个maven工程都有个pom.xml文件,定义工程所依赖的jar包,本工程的坐标,打包运行方式.
1.1.2. 依赖管理系统(基础核心)
maven通过坐标对项目工程所依赖的jar包统一规范管理.
1.1.3 的好处
一般项目:jar包在项目中,工程笔记大.
maven管理的项目:jar包与工程分离,小巧轻便.
- 依赖管理,就是对jar包的统一管理,可以节省空间
- 一键构建
- 可以跨平台
- 应用与大型项目,可以诶提高开发效率
- maven的分模块开发
1.3 项目管理
依赖管理:项目与依赖之间的关系称为依赖管理.
1.4 项目一键构建
普通项目构建:编码 → 编译 → 测试 → 打包 → 部署
maven项目构建:编译 → 测试 → 打包 → 部署
一键运行命令: tomcat:run 能把项目运行起来.
maven 可以做的事情
编译 → 测试 → 打包 → 部署
1.5 Maven仓库介绍
1. 中央仓库
就是远程仓库,仓库中jar由专业团队(maven团队)统一维护.
中央仓库地址http://repo1.maven.org/maven2/
2. 本地仓库
相当于缓存,工程第一次会从远程仓库(互联网)去下载jar包,将jar包存放在本地仓库(在程序员的个人电脑上).第二次不需要从远程仓库去下载,先从本地仓库找,如果找不到才会去远程仓库找.
3. 私服
&emap;在公司内部架设一台服务器,其他公司可架设一台仓库,对外公开.
2. Maven的安装配置
2.1 下载安装maven软件
可以到maven的官网下载
http://maven.apache.org/download.cgi
我们将下载的压缩包解压到D盘根目录,D盘根目录会有下面的文件夹(不包含中文目录的就可以了.)
2.2 本地仓库配置.
- 打开maven的安装目录
- 找到cnf/setting.xml,打开
- D:\repository_ssh
注意:这里的意思是配置本地仓库的目录为D:\repository_ssh 配置自己的仓库地址
2.3 maven环境变量配置及配置
maven3.3x 所需要的JDK都是需要1.7以上的版本.
1. 下载maven
下载后直接解压就可以使用
2. 配置环境变量
- 配置MAVEN_HOME
- 变量名:MAVEN_HOME
- 变量值: maven的安装目录
- 配置path
- 后面加上路径,注意:前后需要用分号隔开
- ;%MAVEN_HOME\bin%;
3. 配置本地仓库
在安装目录下的conf下的 settings.xml 设置本地仓库的路径
<localRepository>C:\develop\maven\repository</localRepository>
这样maven就可以直接使用本地仓库而不需要从网上下载.如果你没有设置,本地仓库那么maven会在c:\用户\目录下新建一个文件夹.
3. 入门程序
3.1 创建工程
- 打开eclipse 创建一个MavenProject工程选择Next
- 在New Maven Project 窗口内. 勾选 Create a simple project (skip …..) , Next .
- 定义工程,Maven 对所有的工程管理基于坐标进行管理 , 填入 Group Id , Atrifact Id , 选择Finish.
名词解释
- Group Id : 项目名称, 名称名以域名倒序,不如.com.baidu.mevendemo
- Artifact Id :模块名称(子项目名称)
Version : 模块的版本, shapshot(快照版,没有正式发行),release(正式发行版本)
- 输入 Finish 后进如下图
目录结构说明
project
- /src/main/java 主体程序java源文件(不要方配置文件)
- /src/main/resources 主体程序所需要的配置文件(不要方java文件)
- /src/test/java 单元测试java源文件
- /src/test/resource 单元测试程序所用的配置文件
- /target 编译输出目录
pom.xml Maven 进行工作的主要配置文件
- 编写代码
5.1 在src/main/java 目录下创建包 com.zyw.mavendemo
5.2 在包com/zyw/mavendemo 下创建HelloWorld类
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!!");
}
}
3.2 设置编译版本
1. 我们现在在Maven工程默认是JDK1.5 , 我们需要将编译版本该为系统对应的JDK(我的系统是1.7)
将下面的信息黏贴到pom.xml中
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
- 右键工程 Maven → Update Project…
弹出窗口后,我们的编译版本就改位1.7了.
4. 添加依赖
- 右键工程 → Maven → Add Dependency 打开 Add Dependency 窗口
- 在 Enter groupId,atrifactid or sh1 …. 下方输入需要依赖的库. 选择好后 点击 “OK” 按钮.
- 这时我们发现pom.xml ,多了一下信息(你选择的是什么jar包就出先什么样的信息)
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.0.7.Final</version>
</dependency>
</dependencies>
- 工程目录下的Maven Dependecies 下多了很多的jar包,因为我们依赖的jar包可能还需要依赖别的包才可以运行.
4 项目的生命周期
Maven有三套相互独立的生命周期,分别是:clean,default,site. clean主要是情路项目. default是Maven最核心的构建项目,site 是生成项目站点. 每一个大的生命周期又分为很多个杰顿. 后面的阶段依赖与前面的激阶段,这点有点项Ant的构建依赖,声明周期本身相互独立,用户可以仅仅调用声明周期的某一个阶段,也就是说用户调用了default周期的任何节点,并不会触发clean周期一级site周期的任何事情. 三大生命周期蕴含着小小的阶段. 如下图所示.
4.1 clean周期
- pre-clean:准备清理
- clean:真正的清理工作
- post-clean:执行清理后的一些后续工作
4.2 default 周期
- validate:验证
- initialize:初始化配置
- generate-sources:生成源代码编译目录
- process-sources:处理项目主资源文件,复制资源文件到output- classpath
generate-resources:生成资源目录 - process-resources:处理资源文件
- complie:编译源代码
process-classes:处理编译后文件 - generate-test-sources:生成测试目录
- process-test-sources:处理项目测试资源文件,复制测试资源文件到outputclasspath
- generate-test-resources:生成测试资源文件
- process-test-resources:处理测试资源文件
- test-compile:编译测试代码
- process-test-classes:处理测试代码
- test:单元测试运行测试代码
- prepare-package:打包前的准备
- package:将编译好的代码打包成为jar或者war或者ear等等
- pre-integration-test:准备整体测试
- integration-test:整体测试
- post-integration-test:为整体测试收尾
- verify:验证
- install:安装到本地Maven库
- deploy:将最终包部署到远程Maven仓库
4.3 site 周期
- pre-site:准备生成站点
- site:生成站点及文档
- post-site:站点收尾
- site-deploy:将生成的站点发布到服务器上
5. 常见命令
Maven通过命令对工程进行清理,编译测试,打包,部署.
- 右键工程 Run As(或Debug As) → Maven Build… 进入Edit Configuation 窗口
- 在Goals 中输入命令 点击”Run” 按钮
常见命令
- compile:编译
- clean:清理,将target下的class文件清理
- test: 执行单元测试类,执行src/test/java下的类
- package :将java工程打成jar、war。
- install:安装命令,将将程的jar发布到本地仓库
发布到仓库,目录按照本工程定义的坐标生成目录
4,创建SSH工程
详见 Maven创建SSH工程
5,聚合与继承
聚合
随着技术的发展和各类用户对软件的要求越来越高,软件本身也变得越来月复杂,然后软件设计人员开始采用各种方式进行开发,于是就有了我们的分层架构,分模块开发,来提高代码的清晰和重用.针对这以特性,maven也给予了相应的配置.
我们在开发过程中,创建了2个以上的模块,每个模块都是一个独立的maven Project , 在开始的时候我们可以 独立的编译和测试运行每个模块,但是随着项目的不断变大和复杂 化,我们期望能够使用简单的操作来完成编译等工作,这时Maven给出了聚合的配置方式.
所谓聚合,顾名思义,就是把多个模块项目聚合到一起,我们可以建立一个专门负责聚合工作的Maven工程.
建立该project的时候需要注意一下几个点:
- 聚合模块本身也作为要给Maven项目,它必须有自己的POM.
- 它的打包方式必须为:pom
- 引入了新的元素:modules–module
- 版本:聚合模块的版本和被聚合模块版本一致.
- 相对目录:每个module的值都是一个当前POM的相对目录.
- 目录名称:为了方便的快速定位内容,模块所处的目录应当与artifactId一致(Maven约定而不是硬件要求),总之,模块所处的目录必须和模块所处的目录相一致.
- 习惯约定:为了方便构建,通常将聚合模块放在项目目录层的最顶层,其它聚合模块作为子目录存在,这样当我们打开项目的时候,第一个看到的就是聚合模块的POM.
- 聚合模块减少的内容:聚合模块的内容仅仅是一个pom.xml文件,它不包含src/main/java , src/test/java 等目录,因为它指示用来帮助其它模块构建的工具,本身并没有实质的内容.
- 聚合模块和子模块的目录:他们可以是父子类,也可以是平台结构,当然如何使用平行结构,那么聚合模块的POM也需要做出相应的更改.
二,继承
我们在项目开发过程中,可能多个模块独立开发,但是多个模块可能依赖相同的元素,比如说每一个模块都需要Junit,使用spring的时候,器核心jar也必须都被引用,在编译的时候,maven-compiler-plugin 插件也要被引入.这时我们采用继承,就不用在每个子模块分别定义了.
如何配置继承:
- 说到继承肯定是一个父子结构,那么我们在父工程中来创建一个parent project .
- : 作为父模块的POM,其打包类型也必须为POM.
- 结构:父模块只是为了帮助我们消除重复,所以它也不需要src/main/java , src/test/java 等目录.
- 新的元素 , 它是被用在子模块中的.
- 元素属性::表示父模块POM的相对路径,在构建时候,Maven会先根据relativePath检查父POM,如果找不到,再从本地仓库查找
- relativePath的默认值../pom.xml
- 子模块省略groupId和version:使用了继承的子模块中可以不声明groupId和version,子模块将隐式的继承父模块的这两个元素.
三,聚合与继承的区别
聚合和继承通常是集合使用的,但是其作用是不同的.聚合是将多个模块的工程聚合在一起,而继承则是指明某个模块工程哟啊继承另一个模块功能.