一、Maven简介
1、什么是Maven
Apache Maven 是一个软件项目管理和构建工具,可以帮助我们去创建和管理项目
基于项目对象模型POM(Project Object Model)的概念,帮助开发者构造一个项目完整生命周期
注: POM是Maven对一个项目的描述,是Maven的核心,一个POM其实就是一个XML文件
2、为什么使用Maven
2.1 项目管理工具
项目规则很大时一定会将项目进行拆分,将一个项目拆分成多个模块,每个模块对应一个工程,多个工程之间存在依赖关系
2.2jar包的管理工具
-
通过仓库管理jar包
多个项目可能会用到相同的jar包,每个项目都要导入jar包,太过麻烦
此时可以通过Maven将jar包放到仓库当中,在每个项目中引用仓库的jar包
-
解决jar包的依赖
jar包之间存在依赖关系,并且依赖层次很复杂,很难记住
此时可以使用Maven,帮助我们自动解决jar包间的依赖关系
-
自动下载jar包
项目中使用的jar数据很多,自己下载并手动添加jar包
此时可以使用Maven,帮助我们自动下载所有相关的jar包
2.3 自动化的构建工具
构建过程:编译主代码——> 编译测试代码——>执行单元测试——>生产测试报告——>打包——>部署
3. 术语
3.1 中央仓库
是一个网络仓库,存储jar包和Maven插件
3.2 本地仓库
从中央仓库下载的jar包的存放位置,也是一个仓库,只不过是存放在本地电脑上
3.3 镜像仓库
对某一仓库做镜像
3.4 私服
局域网内部搭建的maven服务器
4. 单词
repository 仓库
archetype 原型、骨架(模板)
artifact 手工制品、成品
二、 安装maven
1、下载安装包
maven 3.2.5版本要求 jdk1.6, 其后的版本要求 jdk1.7
2、解压缩
解压到无中文、无空格,不需要安装
3、配置环境变量
Maven依赖于JAVA_HOME
echo $JAVA_HOME echo %JAVA_HOME%
Maven环境变量:
-
M2_HOME=Maven安装目录
-
mvn -v
4、配置本地仓库
4.1 本地仓库的默认位置
~/.m2/repository
4.2 修改本地仓库的位置
编辑maven核心配置文件 conf/setting.xml
<localRepository>/Users/sh4060/Maven/maven-repo</localRepository>
测试:
cd maven/maven-projectsmvn archetype:generate #使用maven创建项目
提示:
-
选择创建项目时使用的模板archetype; 回车
-
输入groupId, 一般为组织域名反向+项目名: com.itany.ums
-
输入artifactId: test
-
版本:按回车
-
包名:按回车
-
确认:按回车
5、配置镜像仓库
编辑 conf/setting.xml
<mirrors>
<mirror>
<id>aliyun</id>
<mirrorOf>*</mirrorOf><!-- 所有访问都使用该镜像仓库 -->
<name>aliyun maven</name>
<url>https://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
</mirrors>
6、配置Maven的JDK版本
默认使用maven创建项目使用的是jdk 1.5
修改maven默认使用的jdk版本,编辑conf/setting.xml,在profiles标签中添加如下内容:
<profiles>
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
三、 创建Maven项目
1.Java 项目的创建
1.1 目录结构
Java工程约定的目录结构如下:
|-项目名称
|-src //程序代码
|-main //程序的主代码
|-java //源代码
|-用于存放源代码,相当于传统的src,如com.itany.usm.dao.UserDao
|-resources //配置文件
|-用于存放配置文件
|-test //测试代码,目录结构与main中一样
|-java
|-resources
|-pom.xml//maven核心配置文件
1.2 基本操作
步骤:
1.创建Java项目
mvn archetype:generate
制定的信息如下:
archetype:(maven-archetype-quickstart) #使用骨架构建java项目
groupId:com.itany.study #制定组织名反向+项目名
artifactId:sms #制定模块名称
version:1.0.1 #版本
package:com.itany.study #包名
2.执行maven操作
cd sms #先切换到项目所在目录
mvn compile #执行编译
mvn clean compile test package #一次可执行多命令
2.Web项目的创建
1.1 目录结构
Web项目的约定目录结构如下:
|-项目名称
|-src //程序代码
|-main //程序的主代码
|-java //源代码
|-用于存放源代码,相当于传统的src,如com.itany.usm.dao.UserDao
|-resources //配置文件
|-用于存放配置文件
|-webapp //网站根目录,相当于传统web项目WebRoot
|-WEB-INF
|-web.xml
|-test //测试代码,目录结构与main中一样
|-java
|-resources
|-pom.xml//maven核心配置文件
1.2 基本操作
步骤:
1.创建 web项目
mvn archetype:generate
指定信息如下:
archetype:(maven—archetype-webapp) #使用模板创建web项目
2.执行maven操作
mvn clean compile package
3.发布
tomcat
mvn自带的Tomcat插件
四、 Maven命令
1. 常用命令
命令
|
作用
|
描述
|
archetype
|
创建maven项目
|
根据模板生成项目的骨架
|
clean
|
清理
|
删除target目录
|
compile
|
编译
|
将main中的源代码编译成字节码,放在target/calsses目录下
|
test
|
测试
|
执行测试类(使用Junit),并生成测试的报告
|
package
|
打包
|
将java项目打包成jar文件,将web项目打包成war文件,放在target目录
|
install
|
安装
|
将项目jar包安装在本地仓库中,供其他项目使用
|
deploy
|
发布/安装
|
将项目jar包安装在中央仓库中,供其他项目使用,需要账户密码(了解)
|
site
|
站点
|
生成关于项目介绍的网页
|
注意:
-
所有的命令都要跟在mvn的后面,如mvn archetype
-
所有的命令都必须在某个项目根目录
-
多个命令可以一起执行
2.生命周期
一个项目的构建build的过程通常包括:清理、编译、测试、打包、集成测试、部署等
Maven定义了三套生命周期:clean、default、site
每个生命周期之间是互相独立的,每个生命周期都包含多个阶段,
default生命周期包含:compile、test、package
五、 在IDE中使用Maven
1.IDE工具
-
MyEclipse
-
集成Maven插件
-
Eclipse
-
Eclipse for Java EE
-
IDEA
-
集成Maven
配置maven
-
指定maven安装目录和配置文件
-
自动更新maven项目:勾选import maven Projects automatically
目录的类型
IDEA中目录是分类型的,常用的四种:
-
Sources root 主代码的目录 src/main/java
-
Test Source Root 测试代码的目录 src/test/java
-
Resources Root 主代码所需资源的目录src/main/resources
-
Test Resources Root测试代码所需资源的目录src/test/resources
注:再IDEA中默认创建的目录都是普通的Directory,创建后需要设置目录的类型
六、 pom.xml 文件
1.简介
pom:project object model项目对象模型
pom.xml是Maven的核心配置文件
一个Maven项目有且只有一个pom.xml文件,该文件必须在项目的根目录下
2.坐标
2.1什么是坐标
用来唯一的标识每个标识,必须为maven项目自定义坐标,坐标必须唯一
目的是为了让其他的maven项目可以使用该项目生成的jar包
2.2坐标详解
Maven坐标是通过一些元素来定义的:groupId、artifactId、version
<!—
坐标:
groupId:组织Id,表示当着模块所隶属的项目
artifactId:模块id
version:当前的版本
——>
<groupId> com.itany.study</groupId>
<artifactId>maven01</artifactId>
<version>1.0-SNAPSHOT</version>
3.dependency
3.1 基本配置
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
3.2 scope作用域
表示依赖的作用域,用来配置以来的jar包可以使用的范围
取值
|
含义
|
举例
|
compile
|
该依赖可以在整个项目中使用,参与打包部署
|
commons—fileupload
|
test
|
该依赖只能在测试代码中使用,不参加打包部署
|
junit
|
provided
|
该依赖编写源代码时需要,不参与打包部署
|
servlet-api、jsp-api
|
runtime
|
该依赖编写代码时不需要,运行时需要,参与打包部署
|
mysql-connector
|
system
|
表示使用本地系统路径下的jar包,需要和systemPath一起使用
|
ojdbc.jar
|
4. properties
全局属性,一般情况下用于定义全局的
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<mysql-connector-java.version>5.1.38</mysql-connector-java.version>
<junit.version>4.11</junit.version>
</properties>
5.repositories
用来配置当前工程使用的远程仓库
依赖查找顺序:本地仓库——>setting.xml中配置的远程仓库
<!-- 配置远程仓库 -->
<repositories>
<!-- 有些最新的jar包,可能在中央仓库上并没有提供,此时可以使用jar包官方提供的仓库 -->
<repository>
<id>spring_repo</id>
<url>http://repo.spring.io/milestone</url>
</repository>
</repositories>
</project>
6.plugins
配置插件,是一种工具
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
<version>2.6.1</version>
</plugin>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<path>/maven01</path>
<port>8888</port>
</configuration>
</plugin>
</plugins>
</build>
7.超级POM
所有的pom.xml文件都继承一个父POM,这个父POM称为超级POM
七、 Maven中的关系
1.继承
一个Maven项目可以继承自另一个Maven项目,分别称为子项目、父项目
场景:多个子项目中使用的是像马桶的依赖或者插件,此时可以把相同的配置抽取到一个父项目中,进行统一的管理,保持一致性
步骤:
1.将父项目的打包方式设置为pom
<!--
打包方式:
jar:Java项目的打包方式,默认值
war:Web项目的打包方式
pom:父项目的打包方式
-->
<packaging>pom</packaging>
2. 在子项目中引用父项目,指定父项目的坐标
<!-- 引用父项目,指定父项目的坐标-->
<parent>
<groupId>com.itany.study</groupId>
<artifactId>parent</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 指定父项目的pom.xml文件的相对物理路径-->
<relativePath>../parent/pom.xml</relativePath>
</parent>
问题:有时并不是父项目的所有依赖都需要被子项目继承,但是又希望能够通过父项目对依赖进行统一管理,如版本的控制
解决:使用dependencyManagement
步骤:
1.在父项目中配置dependencyManagement
<dependencyManagement>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
</dependencyManagement>
2.在子项目中引用父项目中的依赖
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</dependency>
2.聚合
将多个子项目添加到一个父项目中,然后通过父项目进行操作,从而实现对所有聚合的子项目的操作
<!-- 聚合子项目,指定子项目的跟目录-->
<modules>
<module>../child01</module>
<module>../child02</module>
</modules>
3.依赖
项目C——>项目B——>项目A
概念:如果项目C依赖于项目B,项目B依赖项目A,则项目C也依赖于项目A,这叫依赖的传递性
配置依赖关系:child03——>child02——>child01
<!—依赖于child01-->
<dependency>
<groupId>com.itany.study</groupId>
<artifactId>child01</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
3.1控制依赖的传递
并不是所有的依赖都会被传递:
-
scope为compile的依赖会被传递
-
scope为test的依赖不会被传递
-
配置optional为true的依赖不会被传递
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<optional>true</optional>
</dependency>
3.2 不会出现jar包的冲突
使用Maven不会jar包冲突,通过两个原则保证:
-
就近原则 child03——>child02——>child01 01和02有同一jar包不同版本 03优先用近的02
-
优先定义原则 先定义哪个用哪个
3.3 不要传递的依赖
方式1:在依赖的配置中配置不允许传递
<optional>true</optional>
方式2:在当前项目中配置不接受传递的特定依赖
<!—依赖于child01-->
<dependency>
<groupId>com.itany.study</groupId>
<artifactId>child01</artifactId>
<version>1.0-SNAPSHOT</version>
<!--不接受特定的依赖-->
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
八、 Maven综合应用
1、分析
将项目分为多个工程,可以按层次分,也可以按模块,或同时按层次和模块分
以ums为例,使用maven创建和管理项目:
-
父工程:ums-parent
-
dao工程:ums-dao
-
sevice工程:ums-service
-
action工程:ums-action
2、步骤
2.1 创建工程
2.2 配置依赖
1.在父工程添加依赖
2.在子工程中引用依赖
2.3 配置dao工程
映射文件存储位置,两种方式:
-
将映射文件放在resource目录下 会被打包部署
-
将映射文件放在java目录下 默认只会对该目录下的java代码进行打包部署,如果希望对该目录下的配置文件也进行打包,需要额外的配置
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>