文章目录
- maven是什么
- maven怎么装
- settings.xml
- 本地仓库地址:localRepository
- 远程镜像:mirrors
- JDK 版本:profile
- 私服配置
- POM.xml中的常用标签
- project
- modelVersion
- groupId
- artifactId
- version
- properties
- dependencies
- build和plugins
- resources
- dependencyManagement
- repositories
- distributionManagement
- modules
- 依赖管理
maven是什么
Maven是一个Java工程的管理工具,跟其相同功能的工具如Gradle,Maven通过项目对象模型(POM:Project Object Model)用来描述整个项目,也就是POM.xml文件,使用Maven能够方便的管理JAR包依赖,Maven将当前工程需要的JAR 包从远程仓库下载到本地并自动完成依赖的传递,每个JAR有唯一标识也就是坐标,这是依赖可维护性的基础,Maven中的坐标是通过groupId、artifactId、version、packaging、classfier等这些元素定义。
maven怎么装
maven下载,windos系统下载后无需安装,放在一个路径中不带空格的文件夹,如program Files这个目录不能放,然后在系统环境变量中配置一下maven/bin的路径:
path中添加%MAVEN_HOME%\bin
验证maven安装成功,ctrl+R,进入cmd:
settings.xml
Maven安装目录下conf/settings.xml是maven配置文件,主要完成maven默认的本地仓库地址,远程仓库地址,jdk版本,profile,私服地址等的定义,大部分情况下需要修改部分标签,顶级标签如下,具体的使用方式和描述如下:Maven配置文件标签详解
<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
https://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository/>
<interactiveMode/>
<usePluginRegistry/>
<offline/>
<pluginGroups/>
<servers/>
<mirrors/>
<proxies/>
<profiles/>
<activeProfiles/>
</settings>
大部分情况下需要修改的标签介绍如下;
本地仓库地址:localRepository
windos下载安装后默认的本地仓库地址是windos用户下的/.m2/repository文件中,需要在conf/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>D:\softtools\my-maven</localRepository>
远程镜像:mirrors
同时,默认的远程仓库国内肯定是可慢或者不可达,需要修改成settings.xml中的配置:
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
JDK 版本:profile
这个根据maven中当前的配置情况和本地项目依赖情况配置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>
私服配置
规范情况下会使用内网搭建的nexus私服来代替远程镜像,本地项目直接从私服地址拉取依赖包,这样做的好处有:
- 防止内部代码外协;
- 规范化所有项目的基础依赖,统一版本号,比如springboot相关依赖;
- 可以将内部工程进行模块化后内部进行共享和依赖,比如常用的工具类封装成common工程等;
如果已经搭建并配置好nexus,在settings.xml中修改配置如下;
.修改maven配置文件
[root@jenkins ~]# vim /etc/maven/settings.xml
#找到 <servers> 标签,添加 Nexus 默认认证信息:
<server>
<id>my-nexus-releases</id>
<username>admin</username> #nexus的账号
<password>admin123</password> #nexus的密码
</server>
<server>
<id>my-nexus-snapshot</id>
<username>admin</username> #nexus的账号
<password>admin123</password> #nexus的密码
</server>
</servers>
#找到 <mirrors> 标签,添加镜像:1
<mirror>
<!--This sends everything else to /public -->
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://192.168.81.210:8081/repository/maven-public/</url> #nexus中maven-public的地址
</mirror>
#找到 <profiles> 标签,添加仓库信息:
<profile>
<id>nexus</id>
<!--Enable snapshots for the built in central repo to direct -->
<!--all requests to nexus via the mirror -->
<repositories>
<repository>
<id>central</id>
<url>http://192.168.81.210:8081/repository/maven-public/</url> #nexus中maven-public的地址
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<url>http://192.168.81.210:8081/repository/maven-public/</url> #nexus中maven-public的地址
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
#激活仓库:
<activeProfiles>
<!--make the profile active all the time -->
<activeProfile>nexus</activeProfile>
</activeProfiles>
POM.xml中的常用标签
当我们在idea中创建了一个maven工程后,最外层目录会有POM.xml,用来进行项目依赖管理,其中有很多标签/属性来定义当前正在开发的Java项目,全量的POM标签可参考:Maven 菜鸟教程,这里只介绍部分最常用和需要知道的标签。
<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>
<!-- 公司或者组织的唯一标志,并且配置时生成的路径也是由此生成, 如com.companyname.project-group,maven会将该项目打成的jar包放本地路径:/com/companyname/project-group -->
<groupId>com.companyname.project-group</groupId>
<!-- 项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 -->
<artifactId>project</artifactId>
<!-- 版本号 -->
<version>1.0</version>
<!-- 其他标签 -->
</project>
project
工程的根标签,也是POM中最顶级的标签,所有标签都在这个project标签内;
modelVersion
模型版本需要设置为 4.0。
groupId
这是工程组的标识。它在一个组织或者项目中通常是唯一的。例如,一个银行组织 com.alibaba.project-group 拥有所有的和银行相关的项目。
artifactId
这是工程的标识,它通常是工程的名称。
version
这是工程的版本号。在同个 artifact 仓库中可以用来区分不同的版本。例如:com.alibaba.bank:consumer-banking:1.1
properties
properties标签内可以把版本号作为变量进行声明,方便maven依赖标签用${变量名}的形式动态获取版本号。这样做的优点是当版本号发生改变时,仅仅需要更新properties标签中的变量值就行,比如定义一个lombok的版本号:
<properties>
<java.version>13</java.version>
<lombok.version>1.18.10</lombok.version>
</properties>
那么在依赖定义的时候可以直接使用lombok.version进行引用。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
<version>${lombok.version}</version>
</dependency>
dependencies
这里是依赖定义的顶级标签,其下是dependency标签,每个依赖通过groupId,artifactId,version三个标签找到唯一的jar包,但也有一些作用范围或者排除项,如下:
<dependencies>
<dependency>
<!--组织ID-->
<groupId></groupId>
<!--项目ID-->
<artifactId></artifactId>
<!--版本号-->
<version></version>
<!--依赖类型-->
<type></type>
<!--类别(类目)-->
<classifier></classifier>
<!--指定依赖的范围-->
<scope></scope>
<!--指定本地jar路径,和scope一起使用-->
<systemPath></systemPath>
<!--排除依赖列表-->
<exclusions>
<exclusion>
<artifactId></artifactId>
<groupId></groupId>
</exclusion>
</exclusions>
<!--指定是否需要被依赖-->
<optional></optional>
</dependency>
</dependencies>
classifier标签groupId,artifactId,version标签后面使用,可以简单地看做字符串的拼接,用于区分不同的工作环境,如果groupId,artifactId,version相同但jdk版本不同,需要定义固定的jdk版本等,具体看该依赖是否要加;
type标签有:pom,jar ,test-jar,maven-plugin,ejb,ejb-client,war,ear,rar,java-source,javadoc,如果不指定,默认为jar.一般开发中常用的是jar,war,pom等;
scope标签主要用于指定依赖的作用范围,其中有如下取值:
- compile:maven的默认范围,作用在所有范围 可以依赖传递;
- provided :只在编译和测试时生效,正式发布jar包或者war包时该依赖不会被包含进去,不会传递
- runtime:只在运行时和测试时生效,典型的是数据库驱动依赖,可以依赖传递
- test :只在测试时生效,不会依赖传递;
- system:表明该依赖不会从中央仓库查找,而是从用户指定的systemPath位置获取,与systemPath共同使用
systemPath:仅当scope为system时才可以使用。否则,如果设置了这个元素,构建时将会失败。systemPath的路径必须是绝对路径,这里可以利用properties的属性来指定。例如${java.home}/lib。
exclusions:排除依赖中不需要的项
optional:默认值:false。optional=true 表示此依赖包不会在其他项目中被引用加载、不参与maven的依赖传递。
build和plugins
build标签描述如何来编译及打包项目,而具体的编译和打包工作是通过build中配置的 plugin 来完成。当然plugin配置不是必须的,默认情况下Maven 的生命周期足够完成基本操作,可以通过idea右侧的maven的Lifecycle查看,集成外部的plugins目的是绑定生命周期做额外的操作;
<groupId> : 项目或者组织的唯一标识
<artifactId> 项目的通用名称
<artifactId> 项目的通用名称
<version> 项目的版本
<extensions> 是否加载该插件的扩展,默认为false
<inherited> 该插件的<configuration>中的配置是否可以被继承,默认为true
<configuration> 该插件所需要的特色配置,在父子项目项目之间可以覆盖或被合并
<dependencies> 该插件所特有的依赖类库
<executions> 该插件的某个goal(一个插件可能有多个goal)的执行方式.一个<executions>有如下设置
<id> 唯一标识
<goals> 要执行的插件的goal.这个是可以有多个的
<phase> 插件的goal要嵌入到Maven的phase中执行
<inherited> 该execution是否可被子项目继承
<configuration> 该execution的其他配置参数
可以使用maven-compiler-plugin插件配置JDK版本:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<!-- 不同的插件的参数配置不一样 -->
<configuration>
<source>11</source>
<target>11</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
在使用idea在打开通过spring.io创建的springboot工程后,工程的glugin中会默认有spring-boot-maven-plugin标签:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.7.RELEASE</version>
<configuration>
<mainClass>com.example.sprintbootparent.SprintbootParentApplication</mainClass>
</configuration>
</plugin>
</plugins>
</build>
在idea右侧的plugins中可以发现spring-boot-maven-plugin提供了6个maven goal:
- build-info:生成项目的构建信息文件 build-info.properties
- help:用于展示spring-boot-maven-plugin的帮助信息。
- repackage:可生成可执行的jar包或war包。插件的核心goal。
- run:运行 Spring Boot 应用
- tart:在集成测试阶段,控制生命周期
- stop:在集成测试阶段,控制生命周期,
打包主要使用的是repackage ,它是spring-boot-starter-parent为插件设置的默认goal。这个goal绑定在maven的 package生命周期上,完整命令为mvn package spring-boot:repackage。在 mvn package 执行打包之后,repackage 再次打包生成可执行的 jar包或war包。
还有一个妙用就是,将spring-boot-maven-plugin引入普通非springboot工程的pom,执行 mvn package 命令,即可打jar包(插件默认打jar包),target文件夹里的 *.jar即为可执行,jar包默认胖包;普通工程使用spring-boot-maven-plugin标签
resources
用户控制工程中的资源目录,如springboot默认使用aplication.properties,如果想用别的可以使用该标签。
dependencyManagement
标签的作用是进行依赖(jar包)的版本控制,防止依赖版本出现多个而发生冲突,用来管理子项目的公共的依赖,保证所有的子项目使用依赖项的统一版本,如springboot工程的默认添加如下:
<dependencyManagement>
<dependencies>
<!-- 整合spring boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
如果该工程有子工程,在子工程的pom中添加:
<parent>
<artifactId>springboot-parent</artifactId>
<groupId>com.example</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
那么子工程使用springboot相关包不需要指定版本号:
<!-- 此处未使用<version>指定版本号,同时在<properties>中也未声明 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
这是因为spring-boot-dependencies,定义了几百个依赖版本号,子项目继承了父项目的依赖定义;
repositories
repositories标签的作用是用来配置maven项目的远程仓库,settings.xml定义后不需要特殊定义,私服需要修改;
distributionManagement
distributionManagement的作用是"分发构件至远程仓库",mvn deploy 用来将项目生成的构件分发到远程Maven仓库。本地Maven仓库的构件只能供当前用户使用,在分发到远程Maven仓库之后,所有能访问该仓库的用户都能使用你的构件,私服时使用;
modules
父项目定义子项目用到;
<modules>
<module>springboot-demo</module>
<module>springboot-security</module>
<module>juc</module>
<module>springboot-nacos</module>
<module>springcloud-gateway</module>
<module>springcloud-login</module>
<module>springboot-common</module>
</modules>