一、Maven是什么?有什么优点?
Maven介绍
Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件
Maven优点
- 解决jar包冲突的问题
- 解决jar包依赖的问题
- jar文件不用在每个项目保存,只需要放在仓库
- maven可以指定jar的依赖范围
二、Maven目录结构
Maven创建项目的的目录结构大体如图所示,src下包含main和test目录,这两个目录下又包含java和resources目录,分别存放项目的代码以及测试的代码
target目录下的class目录则是存放编译后的代码
而Maven的核心文件pom.xml便是资源文件,确定该项目需要使用哪些jar包的坐标,并通过该坐标在中央仓库进行自动下载。
三、利用Idea开发工具创建Maven项目
四、配置本地仓库
首先本地仓库是什么?
英文名为localRepository,它是用来存储从远程仓库或中央仓库下载的插件和jar包,项目使用一些插件或jar包,优先从本地仓库查找。
作为使用者,我们往往想指定自己创建的一个目录作为本地仓库,那我们应该怎么做呢?
做法其实很简单,我们找到Maven安装目录下的conf目录下的settings.xml
然后修改settings.xml文件的内容
在框中的标签里将你指定的目录地址替换掉就ok了,这样以后通过Maven下载的jar包都会存在这里,当本地仓库没有对应的jar包的时候,Maven会自己去中央仓库中寻找并下载到本地仓库。
五、有关Maven常用的项目构建命令
下图表格是Maven常用的项目构建命令
命令 | 描述 |
---|---|
mvn clean | 清除项目原来的编译结果 |
mvn compile | 编译源文件 |
mvn test | 运行测试代码 |
mvn package | 打包项目war/jar |
mvn install | 打包并安装到本地仓库 |
mvn deploy | 发布到本地仓库或者服务器 |
六、Maven坐标
Maven坐标的主要组成
groupId:定义当前Maven项目的隶属项目、组织
artifactId:定义实际项目的一个模块
version:定义当前项目的版本
packaging:定义该项目的打包方式(jar/war,默认为jar)
例子:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
那我们如何去让Maven自动下载我们想要的jar包
首先我们去官网https://mvnrepository.com/在里面搜索我们想要的jar包
比如 mysql-connector-java这个包
然后点击search,点击下图所示
这里有这个包的各种版本,点击你想要的的版本
然后就能看到对应的坐标了,将这个坐标信息复制到pom.xml文件的dependencses标签下,Maven就会自动下载jar包并放进本地仓库
七、Maven的依赖范围
在每个dependency标签里面都有一个子标签scope
他有以下几个属性
- compile:编译域,这个是Maven中scope的默认值,不写scope配置时默认就是使用这个值,compile表示被依赖项目需要同当前项目编译时一起编译,项目测试期以及本项目运行时同样生效,打包的时候需要包含进去
- test:测试域,表示被依赖的项目仅仅在项目进行测试时生效,项目运行时不会生效
- provided:表示打包的时候不用讲provided域的包打进去
- runtime:运行域,表示被依赖的项目不会参与项目的编译,但项目的测试时期和运行时期会参与,与compile相比,跳过了编译时期。
- system:跟provide相似,但是在系统中要以外部jar包的形式提供,Maven不会在仓库中查找它
- import:只使用在< dependencyManagement >中,表示从其他pom文件中导入dependency的配置
八、Maven可选依赖和依赖排除
可选依赖:是否希望将该依赖向下传递? 默认为false,向下传递,如果选择true则不向下传递
<!-- spring-boot-devtools -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional> <!-- 表示依赖不会传递 -->
</dependency>
排除依赖:
如果一个项目A依赖另一个项目B时,会将B项目的依赖jar包都会依赖。
但如果不想依赖B项目中的某一个依赖时,可设置exclusions排除指定的依赖
<!-- 定时任务 -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<exclusions>
<exclusion>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
</exclusion>
</exclusions>
九、Maven项目的继承
作用:在使用的时候子工程直接继承父工程的版本号,子工程中不再需要指定版本号,方便统一管理项目的依赖版本问题。
下面用代码展示
首先创建一个父工程
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.learn.maven</groupId>
<artifactId>mavendemo-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>mavendemochild</module>
</modules>
<packaging>pom</packaging>
<description>父工程</description>
<!--抽取子工程的依赖-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.1.7.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
我们可以看到有一个dependencyManagement标签,父工程在这个标签下定义子工程依赖的jar包
然后再创建一个子工程
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!--引用父工程-->
<parent>
<artifactId>mavendemo-parent</artifactId>
<groupId>org.learn.maven</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>org.learn.maven</groupId>
<artifactId>mavendemochild</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
</dependencies>
</project>
这个时候子工程的坐标中就不需要定义version这个标签了,由父类统一管理
同时要注意子类的pom.xml文件中parent标签里要将父工程的坐标复制过去
十、Maven的聚合
Maven:将多个Maven模块整合在一起称为聚合
好处:可以将多个模块整体运行,不需要先将被依赖的模块打包至仓库再运行项目。
假如MavenA 依赖MavenB,如果只是在MavenA模块的pom.xml中dependency MavenB,则必须先将MavenB安装并打包至仓库。
通常我们会新创建一个聚合项目,这个项目作为一个载体将项目的所有的模块都整合在一起。
我们只需要在这个载体上加上
<modules>
<module>MavenA</module>
<module>MavenB</module>
</modules>
下面举个例子:
首先创建mavendemoservice项目
pom.xml文件如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.learn.maven</groupId>
<artifactId>mavenservice</artifactId>
</project>
创建mavenweb模块,增加service的依赖,但是我们此前是没有把mavendedoservice这个模块install进仓库的
pom.xml如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.learn.maven</groupId>
<artifactId>mavenweb</artifactId>
<!--依赖Service模块-->
<dependencies>
<dependency>
<groupId>org.learn.maven</groupId>
<artifactId>mavenservice</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
再创建一个作为载体的工程
pom.xml如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.learn.maven</groupId>
<artifactId>mavendemo-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>mavenservice</module>
<module>mavenweb</module>
</modules>
<packaging>pom</packaging>
<description>父工程</description>
<!--抽取子工程的依赖-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.1.7.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
在modules标签下创建module,注意module里面写的是要聚合项目的路径,可以用相对路径
本篇文章依旧是作为个人的学习笔记,如有见解不到之处还望指教
有蛮多内容是从这个博客学习的,附上链接