Maven
文章目录
一、使用Maven的原因
- 如果项目非常庞大,就不适合使用package划分模块,Maven可以将一个项目拆分成多个工程
- 使用Maven可以将jar包保存到仓库中,使用时直接从仓库中取即可,无需复制粘贴jar包
- 所有知名jar包都已经放在了Maven的仓库中,无需自己去网上寻找
- 使用Maven会将一个jar包依赖的jar包自动导入
二、Maven介绍
Maven是Apache的一款开源的项目管理工具,以后创建的无论是JavaSE还是JavaEE项目,都创建成为Maven项目;在Maven中每个项目都相当于是一个对象,对象(项目)和对象(项目)之间是有关系的;关系包含了:依赖、继承、聚合,使用Maven项目可以更加方便的实现导入jar包、拆分项目等效果
三、Maven的下载与安装
- Maven的下载地址:http://maven.apache.org/
- Maven的安装
(1) 将下载后的zip解压后得到
(2) 在conf目录下的settings.xml中修改
① settings标签中添加
<localRepository>E:\maven_localRepository</localRepository>
标签中的内容表示存放jar包的本地仓库在磁盘中的位置(可自行创建一个文件夹指定)
如果不指定,本地仓库默认路径:C:\Users[当前登录的用户名].m2\repository
② settings标签中的mirrors标签中添加
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
表示联网从远程仓库下载jar包时,使用阿里的镜像,使用官方地址下载速度很慢
③ settings标签中的profiles标签中添加
<profile>
<!-- 告诉maven我们用jdk1.8 -->
<id>jdk-1.8</id>
<!-- 开启JDK的使用 -->
<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>
当运行环境有多个JDK时,需要指定JDK,此处指定为JDK8
- Maven的环境变量配置
配置之后在控制台输入mvn -v检查是否安装成功(出现jdk版本及maven版本表示安装成功)
三、Maven仓库的介绍
1. 远程仓库
(1) 中央仓库
地址:https://mvnrepository.com/
联网下载jar包时默认从中央仓库中下载,如图:
(2) 中央仓库镜像
分担中央仓库的流量,之前配置的阿里镜像即中央仓库镜像
(3) 私服仓库
公司内部在局域网搭建的Maven仓库,公司内部使用
2. 本地仓库
远程仓库下载后的jar包存放在本地仓库中,之前已配置路径
3. 仓库优先级
四、Maven坐标的介绍
五、Maven工程类型
- POM工程
POM工程是逻辑工程,用在父级工程或聚合工程中,用来做jar包的版本控制
- JAR工程
将会打包成jar,用作jar包使用,即常见的本地工程 —> Java Project
- WAR工程
将会打包成war,发布在服务器上的工程
六、IDEA中使用Maven
- IDEA中配置Maven
- IDEA中创建Maven项目
- Maven项目的目录结构介绍
src
包含了项目所有的源代码和资源文件,以及项目相关的其他文件
src/main/java
这个目录下储存java源代码
src/main/resources
储存主要的资源文件,比如xml配置文件和properties文件
src/test/java
储存测试用的类,比如JUNIT的测试一般就放在这个目录下面
src/test/resources
可以手动创建一个文件夹,储存测试环境用的资源文件
pom.xml
是Maven最重要的配置文件,可以配置项目和项目之间的关系、导入jar包等
target
与src同等级,编译后的内容放置的文件夹(目前没有编译,所以没有此结构)
产生方式:
注意:点击install时可能会出现警告
解决方法:
在pom.xml中添加:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
七、Maven工程的关系
1. 依赖关系
A工程开发或运行需要B工程支持,则代表A工程依赖B工程
通俗理解为,依赖关系就是导入jar包,B工程可以是自己项目install之后的jar包,也可以是 仓库中的jar包
注入依赖的方法:在pom.xml中配置:
过程:先在本地仓库中找,如果找不到,联网去远程仓库中找,下载到本地仓库后导入,结果:
依赖的好处:
(1) 编程人员无需手动添加jar包,直接在pom.xml中配置即可,将依赖的dependency配置 删除,项目自动的将对应的jar包删除
(2) 可以解决jar包冲突问题,如果导入了不同版本的相同jar包,项目中不会出现两个jar 包,自动的保留其中的一个
① 依赖的特性和原则
(1) 特性
Maven项目1依赖了jar1,Maven项目2依赖了Maven项目1,则Maven项目2中也 会将jar1导入进来,可以直接使用项目1依赖的jar1
项目1依赖项目2的方法与依赖jar包方式一致,配置项目install之后的坐标即可
(2) 原则
i. 最短路径优先原则
例如,假设A、B、C之间的依赖关系是A->B->C->D(2.0) 和 A->E->(D1.0),那么D(1.0) 会被使用,因为A通过E到D的路径更短
ii. 最先声明优先原则
在依赖路径长度相等的前提下,在pom.xml中依赖声明的顺序决定了谁会被解析使 用,顺序最靠前的那个依赖优先使用
② 排除依赖
A依赖B,B依赖C,C依赖mybatis.jar,在A中排除C中的mybatis.jar
<!-- 项目A的pom.xml中编辑 -->
<dependencies>
<!-- 依赖项目C -->
<dependency>
<groupId>com.qizegao</groupId>
<artifactId>MavenDemo</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- <exclusions>中可以使用多个<exclusion> -->
<exclusions>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<!-- 不写版本号 -->
</exclusion>
</exclusions>
</dependency>
</dependencies>
③ 依赖范围
依赖范围决定依赖的jar包什么情况下有效,什么情况下无效
依赖范围使用方式:
依赖范围分类:
compile
这是默认范围,如果没有指定,就会使用该依赖范围,表示该依赖在编译和运行时都生效
provided
编译和测试项目的时候需要该依赖,但在运行项目的时候,不生效
runtime
编译时不需要生效,而只在运行时生效
system
依赖范围与provided类似,使用system范围依赖时必须通过systemPath标签显式地指定依 赖文件的路径
test
只在编译测试代码和运行测试的时候需要,项目的正常运行不需要此类依赖
import
import必须声明在pom.xml配置文件中的标签中,指定jar包的 版本号
2. 继承关系
将父工程声明为POM工程,子工程默认会导入父工程依赖的jar包
(使用dependencyManagement标签管理所有jar包,控制jar包的版本)
<groupId>com.qizegao</groupId>
<artifactId>ParentMaven</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 打包类型,默认是jar -->
<packaging>pom</packaging>
<!-- 管理所有jar包,使用dependencyManagement标签表示不会引入这些jar包,仅管理 -->
<!-- 使用properties标签和${}控制版本 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<!-- 使用properties标签中的版本号 -->
<version>${name}</version>
</dependency>
</dependencies>
</dependencyManagement>
<properties>
<!-- 此标签可任意起名 -->
<name>3.5.6</name>
</properties>
声明一个子工程继承于上述工程
<!-- parent标签指定父工程 -->
<parent>
<groupId>com.qizegao</groupId>
<artifactId>ParentMaven</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 以下标签声明父工程的pom.xml文件所在的位置 -->
<relativePath>../ParentMaven/pom.xml</relativePath>
</parent>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<!-- 无需声明版本号,继承父工程的版本号,父工程可以控制子工程的版本号 -->
<!-- 子工程可以使用version标签指定版本号而不使用父工程的版本号 -->
</dependency>
</dependencies>
注意:如果父工程使用了import依赖范围,则子工程必须使用父工程指定的版本号
3. 聚合关系
当开发的工程拥有多个模块 (每个模块都是一个独立的项目) 时,需要使用聚合工程
聚合工程的总工程 (最上层的父工程) 必须是一个POM工程,其余模块被其包含,在父工程中 使用标签表示包含的子模块:
八、Maven的常用插件
1. 资源拷贝插件
Maven在打包时默认只将src/main/resources里的配置文件拷贝到项目中并做打包处理,而非 此目录下的配置文件在打包时不会添加到项目中,使用此插件可打包指定文件
在pom.xml中配置要打包的资源:
<build>
<resources>
<resource>
<!-- 要打包的资源位置 -->
<directory>src/main/java</directory>
<includes>
<!-- 要打包的资源 -->
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<!-- 要打包的资源位置 -->
<directory>src/main/resources</directory>
<includes>
<!-- 要打包的资源 -->
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
</build>
2. Tomcat插件
无需依赖外部的Tomcat服务器,Maven提供了tomcat插件
(1) 创建一个web项目
创建后的结构(缺少的如java、resources等目录可手动创建):
注意:创建项目时如果出现警告:
No archetype found in remote catalog. Defaulting to internal catalo
解决方式:
(2) pom.xml文件中配置Tomcat插件
<build>
<plugins>
<!-- 配置Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!-- 配置Tomcat监听端口 -->
<port>8080</port>
<!-- 配置项目的访问路径(Application Context) -->
<path>/</path>
</configuration>
</plugin>
</plugins>
运行结果:
地址栏输入:http://localhost:8080/MyProject
成功访问到index.jsp页面
(在jsp页面修改编码格式为UTF-8,防止乱码)
出现此表示服务器启动成功
九、Maven的常用命令
Maven的命令都可以在以上图示右侧栏直接点击执行
- install
本地安装,包含编译、打包,安装到本地仓库
编译 - javac命令
打包 - jar命令,将java代码打包为jar文件
安装到本地仓库 - 将打包的jar文件保存到本地仓库中
-
clean
清除已编译信息,删除工程中的target目录,会删除打包的jar文件 -
compile
只编译,相当于javac命令 -
package
打包,包含编译、打包两个功能
install和package的区别:
package命令完成了项目编译、单元测试、打包功能,但没有把打好的可执行jar包 (war包或其它 形式的包) 布署到本地maven仓库和远程maven私服仓库
install命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包 (war包或其它形式 的包) 布署到本地maven仓库,但没有布署到远程maven私服仓库