Maven
Maven简介
介绍
- Maven是一款自动化构建工具,专注服务于Java平台的项目构建和依赖管理
构建
- 项目开发,往往经历编译、测试、打包、安装、部署等一系列过程
构建项目指项目从编译、测试、打包、安装、部署整个过程交给maven进行管理
一键构建指的是整个构建过程,使用maven一个命令可以轻松完成整个工作
构建环节
- 清理:删除以前的编译结果,为重新编译做好准备。
- 编译:将Java源程序编译为字节码文件。
- 测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
- 报告:在每一次测试后以标准的格式记录和展示测试结果。
- 打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java工程对应jar包,Web工程对应war包。
- 安装:在Maven环境下特指将打包的结果——jar包或war包安装到本地仓库中。
- 部署:将打包的结果部署到远程仓库或将war包部署到服务器上运行。
- Maven可以自动的从构建过程的起点一直执行到终点
Maven作用
添加第三方jar包
在今天的JavaEE开发领域,有大量的第三方框架和工具可以供我们使用。要使用这些jar包最简单的方法就是复制粘贴到WEB-INF目录下的lib目录下。但是这会导致每次创建一个新的工程就需要将jar包重复复制到lib目录下,从而造成工作区中存在大量重复的文件。
而使用Maven后每个jar包只在本地仓库中保存一份,需要jar包的工程只需要维护一个文本形式的jar包的引用——我们称之为“坐标”。不仅极大的节约了存储空间,让项目更轻巧,更避免了重复文件太多而造成的混乱。
jar包之间的依赖关系
jar包往往不是孤立存在的,很多jar包都需要在其他jar包的支持下才能够正常工作,我们称之为jar包之间的依赖关系。最典型的例子是:jstl.jar依赖于standard.jar,如果没有standard.jar包,jstl标签库就不能正常工作。
处理jar包之间的冲突
- 使用Maven就可以自动的处理jar包之间的冲突问题。因为Maven中内置了两条依赖原则:最短路径者优先和先声明者优先。
获取第三方jar包
- 使用Maven我们可以享受到一个完全统一规范的jar包管理体系。你只需要在你的项目中以坐标的方式依赖一个jar包,Maven就会自动从中央仓库进行下载,并同时下载这个jar包所依赖的其他jar包——规范、完整、准确!一次性解决所有问题!
将项目拆分成多个工厂模块
随着JavaEE项目的规模越来越庞大,开发团队的规模也与日俱增。一个项目上千人的团队持续开发很多年对于JavaEE项目来说再正常不过。那么我们想象一下:几百上千的人开发的项目是同一个Web工程。那么架构师、项目经理该如何划分项目的模块、如何分工呢?这么大的项目已经不可能通过package结构来划分模块,必须将项目拆分成多个工程协同开发。多个模块工程中有的是Java工程,有的是Web工程。
实现项目的分布式部署
- 在实际生产环境中,项目规模增加到一定程度后,可能每个模块都需要运行在独立的服务器上,我们称之为分布式部署,这里同样需要用到Maven。
Maven使用
下载安装
- 下载路径:http://maven.apache.org/download.cgi
- 解压:要求目录不要过深,不要有中文和特殊符号
- 必须配置JAVA_HOME 环境变量
- 配置环境变量:MAVEN_HOME 值为Maven的解压路径
在path中配置 %MAVEN_HOME%\bin - 查看安装是否正确:在doc中 通过命令:mvn -v
配置本地仓库
- Maven的核心程序并不包含具体功能,仅负责宏观调度。具体功能由插件来完成。Maven核心程序会到本地仓库中查找插件。如果本地仓库中没有就会从远程中央仓库下载。此时如果不能上网则无法执行Maven的具体功能。为了解决这个问题,我们可以将Maven的本地仓库指向一个在联网情况下下载好的目录。
- Maven默认的本地仓库
C:\Users\ljw.m2\repository目录。 - Maven的核心配置文件位置 conf\setting.xml
Maven核心概念
POM
- Project Object Model:项目对象模型。将Java工程的相关信息封装为对象作为便于操作和管理的模型。Maven工程的核心配置。可以说学习Maven就是学习pom.xml文件中的配置。
目录结构
- 现在JavaEE开发领域普遍认同一个观点:约定>配置>编码。意思就是能用配置解决的问题就不编码,能基于约定的就不进行配置。而Maven正是因为指定了特定文件保存的目录才能够对我们的Java工程进行自动化构建
Maven坐标
- groupId:公司或组织的域名倒序
- artifactId:当前项目的名称
- version:当前模块的版本
依赖
- https://mvnrepository.com/ maven 坐标地址查看
- 目录结构
Demo2
src
——main
————java 写源码的地方
————resources 放置配置文件的目录
——test
————java 写测试源码的地方
————resources 放置测试所需的配置文件的目录
pom.xml
仓库
-
本地仓库
- 项目通过jar坐标,先从本地仓库找对应jar包,如果找不到会从远程仓库(互联网)去下载jar
包,保存在本地仓库(在程序员的电脑上),第二次不需要从远程仓库去下载。
- 项目通过jar坐标,先从本地仓库找对应jar包,如果找不到会从远程仓库(互联网)去下载jar
-
远程仓库
- 中央仓库
由专业团队( maven团队)统一-维护。
中央仓库的地址: http://repo1 . maven . org/maven2/ - 私服
架设在公司局域网内,提供给内部的人员使用。 - 第三方仓库
中央仓库只有一个国内使用非常慢,我们可以更换为:阿里云镜像
- 中央仓库
生命周期
maven 对项目构建过程分为“三套相互独立的生命周期
- Clean Lifecycle(清理生命周期)
在进行真正的构建之前进行一些清理工作
命令:clean - Default Lifecycle(默认生命周期)
构建的核心部分,编译、测试、打包、部署等等
命令:compile test package install deploy - Site Lifecycle(站点生命周期)
生成项目报告:站点、发布站点
命令:site - 在同一个生命周期中的命令,执行后面的命令,前面的命令自动执行
插件和目标
Maven的核心仅仅定义了抽象的生命周期,具体的任务都是交由插件完成的。
每个插件都能实现多个功能,每个功能就是一个插件目标。
Maven的生命周期与插件目标相互绑定,以完成某个具体的构建任务。
依赖管理
基本概念
- 当A jar包需要用到B jar包中的类时,我们就说A对B有依赖。
依赖范围
| type | 对主程序是否有效 | 对测试程序是否有效 | 是否参与打包与部署 | 是否传递 |
|---|---|---|---|---|
| compile | Y | Y | Y | Y |
| test | N | Y | N | N |
| provided | Y | Y | N | N |
- compile
默认依赖范围,作用域在编译、测试、运行时都有效。
- test
作用域在测试时有效。编译和运行时不需要,比如: Junit。 - provided
作用域在编译、测试时有效。运行时不需要,比如: servlet api被tomcat 容器提供。 - runtime
作用域在测试、运行时有效。编译时不需要,比如: jdbc的驱动包。
依赖传递性
- 在maven中,依赖是可以传递的,假设存在三个项目,分别是项目A,项目B以及项目C。假设C依赖
B,B依赖A,那么我们可以根据maven项目依赖的特征不难推出项目C也依赖A。
依赖原则
- 路径最短者优先
- 路径相同时先声明者优先
这里“声明”的先后顺序指的是dependency标签配置的先后顺序。
依赖排除
-
当前工程为public,直接依赖environment。environment依赖commons-logging的1.1.1对于public来说是间接依赖。当前工程public直接依赖commons-logging的1.1.2.加入exclusions配置后可以在依赖environment的时候排除版本为1.1.1的commons-logging的间接依赖。
<dependency> <groupId>com.ujiuye.maven</groupId> <artifactId>Environment</artifactId> <version>0.0.1-SNAPSHOT</version> <!-- 依赖排除 --> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1.2</version> </dependency>
统一管理目标jar包的版本
<properties>
<spring.version>4.1.1.RELEASE</spring.version>
</properties>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
这样一来,进行版本调整的时候只改一改地方就行了。
继承
多个子工程中依赖同样的jar包,但是采用test范围;由于test范围没有传递性;所以,每一个工程都需要对test范围的jar包进行单独依赖;
而如果希望修改多个工程中所依赖test范围的jar包版本,那么,一个一个项目去修改太麻烦,这时可以应用继承解决
继承的使用
项目的打包类型:pom、jar、war
packing默认是jar类型,
pom ---------> 父类型都为pom类型
jar ---------> 普通项目打jar包,一般普通项目设置jar
war ---------> web项目一般都是打war包,web项目的话设置war
-
定义一个父工程,父工程packaging必须时pom
-
在父工程中定义依赖的jar包,属于test范围
<packaging>pom</packaging> <dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.0</version> <!-- test范围表示测试的依赖范围,这个范围的依赖,我们的test中的程序是可以使用;而main中的程序是不可使用的; 如果是部署到Tomcat下的应用程序,依赖的jar包不能部署到Tomcat环境下的 --> <scope>test</scope> </dependency> </dependencies> </dependencyManagement> -
在各个子工程中对父工程进行继承
<parent> <groupId>com.mqf.maven</groupId> <artifactId>MavenParent</artifactId> <version>0.0.1-SNAPSHOT</version> <relativePath>../MavenParent/pom.xml</relativePath> </parent> -
在各个子工程对父工程中的包进行依赖,不需要配置版本号和范围
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> -
如果修改版本,只修改父工程的依赖jar包版本即可
项目聚合(一键安装)
-
聚合:如果有多个工程需要安装,一个一个工程进行安装,太麻烦了;可以利用聚合,将多个工程管理起来,实现一键安装。
(也就是将一个父工程进行安装,其他被聚合的工程也同时进行安装)
-
在父工程中定义modules标签
<!-- 项目聚合 --> <modules> <module>../Hello</module> <module>../HelloFriend</module> <module>../MakeFriend</module> </modules>创建maven版web工程
-
创建Maven的Web工程,需要选择packaging 的值为war
-
安装maven项目转web项目的插件JBLJavaToWeb找到后直接安装
-
右击maven项目,选中JblJavaToWeb
酷站
· 搜索需要的jar包的依赖信息

浙公网安备 33010602011771号