Maven入门
mvn的常用指令
- mvn -v:查看maven版本
- mvn -compile:编译
- mvn -test:测试
- mvn- package:打包
- mvn -clean:删除target目录
- mvn -install:安装jar包到本地仓库中。
当项目缺乏依赖时,需要将jar包添加到本地仓库中,或者从网上下载后添加到本地仓库中。比如我们要开发SpringBoot应用,就需要添加如下依赖。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
groupId
是项目组织名,artifactId
是项目名。groupId一般的格式是域.公司
,比如com.tencent,如果它有项目名为qq,那么包名一般就是com.tencent.qq。
自动化创建项目的目录骨架
创建目录可以使用下面的命令
1. mvn archetype:generate 按照提示进行选择
2. mvn archetype:generate -DgroupId=组织名
-DartifactId=项目名-模块名
-Dversion=版本号
-Dpackage=项目所在的包
仓库
Maven的中央仓库访问起来可能比较慢,通过设置镜像仓库,可以改善这个问题,推荐使用阿里云的镜像。在settings.xml
中添加如下<mirror>
标签
<mirrors>
<mirror>
<id>nexus-ailiyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus ailiyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
</mirrors>
从网上的仓库中下载下来的jar包会保存在本地,下次添加依赖时如果本地仓库中已经存在了,就不必从网上下载了。本地仓库默认位置在C:Users/your-username/.m2
,如果要更换默认位置,可以修改settings.xml
文件
<!-- 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>
取消注释,选一个合适的路径来作为本地仓库。
pom.xml
pom是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">
<!-- 指定了当前pom的版本 -->
<modelVersion>4.0.0</modelVersion>
<groupId>com.shy(组织域名的反写)</groupId>
<artifactId>springboot(项目名)</artifactId>
<!-- 0.0.1-SNAPSHOT
第一个0表示大版本
第二个0表示分支版本号,第三个1表示小版本号
SNAPSHOT表示快照版本
ALPHA表示内测版
BETA表示公测版
RELEASE表示稳定版
-->
<version>0.0.1-SNAPSHOT(版本号)</version>
<!-- maven项目的打包方式,默认是jar,也可以打包成war、zip、pom -->
<packaging>jar</packaging>
<!-- 项目名 -->
<name>springboot</name>
<!-- 项目的描述 -->
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<!-- 依赖范围,表示Junit只在测试环境下使用
还有以下范围
compile:默认的范围,编译测试运行都有效;
provided:在编译和测试时有效,在实际运行时不会被加入
system: 在编译和测试时有效,与本机系统相关联,可移植性差
import: 只使用在 dependencyManagement标签中,表示从其他的pom中导入dependency配置
-->
<scope>test</scope>
<!-- <optional></optional>设置依赖是否可选 -->
<!--
exclusions设置排除依赖传递的列表。如果A依赖于B,B又依赖于C,我们说存在依赖关系,在A中引入B时候,会自动引入C。如果不想引入C,可以在exclusions中将其排除。
<exclusions></exclusions>
-->
</dependency>
</dependencies>
<build>
<!-- 插件类,也要指定“坐标” -->
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
依赖范围
- compile:默认的范围,编译测试运行都有效;
- provided:在编译和测试时有效,在实际运行时不会被加入
- test:只在测试环境下使用
- system: 在编译和测试时有效,与本机系统相关联,可移植性差
- import: 只使用在 dependencyManagement标签中,表示从其他的pom中导入dependency配置
依赖传递
exclusions标签:设置排除依赖传递的列表。如果A依赖于B,B又依赖于C,我们说存在依赖关系,在A中引入B时候,会自动引入C。如果不想引入C,可以在exclusions中将其排除。
依赖冲突
1、短路径优先
如果有两条依赖传递关系
1) A -> B -> C -> X(jar)
2) A -> D -> X(jar)
会选择短的路径2。
2、谁先声明谁优先
在pom文件中,哪个依赖写在前面就优先引用该依赖。
继承
用于在子模块中对父模块的一个pom的继承,作用就是对代码的复用。比如在SpringBoot项目的pom文件中就有下面的几行。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
模块的聚合
如果我们的项目分成了好几个模块,那么我们构建的时候是不是有几个模块就需要构建几次了(到每个模块的目录下执行mvn命令)?当然,你逐个构建没问题,但是非要这么麻烦的一个一个的构建吗,那么简单的做法就是使用聚合,一次构建全部模块。
<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>com.youzhibing.account</groupId>
<artifactId>account-aggregator</artifactId>
<version>1.0.0-SNAPSHOT</version>
<!-- 聚合pom.xml文件的打包方式必须是pom -->
<packaging>pom</packaging>
<modules> <!-- 模块都写在此处 -->
<module>account-register</module>
<module>account-persist</module>
</modules>
</project>
如上,只需对account-aggregator进行打包,就能一次性构建所有模块了。聚合POM与继承中的父POM的packaging标签都必须是pom。
dependencies和dependencyManagement的区别
- dependencies即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继承)
- dependencyManagement里只是声明依赖,并不实现引入。如果在子项目不声明依赖,是不会从父项目中继承下来的;所以要添加依赖还需显式声明,如果没有指定具体版本,会从父项目中继承该项,并且version和scope都读取自父pom;但是如果子项目中指定了版本号,那么就使用子项目中指定的jar版本。
网友评论