1、为什么使用Maven
普通项目 | 使用Maven工具 |
一个项目就是一个工程,当项目很庞大时,完全用package去划分,显得过于复杂 | Maven可以把一个大的项目拆分成多个工程,分工协作,且相互之间能互相访问 |
不同的工程中,存储着许多相同的jar包。浪费存储,且项目臃肿 | Maven可以将jar包保存在“仓库”中,工程只需要引用即可,不需要在工程中存储 |
需要自己去寻找jar包,有些官网甚至只支持maven下载。 | 所有知名框架及第三方工具jar包都已经按照规范放入了Maven的中央仓库,使用Maven下载安全,便捷 |
需要花时间了解jar包之间的依赖关系。然后去下载依赖的jar包 | 借助Maven,自动分析jar包的依赖关系,并自动添加到项目中来 |
2、Maven的基本概念
- Maven:自动化构建工具,以“java源代码”,“配置文件”,“HTML”,“图片”等资源为“原材料”,去“构建”一个可以运行的项目。
- Maven本地仓库:存放了Maven构建时使用的插件,第三方框架和工具类jar包,Maven工程。
- Maven工程与打包类型:创建Maven工程时,选择打包类型决定了创建的工程类型。
工程类型 | 打包类型 |
父工程 | pom |
java工程 | jar |
web工程 | war |
3、Maven安装
- 安装jdk
- 下载Maven核心程序压缩包
- 解压maven核心程序到无中文和空格的路径下
- 配置Maven的环境变量
新建用户变量“M2_HOME”或者“MAVEN_HOME”,赋值为“E:\apache-maven-3.2.2”
新建用户变量“path”赋值为 “E:\apache-maven-3.2.2\bin”
- 检验安装结果
dos命令窗口下输入命令, “mvn -v”,回车后显示Maven版本等信息即安装成功
4、Maven本地仓库配置
下载本地仓库压缩包并解压到无中文和空格的路径下:
本地仓库的默认路径:【系统当前登录用户的家目录】\.m2\repository
修改本地仓库的默认路径:找到Maven核心程序的 conf\settings.xml 配置文件,把其中的 localRepository 配置从注释中拿出来,并修改本地仓库路径。
5、Maven核心概念
- 约定的目录结构
- POM
- 坐标
- 依赖管理
- 仓库管理
- 生命周期
- 插件和目标
- 继承
- 聚合
5.01、约定的目录结构
Maven对工程有自己约定好的目录结构,每个目录都有自己的含义。
5.02、常用的Maven命令
注意事项: 在命令窗口执行与构建过程相关的Maven命令,必须进入pom.xml所在的目录。
执行命令后,核心程序会从本地仓库寻找命令对应的插件,如果找不到,则会自动去网上下载资源到本地仓库。然后通过插件去执行真正的操作。
mvn clean | 清理 | 清理项目的target目录 |
mvn compile | 编译主程序 | 编译主程序(会在项目路径下生成一个target目录,并把编译的class等文件放进来) |
mvn test-compile | 编译测试程序 | 编译测试程序 |
mvn test | 执行测试 | 编译项目后,再执行Junit测试方法 |
mvn package | 打包 | 编译项目后,再执行Junit测试方法,再把项目打包到target目录(打成jar包) |
mvn install | 安装 | 编译项目后,再执行Junit测试方法,再把项目打包到target目录,再安装到本地仓库。 |
mvn deploy | 部署 | 编译项目后,再执行Junit测试方法,再把项目打包到target目录,再安装到本地仓库和远程maven私服仓库 |
5.03、POM
Project Object Model 项目对象模型
pom.xml 对于Maven工程是核心配置文件,与构建过程相关的一切设置都在这个文件中进行配置
5.04、坐标
- pom.xml里,使用下面三个向量,在仓库中唯一定位一个Maven工程
groupId | 公司或者组织的域名倒序+项目名 | <groupId>com.dfr.TestMaven</groupId> |
artifactId | 模块名 | <artifactId>Hello</artifactId> |
version | 版本 | <version>0.0.1-SNAPSHOT</version> |
- 坐标与仓库路径的对应关系
groupId + "/" + artifactId + "/" + version + "/" + artifactId + "-" + version + ".jar"
然后把groupId中的“.” 替换为 “/”,结果如下:
com/dfr/TestMaven/Hello/0.0.1-SNAPSHOT/Hello-0.0.1-SNAPSHOT.jar
5.05、仓库管理
- 本地仓库:当前电脑上部署的 仓库目录
- 私服:架设在局域网环境中,为局域网范围内 的所有Maven工程服务
- 中央仓库:架设在Internet上,为全世界的Maven工程服务
- 中央仓库镜像:架设在各大洲,为了分担中央仓库的流量,更快响应用户
仓库中保存的内容:Maven自身需要的插件,第三方框架或者工具jar包,自己开发的Maven工程。
5.06、依赖管理
pom.xml中有如下依赖关系的配置, Maven解析依赖信息会到本地仓库中查找被依赖的jar包。
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
</dependency>
</dependencies>
5.07、依赖的范围
| 主程序是否需要 | 测试程序是否需要 | 是否参与打包 | 备注 |
<scope>compile</scope> | 是 | 是 | 是 | 编译依赖的jar包,主程序和测试程序都可以使用。 |
<scope>test</scope> | 否 | 是 | 否 | 测试程序并不需要打包,所以其依赖包也不需要打包 |
<scope>provided</scope> | 是 | 是 | 否 | 例如Servlet的jar包,开发和测试都需要,但是真正部署时,Servlet容器自己会提供。并不需要打包。 |
5.08、生命周期
- 生命周期定义:一套生命周期,就是把许多的构建过程,有序的排列。形成一套有序的构建过程集合。
- 生命周期特性:无论执行该生命周期的哪个阶段,它前面的所有阶段都会被按顺序执行。
- Maven有三套独立的生命周期:
Clean LifeCycle | 真正构建前,先清理 |
Default LifeCycle | 核心的构建部分:编译,测试,打包,安装,部署等 |
Site LifeCycle | 生成项目报告,站点,发布站点 |
以Default 生命周期为例,并列举部分常用的的阶段:compile -> test-compile -> test -> package -> install -> deploy
若执行 test-compile阶段,则真正被执行的有 compile -> test-compile
5.09、插件和目标
Maven核心程序只是定义了生命周期的各个阶段,以及每个阶段需要去执行哪个插件的哪个模块。
所以真正去执行时,会依赖本地仓库中的插件。Maven核心程序中并没有这些插件。
生命周期阶段 | 调用插件 | 调用插件的目标(模块) |
compile | maven-compiler-plugin | compile |
test-compile | maven-compiler-plugin | testCompile |
5.10、依赖的传递性
- 定义:若工程A依赖工程B,此时若在B中添加jar包,则工程A中也可以使用该jar包。
- 注意事项:
需要在工程A的pom.xml中,配置好依赖信息 |
需要对工程B进行安装操作,确保本地仓库里存在工程B |
只有compile范围的依赖才能够传递 |
- 小技巧:可以在最底层的工程中把依赖的jar包配置好,其他工程只要想用这些jar包时,直接依赖这个底层的工程即可。
5.11、依赖的排除
- 定义:工程A依赖工程B,工程B依赖b.jar。若工程A中不想要b.jar,则需要配置依赖的排除信息。
- 配置信息:
<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<exclusions>
<exclusion>
<groupId></groupId>
<artifactId></artifactId>
</exclusion>
</exclusions>
</dependency>
5.12、依赖的原则
- 作用:解决工程之间jar包的冲突问题
- 路径最短优先:HelloFriend比Hello路径更短,所以MakeFriends会使用HelloFriend下的日志jar包
- 依赖配置靠前者优先:当路径相同时,需要看MakeFriends的pom.xml中,配置依赖标签的先后顺序。
5.13、统一管理依赖的版本号
- 场景:工程A依赖Spring的所有jar包,现在需要从4.0版本全部升级到4.1版本,如果手动一个个修改即繁琐还易错,使用配置的方式只需要更改配置的值即可。
- 配置方式如下:
<!-->properties标签里使用自定义标签,自己命名即可<-->
<properties>
<dfr.Spring.Version>4.0.0.RELEASE</dfr.Spring.Version>
</properties>
<!-->引用自定义标签<-->
<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version>${dfr.Spring.Version}</version>
<scope></scope>
</dependency>
5.14、继承
- 问题:由于test范围的依赖,并不具备依赖传递的特性,导致每个工程都需要声明依赖的jar包,容易造成版本不一致。
- 解决思路:
创建父工程:父工程需要指定打包方式为pom。
父工程的pom.xml配置好jar的依赖,配置如下:
<!--dependencyManagement标签下声明的依赖,并不会被子类自动引入,还需要子类显示的去引用-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.dfr</groupId>
<artifactId>test-jar</artifactId>
<version>4.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!--dependencies标签下声明的依赖,会被子类自动引入-->
<dependencies>
<dependency>
<groupId>com.dfr</groupId>
<artifactId>java-jar</artifactId>
<version>4.1</version>
</dependency>
</dependencies>
在子工程的pom.xml中声明父工程:
<!--继承父类-->
<parent>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<!-- 以当前文件为基准的父工程的pom.xml文件的相对路径 -->
<relativePath>../Parent/pom.xml</relativePath>
</parent>
<!--依赖关系-->
<!--未指定版本号,则使用父工程中指定的版本号-->
<dependencies>
<dependency>
<groupId>com.dfr</groupId>
<artifactId>test-jar</artifactId>
</dependency>
</dependencies>
子工程声明jar包依赖时,不指明版本号。则以父工程中<dependencyManagement>标签下的统一设定为标准。同时子工程会自动引入父工程中<dependencies>标签下声明的依赖
- 注意事项:设定了继承,在安装时需要先安装父工程,否则会报错。
5.15、聚合
- 作用:一键安装各个模块工程
- 思路:
新建一个工程或直接使用父工程。在pom.xml配合聚合信息。这样可以直接在聚合工程的pom.xml上进行install操作,就会把所有配置的模块都安装好。比如下面的配置在install后会按照如下顺序进行安装处理:springTest --》 yy --> parent
<groupId>parent</groupId>
<artifactId>parent</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<!-- 指定工程的相对路径 -->
<modules>
<module>../springTest</module>
<module>../yy</module>
</modules>
- 注意事项:用作聚合的工程必须是父工程类型,即<packaging>标签的值为 pom。
6、在Myeclipse中使用Maven
6.1、配置Maven核心程序,本地仓库
Myeclipse自带Maven插件,但建议使用自己的Maven核心程序和本地仓库,配置方式如下:
Windows->Preferences
Installations:指定Maven核心程序的位置
user settints:指定Maven核心程序里conf/settings.xml的位置,进而获取本地仓库的位置。
6.2、创建Maven工程
- 新建Maven版java工程
new Maven Project
勾选上 “Create a simple project” 选项,这样创建的目录更完整。
Packaging选择jar(java工程打jar包)
- 新建Maven版的web 工程
new Maven Project
勾选上 “Create a simple project” 选项,这样创建的目录更完整。
Packaging选择war(web工程打war包)
创建后,有文件夹:src/main/webapp,但webapp下并没有WEB-INF,web.xml等web项目的约定目录。需要设置 web模板。
项目有红叉,但项目下却没有报错的问题,解决方案如下:
6.3、执行Maven命令
点击pom.xml,右键 Run as :
6.4、其他配置
新建工程后,可能还需要手动调整jre的版本。可以在Maven核心程序的conf/settings.xml里配置profiles标签内容,指定版本。如果设置后识别不了,可能是因为Maven核心程序版本太低,而jdk设置版本太高导致。
<profile>
<id>jdk-1.7</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.7</jdk>
</activation>
<properties>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<maven.compiler.compilerVersion>1.7</maven.compiler.compilerVersion>
</properties>
</profile>
6.5、开发
工程A依赖工程B,若B没有安装到本地仓库,但是A和B都导入了Myeclipse,此时在Myeclipse中开发时,并不会受影响。只有最终全部开发完需要打包部署时,才需要全部安装到本地仓库。
7、Maven库站
获取jar包资源的坐标信息,网址:http://mvnrepository.com
搜索需要的jar包,可以找到如下坐标信息: