ringBoot实践(三十三):maven的使用

发布于:2022-11-06 ⋅ 阅读:(501) ⋅ 点赞:(0)

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标签主要用于指定依赖的作用范围,其中有如下取值:

  1. compile:maven的默认范围,作用在所有范围 可以依赖传递;
  2. provided :只在编译和测试时生效,正式发布jar包或者war包时该依赖不会被包含进去,不会传递
  3. runtime:只在运行时和测试时生效,典型的是数据库驱动依赖,可以依赖传递
  4. test :只在测试时生效,不会依赖传递;
  5. 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查看默认的操作,这里也可以集成外部的,如使用idea在打开通过spring.io创建的springboot工程后,工程的glugin中会默认有spring-boot-maven-plugin标签,在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>