Maven教程详细总结+学习路线
一、为什么要使用Maven目前技术在开发中存在的问题:① 一个项目就是一个大工程如果项目非常庞大,就不适合用package来划分。最好是一个功能就是一个模块,利于分工协作。借助Maven就可以将一个项目拆分成多个模块。②项目所需的jar包和jar包之间的依赖包必须自己提前准备好如果是以不规范的方式下载的jar包,那么可能会带来问题。借助于Maven,只需要安装Maven的仓库到本地即可,因为所有知
在使用Maven之前必须配置好Maven的环境变量及jdk 的环境变量:
如何篇配置Maven环境变量以及安装eclipse中Maven的镜像
一、为什么要使用Maven
目前技术在开发中存在的问题:
① 一个项目就是一个大工程
如果项目非常庞大,就不适合用package来划分。最好是一个功能就是一个模块,利于分工协作。借助Maven就可以将一个项目拆分成多个模块。
②项目所需的jar包和jar包之间的依赖包必须自己提前准备好
如果是以不规范的方式下载的jar包,那么可能会带来问题。借助于Maven,只需要安装Maven的仓库到本地即可,因为所有知名框架的jar包都保存在Maven的中央仓库中,可以以一种规范的方式得到jar包。
③jar包都需要手动添加到lib目录中
带来的问题:同样的jar包出现在每个工程中,一方面浪费空间,另外工程变得臃肿。借助Maven可以直接将jar包保存在仓库中,有需要的工程可以通过配置pom.xml引入这个jar包,不需把jar包复制过来。
二、Maven是什么
Maven是一款专门服务于JAVA的自动化构建工具,并不能直接理解为我们找jar包的工具。那么自动化构建又是什么?
我把Web工程的构建分为了两步:1.编译 2.部署
1.编译 源码通过java编译器编译成字节码文件的过程。
2.部署 一个B/S项目最终运行的并不是项目本身,而是这个动态web工程“编译的结果”。就像一个java程序最终运行的并不是java的文件,而是编译后的.class文件。
Maven自动化构建过程的具体步骤
①清除:清理上次的编译结果
②编译:将java文件编译成class文件
③测试:调用Junit自动测试,测试完后打印测试的结果
④打包:java工程打jar包,web工程打成war包
⑤安装:把不是maven库中的,自己写的工程,模块之间有需要依赖的模块,安装到maven仓库中。
⑥部署:将动态的web工程打成的war包部署到服务器中,使其可以运行。
以上步骤全部可以交由Maven通过maven命令去自动执行。
三、Maven怎样使用
Maven的学习路线
①约定的目录结构
②坐标的概念
③maven仓库的概念
④依赖怎样使用
- 依赖的传递性
- 系统选择依赖时的就近原则
⑤继承和聚合的概念和使用
①约定的目录结构
若想使用Maven,那么就必须按照Maven约定的目录结构创建项目(可在eclipse中new一个Maven项目直接形成约定的目录结构)
-
为什么要遵守约定?
因为Maven负责整个工程的自动化构建,只有这样Maven才能读到工程里的文件,进行编译、测试、打包等工作。 -
我们自己定义的东西如何让框架知道?
①遵守框架的约定:比如要使用log4j的jar包,你得按照他的规定创建log4j.properties,一个字母一个字母的不能出错。
②以配置的方式告诉框架:如在web.xml中配置spring,指明spring的配置文件的路径。
②坐标的概念
概念:很简单,就像x坐标和y坐标可以唯一标识一个平面中的点。一个maven中的坐标唯一标识一个Maven仓库中的jar包。所以若想使用某个jar包,你只需知道他的坐标,配置在pom.xml中即可。
使用坐标必须按照maven的“gav”格式:
Ⅰ groupId:公司或组织的域名倒叙+项目名
<groupId>com.sms.maven</groupId>
Ⅱ artifactId:模块名
<artifactId>Hello</artifactId>
Ⅲ version:版本号
<version>1.0.0</version>
比如spring-core的坐标:
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.0.0.RELEASE</version>
③maven仓库的概念
概念:仓库=自动化构建所需的插件+所有知名框架的jar包+我们自己开发的maven模块(使用mvn -stall进入仓库)
仓库的分类
- 本地仓库:自己电脑上已经部署好的maven仓库,需要去网上下载。
- 私服:搭建在局域网中,为局域网中的maven项目服务。
- 中央仓库:搭建在Internet中,为世界上所有的maven项目服务。
④依赖如何使用(jar包如何从仓库中引入?)
概念:在pom.xml配置依赖,就是给出坐标,引入jar包/其他模块的过程
配置依赖:把jar包或模块的坐标写在dependency标签中
maven解析配置好的依赖:maven到本地仓库中查找被依赖的jar包的过程
-
依赖之间相互传递
如果现在有这三个模块,其中HelloFriend需要使用到Hello模块里的类,MakeFriends需要使用到HelloFriend模块里的类。
依赖关系:MakeFriends—>HelloFriend—>Hello
若Hello模块中配置了spring-core的jar包,那么在HelloFriend和MakeFriends中都会包含spring-core的运行时环境。即都会包含下图中的jar包:
-
怎样排除依赖
当我们接受到传递过来的依赖关系时,如果有不希望使用在当前工程中的jar包,我们可以排除他。排除的方式:
- 系统选择依赖时的就近选择
同样是这三个模块,依赖关系:MakeFriends—>HelloFriend—>Hello
如果Hello模块中使用到log4j-4.0的版本,而HelloFriend模块使用到log4j-4.9的版本,那么MakeFriends模块中该如何选择依赖过来的的版本?
答案:选择HelloFriend模块中log4j的版本。因为就近原则,MakeFriends到HelloFriend模块是一步,到Hello模块是两步。
⑤继承和聚合的使用
继承的使用情景: 同样是这三个模块,依赖关系:MakeFriends—>HelloFriend—>Hello,但是由于test的依赖范围不可传递,每一个模块依赖的Junit的版本号不相同。那么怎么统一管理Junit的版本?
答案:此时就需要一位“父亲”,将Junit的依赖统一提取到父亲中,在子工程中的Junit依赖不声明版本号,以父亲设定的为准。
操作步骤:
① 创建一个Maven工程作为父工程,注意:打包方式为pom
②在父工程中统一管理Junit的版本,声明为4.9
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
③“认爹仪式”,在子工程中声明对父工程的引用
<parent>
<groupId>com.sms.maven</groupId>
<artifactId>Parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 以当前子工程为基准找到父工程pom.xml的路径 -->
<relativePath>../Father/pom/xml</relativePath>
</parent>
④去掉子工程的坐标和父工程的重复部分。
⑤去掉子工程中Junit依赖的版本号。
聚合的使用场景: 需要一件安装所有模块到仓库时,使用聚合。
配置方式: 在总的聚合工程中,配置各个参与聚合的模块。
<modules>
<module>../Hello</module>
<module>../HelloFriend</module>
<module>../MakeFriends</module>
</modules>
更多推荐
所有评论(0)