一、理论
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包。