Maven初级

什么是Maven

  • 是一个基于项目对象模型(POM)概念的项目管理工具
  • 主要用于管理Java项目,进行依赖管理和项目构建
  • 能够分模块开发,提高开发的效率
  • 通过在pom文件中编写坐标导入依赖

使用Mavne

  • 本地安装Maven,解压的目录不能有中文路径

  • 配置 settings.xml文件,主要是本地仓库的配置

1
2
3
4
5
6
7
8
9
10
11
12
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
<!-- 选择一个磁盘目录,作为本地仓库 -->
<localRepository>D:\Program Files\maven\myrepository</localRepository>

  • 访问中央仓库慢,配置阿里云的公共仓库
1
2
3
4
5
6
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
  • 在idea中更改,里面内置了Maven,将其改成本地的
QQ_1733930194375
  • 常用命令
  1. compile:编译
  2. clean:清理
  3. test:测试
  4. package:打包
  5. install:安装
  6. deploy:上传到私服
  • 生命周期

clean:清理工作

default:核心工作,编译,测试,打包,安装等

site:产生报告,发布站点等

仓库的概念

  • 存储依赖的地方,体现形式就是本地的一个目录。
  • 仓库中不仅存放依赖,而且管理着每个依赖的唯一标识(坐标),Java项目凭坐标获取依赖
  • 类型:
  1. 本地仓库:存储从远程仓库或中央仓库下载的插件和 jar 包
  2. 远程仓库:本地仓库没有,默认去远程仓库下载
  3. 中央仓库:包含了世界上大部分流行的开源项目构件,由 Maven 团队自己维护
  • 访问顺序 本地->私服(有的话)->远程->中央

POM文件配置

  • 基本配置
1
2
3
4
5
6
7
8
9
10
<project > :文件的根节点 .
<modelversion > : pom.xml 使用的对象模型版本
<groupId > :项目名称,一般写项目的域名
<artifactId > :模块名称,子项目名或模块名称
<version > :产品的版本号 .
<packaging > :打包类型,一般有 jar、war、pom 等
<name > :项目的显示名,常用于 Maven 生成的文档。
<description > :项目描述,常用于 Maven 生成的文档
<dependencies> :项目依赖构件配置,配置项目依赖构件的坐标
<build> :项目构建配置,配置编译、运行插件等。
  • 统一配置jar包版本,后面讲到分模块开发时有用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
在 pom.xml 文件中锁定 jar 包版本配置
<!-- 统一管理jar包版本 -->
<properties>
<mybatis.version>3.4.5</mybatis.version>
</properties>

<!-- 锁定jar包版本(可省略) -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
</dependencies>
</dependencyManagement>

<!-- 项目依赖jar包 -->
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
</dependencies>

依赖的生命周期

Jar包生效的时间段,即Jar的生命周期

依赖范围
在 pom.xml 文件中添加坐标时需要指定依赖范围(scope标签),依赖范围包括:

compile:编译范围,指 A在编译时依赖 B,此范围为默认依赖范围。编译范围的依赖会用在
编译、测试、运行,由于运行时需要所以编译范围的依赖会被打包。

provided:provided 依赖只有在当 JDK 或者一个容器已提供该依赖之后才使用, provided 依
赖在编译和测试时需要,在运行时不需要,比如:servlet api 被 tomcat 容器提供。

runtime:runtime 依赖在运行和测试系统的时候需要,但在编译的时候不需要。比如:jdbc
的驱动包。由于运行时需要所以 runtime 范围的依赖会被打包。

test:test 范围依赖 在编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用,
比如:junit。由于运行时不需要所以test范围依赖不会被打包。

system:system 范围依赖与 provided 类似,但是你必须显式的提供一个对于本地系统中 JAR
文件的路径,需要指定 systemPath 磁盘路径,system依赖不推荐使用

比如,导入web项目相关的依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
<!-- 生命周期 -->
<scope>compile</scope>
</dependency>
<dependency>
<!-- servlet编译环境 -->
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<!-- 生命周期 -->
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<!-- 生命周期 -->
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.3.0</version>
<scope>runtime</scope>
</dependency>


其他

  1. 导入maven项目只要将项目下的pom.xml文件导入

  2. 打成jar包包含自己项目所用的依赖

  • 配置或添加spring-boot-maven-plugin插件,使打包后的jar包内不包含依赖。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.1.1.RELEASE</version>
<configuration>
<layout>ZIP</layout>
<fork>true</fork>
<includes>
<include>
<groupId>nothing</groupId>
<artifactId>nothing</artifactId>
</include>
</includes><!-- 如果没有该配置,devtools不会生效 -->
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
  • 修改pom.xml向其中添加一插件,作用是把依赖都拷贝到lib文件夹下。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    	<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
    <execution>
    <id>copy-dependencies</id>
    <phase>package</phase>
    <goals>
    <goal>copy-dependencies</goal>
    </goals>
    <configuration>
    <!-- lib依赖包输出目录,打包的时候不打进jar包里 -->
    <outputDirectory>${project.build.directory}/lib</outputDirectory> <excludeTransitive>false</excludeTransitive>
    <stripVersion>false</stripVersion>
    <includeScope>runtime</includeScope>
    </configuration>
    </execution>
    </executions>
    </plugin>

    3. 分离打包后服务器启动脚本
  • 分离打包前,使用java -jar xxx.jar

  • 分离打包后,要指定lib的路径java -Dloader.path=“lib/” -jar xxx.jar