一、理论
Maven 是 Apache 软件基金会组织维护的一款专门为 Java 项目提供项目构建和依赖管理支持的工具。
通过Maven管理依赖的优势:
1、通过在pom.xml中指定jar包坐标即可自动从仓库下载依赖
2、如果jar包存在子依赖会自动下载子依赖包
3、如果jar包之间存在冲突,可以通过Maven的版本仲裁机制(最短路径优先,路径相同先声明者优先)或手动添加excludes标签,排除重复的依赖
TODO依赖范围
1、compile:默认依赖范围,编译、运行时都需要,会被打入jar包
2、test:仅在测试时需要
3、runtime:运行时需要,编译时不需要,会被打入jar包,如jdbc驱动包
4、provided:编译时需要,运行时不需要,不会被打入jar包,如servlet-api
继承与聚合:
父工程打包方式要用pom,通过父工程可以定义好所有子工程的依赖。
父工程的主要标签:modules、dependencyManagement
modules可以聚合子工程,通过执行父工程的构建命令会按序执行所有聚合的子工程,避免出现子工程间存在依赖关系,而由于构建顺序导致的报错
dependencyManagement可以声明依赖版本
通过import标签实现父工程继承另一个父工程:
<dependencyManagement>
<dependencies>
<!-- SpringCloud 微服务 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
二、命令
mvn clean:删除target目录
mvn compile:将src/main/java目录下的Java源文件编译为.class文件输出到target目录下
mvn test:会执行src/test/java目录下的单元测试类
mvn package:jar工程打成jar包,war工程打成war包
mvn install:将package打成的jar/war包发布到本地仓库
mvn deploy:将jar包部署到远程仓库,供其他人使用
三、settings.xml
settings.xml是maven的核心配置文件
<!-- 指定本地仓库 -->
<localRepository>D:\software\maven-repository</localRepository>
<!-- Maven 下载 jar 包默认访问境外的中央仓库,速度很慢,改成阿里云提供的镜像仓库 -->
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
<!-- 修改Java工程默认使用的JDK版本 -->
<profile>
<id>jdk-1.8</id>
<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>
四、pom.xml
pom.xml是maven工程的核心配置文件
<!-- 当前Maven工程的坐标 -->
<groupId>com.micozone</groupId>
<artifactId>demo</artifactId>
<version>1.0</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<!-- Maven工程的打包方式,jar:jar包,war:war包,pom:父工程 -->
<packaging>jar</packaging>
<!-- 自定义属性,通过${}引用属性值 -->
<properties>
<!-- 工程构建过程中读取源码时使用的字符集 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!-- 当前工程依赖 -->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<!-- 配置依赖的范围 -->
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<!-- Maven自带插件,执行编译命令时使用该插件-->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<!--使用定制化插件,修改Maven默认的打jar策略:生成可执行的jar包 -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.5.5</version>
</plugin>
</plugins>
</build>
五、Nexus
Nexus是Maven仓库管理软件,可以用来搭建Maven远程仓库私服。
如果本地仓库没找到,会优先从私服找,私服如果没有才会去远程仓库找。
Nexus可以创建多个仓库,仓库类型有三种:
1、proxy:代理仓库,用于代理远程仓库,如阿里仓库镜像
2、hosted:本地仓库(宿主仓库),分为发行版release和快照版snapshot,快照版指版本号带有-SNAPSHOT,从本地上传的依赖都会放到release的宿主仓库中。
3、group:仓库组,聚合代理仓库和宿主仓库,提供统一服务地址。先去宿主仓库找,如果没有找到再去代理仓库找,找到之后缓存到私服,下次就能从私服直接获取。
五.1 搭建
将 nexus-3.25.1-04-unix.tar.gz 上传至Linux服务
# 解压
tar -zxvf nexus-3.25.1-04-unix.tar.gz
# 切换到bin目录
cd /micozone/app/nexus-3.25.1-04/bin
# 执行
./nexus start
# 查看状态
./nexus status
# 登录地址:http://ip:8081 账号:admin 密码:在/micozone/app/sonatype-work/nexus3目录下
PS:
创建自定义宿主仓库时,Deployment policy 选择 Allow redeploy,这样才能上传同一个jar包的不同版本
五.2 使用
修改settings.xml
<servers>
<server>
<id>micozone-public</id>
<username>admin</username>
<password>jrbjrb811</password>
</server>
</servers>
<mirrors>
<mirror>
<id>micozone-public</id>
<mirrorOf>*</mirrorOf>
<name>micozone public</name>
<!--指定nexus上group类型的仓库-->
<!--查询依赖的顺序:本地仓库、仓库组下的仓库、仓库组下的代理仓库指定的远程仓库地址-->
<url>http://192.168.84.10:8081/repository/micozone-public/</url>
</mirror>
</mirrors>
如果要通过mvn deploy命令将本地项目的jar包部署到Nexus,需修改pom.xml
<distributionManagement>
<repository>
<id>micozone-public</id>
<!--settings.xml中配置的仓库组下的release类型的宿主仓库地址-->
<url>http://192.168.84.10:8081/repository/micozone-release/</url>
</repository>
<snapshotRepository>
<id>micozone-public</id>
<!--settings.xml中配置的仓库组下的snapshot类型的宿主仓库地址-->
<url>http://192.168.84.10:8081/repository/micozone-snapshot/</url>
</snapshotRepository>
</distributionManagement>
将本地jar上传至私服有两种方式,第一种是通过mvn clean deploy(前提是pom.xml中配置了distributionManagement标签),将打成的jar包上传至release类型的宿主仓库中(会同步上传至仓库组下);第二种是直接在Nexus服务器上release类型的宿主仓库下直接上传jar包。