Maven进阶概念入门详解

Maven进阶概念入门详解

在一次需求迭代中,同事要求我把写好的RPC接口打好包上传到公司私服上,我人直接当场懵逼住了。

Maven进阶概念入门详解_第1张图片

突然发现自己对于Maven仅仅是处于最基础的使用阶段,不仅不知道背后的一些原理,甚至连一些常见的概念都不是很清晰,仅仅会使用Maven构建项目,引入依赖,打包等最基础的操作,所以连忙补补课,成功完成了需求,并且在此处总结一下Maven中稍微进阶一点的知识。

依赖

依赖是我们在使用Maven构建项目时最常使用的功能,通过依赖标签,我们可以直接从Maven仓库中引入对应的Jar包,无需手动再将Jar添加到目录下了,可谓是十分方便,不过我们除了使用,还需要考虑多模块下依赖之间的关系。

依赖配置

这个大家应该都很熟悉了,通过标签引入Maven依赖

<dependencies>	
	
     <dependency>
          <groupId>javax.servletgroupId>
          <artifactId>javax.servlet-apiartifactId>
     dependency>
dependencies>

引入依赖之后,刷新一下Maven依赖就可以引入相关的Jar包了。

依赖传递

依赖具有传递性,当我们引入了一个依赖的时候,就会自动引入该依赖引入的所有依赖,依次往下引入所有依赖。

比如我们引入了Druid数据库连接池的SpringBoot-Starter,那么就会自动引入一些依赖

Maven进阶概念入门详解_第2张图片

如图,我们仅仅引入了druid-spring-boot-starter依赖,就自动引入了该依赖依赖的依赖。总而言之就是套娃就完事了。

我们将这三个依赖称为间接引入的依赖,而我们在标签中引入的依赖称为直接依赖,那么如果这两个重复了并且版本不一样的话会怎么办呢,最后引入的到底是哪个版本呢,还是说都会引入呢?

如果重复了,遵从以下规则

Maven进阶概念入门详解_第3张图片

简单来说,就是越在外层的优先级越高,如果同级的就按照配置顺序,配置顺序靠前的覆盖配置顺序靠后的。

可选依赖

可选依赖指对外隐藏当前所依赖的资源

<dependency>
	<groupId>junitgroupId>
	<artifactId>junitartifactId>
	<version>4.12version>
	<optional>trueoptional>
dependency>

配置了该选项之后,间接依赖就失效了。

排除依赖

排除依赖指主动断开间接依赖的资源

<dependency>
	<groupId>junitgroupId>
	<artifactId>junitartifactId>
	<version>4.12version>
	<exclusions>
		<exclusion>
			<groupId>org.hamcrestgroupId>
			<artifactId>hamcrest-coreartifactId>
		exclusion>
	exclusions>
dependency>

配置了该选项之后,间接依赖也会失效。

排除依赖和可选依赖的区别:

可选依赖是依赖提供者设置的,比如我们引入了Durid,那么该选项由Durid开发者设置

排除依赖由依赖引入者设置,比如我们引入了Durid,那么我们可以设置该选项

依赖范围

依赖的jar默认情况可以在任何地方使用,可以通过scope标签来改变依赖的作用范围。

Maven进阶概念入门详解_第4张图片

主代码指的是main文件夹下的代码,测试代码指的是test文件夹下的代码(就那个绿色的玩意),打包指的是maven package指令执行时是否将Jar包打包。

其实如果我们偷懒的话,全部都默认也不是不可能,不过为了我们程序代码的可读性与简洁性,还是按照规范来比较好。

生命周期与插件

项目构建生命周期

Maven项目构建生命周期描述的是一次构建过程经历了多少个事件,我们可以把生命周期当成一个人的年龄。

Maven将生命周期划分为三个大阶段,类似于人类的婴儿,青年,入土

  • clean:清理工作
  • default:核心工作,例如编译,测试,打包,部署
  • site:产生报告,发布站点

第一个和第三个周期比较简单,我们重点介绍一下default阶段

先上一张劝退图

Maven进阶概念入门详解_第5张图片

以上就是defalut阶段完整的生命周期,其中标红的地方,是几个比较重要的周期,在Idea的Maven工具中也能体现出来

Maven进阶概念入门详解_第6张图片

当我们在Idea中点击这几个生命周期时,Maven会自动将之前所有的生命周期都执行到,就类似于如果我18岁了,那么我肯定经历过8岁。

插件

插件就是Idea中Maven工具的Plugins部分

Maven进阶概念入门详解_第7张图片

通过pom文件中的标签引入新的插件

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.pluginsgroupId>
                <artifactId>maven-compiler-pluginartifactId>
                <version>3.1version>
                <configuration>
                    <source>1.8source>
                    <target>1.8target>
                    <encoding>UTF-8encoding>
                configuration>
            plugin>
        plugins>
build>

那么什么是插件呢?

  • 插件与生命周期内的阶段绑定,在执行到对应生命周期时执行对应的插件功能

  • 默认maven在各个生命周期上绑定有预设的功能

  • 通过插件可以自定义其他功能

    <build>
    	<plugins>
    		<plugin>
    			<groupId>org.apache.maven.pluginsgroupId>
    			<artifactId>maven-source-pluginartifactId>
    			<version>2.2.1version>
    			<executions>
    				<execution>
    					<goals>
    						<goal>jargoal>
    					goals>
    					<phase>generate-test-resourcesphase>
    				execution>
    			executions>
    		plugin>
    	plugins>
    build>
    

    上述自定义插件的作用指的是在generate-test-resources生命周期执行打jar包的操作。

其实简单的说,生命周期就是一个人的年龄阶段,而插件就是每个人在每个年龄需要做的事情

总结:

Maven进阶概念入门详解_第8张图片

Maven将一个项目构建的过程分为一长串连续的生命周期,在对应的生命周期会通过插件完成对应的事件,通过使用Maven的生命周期,我们可以获得我们需要的功能,可能是打jar包,可能是安装到本地仓库,可能是部署到私服。

模块聚合

当使用Maven进行多模块开发的时候,有可能出现A模块依赖B模块,B模块依赖C模块,那么我们如果想对A模块打包,那么就要先打包C模块,再打包B模块,最后打包A模块才能成功,否则会报错,并且,如果C模块更新了,我们也要手动更新所有依赖C模块的模块,这样是及不方便的,Maven为了更好的进行多模块开发,提供了模块聚合的功能。

作用:聚合用于快速构建Maven工程,一次性构建多个项目/模块

  • 使用步骤,我们用开源项目ruoyi的项目结构来看一下聚合在ruoyi中的使用

    1. Maven进阶概念入门详解_第9张图片

    2. RuoYi-Vue父模块的pom文件

      
      <modules>
              <module>ruoyi-adminmodule>
              <module>ruoyi-frameworkmodule>
              <module>ruoyi-systemmodule>
              <module>ruoyi-quartzmodule>
              <module>ruoyi-generatormodule>
              <module>ruoyi-commonmodule>
      modules>
      
      <packaging>pompackaging>
      
    3. 直接对打包类型为pom的模块进行生命周期的管理,Maven会自动帮我们管理聚合的所有模块的生命周期,操作顺序跟依赖顺序有关系。

模块继承

还是在多模块项目开发中,多个子模块可能会引入相同的依赖,但是他们有可能会各自使用不同的版本,版本问题,有可能会导致最后构建的项目出问题,所以我们需要一种机制,来约定子模块的相关配置,于是就有了模块继承

作用:通过继承可以实现在子工程中沿用父工程中的配置

实现步骤:还是以ruoyi为例

  1. 在子工程中声明其父工程坐标与对应的位置

     <parent>
            <artifactId>ruoyiartifactId>
            <groupId>com.ruoyigroupId>
            <version>3.8.1version>
     parent>
    
  2. 在父工程中定义依赖管理

    <dependencyManagement>
            <dependencies>
                
                <dependency>
                    <groupId>org.springframework.bootgroupId>
                    <artifactId>spring-boot-dependenciesartifactId>
                    <version>2.5.8version>
                    <type>pomtype>
                    <scope>importscope>
                dependency>
                
                <dependency>
                    <groupId>com.alibabagroupId>
                    <artifactId>druid-spring-boot-starterartifactId>
                    <version>${druid.version}version>
                dependency>
                
                <dependency>
                    <groupId>org.mybatis.spring.bootgroupId>
                    <artifactId>mybatis-spring-boot-starterartifactId>
                    <version>${mybatis-spring-boot.version}version>
                dependency>
                
                <dependency>
                    <groupId>com.github.pagehelpergroupId>
                    <artifactId>pagehelper-spring-boot-starterartifactId>
                    <version>${pagehelper.boot.version}version>
                dependency>
        dependencies>
    dependencyManagement>
    
  3. 定义完成之后,子工程相关的依赖就无需定义版本号,会直接使用父工程的版本号

    <dependency>
                <groupId>com.github.pagehelpergroupId>
                <artifactId>pagehelper-spring-boot-starterartifactId>
    dependency>
    

继承除了依赖版本号之外,还会继承一些资源,如下图

Maven进阶概念入门详解_第10张图片

属性

在Maven中,对于有些依赖可能需要保证相同的版本,比如Spring相关依赖,那么我们就需要一个机制来保证这些依赖的版本都相同,我们可以使用Maven中的属性,类似编程语言的全局变量。

Maven中有很多属性:

  1. 自定义属性
  2. 内置属性
  3. Setting属性
  4. Java系统属性
  5. 环境变量属性

此处我们重点讲解一下

自定义属性

作用:将一些字符串定义为变量,方便统一维护

使用步骤:还是以ruoyi为例

  1. 定义自定义属性

    <properties>
            <ruoyi.version>3.8.1ruoyi.version>
    properties>
    
  2. 调用:${xxx.yyy}

    <groupId>com.ruoyigroupId>
    <artifactId>ruoyiartifactId>
    <version>${ruoyi.version}version>
    

内置属性

作用:使用Maven内置属性,快速配置一些文件

${basedir}
${version}

Setting属性

作用:使用Maven配置文件setting.xml中的标签属性,用于动态配置

${settings.localRepository}

Java系统属性

作用:读取Java系统属性

调用格式

${user.home}

系统属性查询方式

mvn help:system

环境变量属性

作用:使用Maven环境变量

${env.JAVA_HOME}

版本管理

对于我们的项目来说,如果我们将其放到一些Maven仓库中,那么就需要对其进行版本控制,我们可以看一下一些开源项目的Maven官网上的版本。

Maven进阶概念入门详解_第11张图片

pom文件配置

<version>1.0.0.RELEASEversion>

工程版本号约定

Maven进阶概念入门详解_第12张图片

工程版本

Maven进阶概念入门详解_第13张图片

环境配置

一个项目,开发环境、测试环境、生产环境的配置文件必然不同,那么Maven就需要进行多环境配置管理

Maven多环境对应Idea中Maven工具的Profiles

Maven进阶概念入门详解_第14张图片

配置文件:通过配置文件配置,一个profile代表一个可选项

<profiles>
        <profile>
            <id>localid>
            <properties>
                
                <profiles.active>localprofiles.active>
                <logging.level>debuglogging.level>
            properties>
        profile>
        <profile>
            <id>devid>
            <properties>
                
                <profiles.active>devprofiles.active>
                <logging.level>debuglogging.level>
            properties>
            <activation>
                
                <activeByDefault>trueactiveByDefault>
            activation>
        profile>
        <profile>
            <id>testid>
            <properties>
                <profiles.active>testprofiles.active>
                <logging.level>debuglogging.level>
            properties>
        profile>
        <profile>
            <id>prodid>
            <properties>
                <profiles.active>prodprofiles.active>
                <logging.level>warnlogging.level>
            properties>
        profile>
profiles>

然后我们在application.yml配置文件中设置即可,之后通过设置maven的profiles,就可以动态调整环境了。

Maven进阶概念入门详解_第15张图片

私服

Maven私服指的是企业自己搭建的Maven仓库,通过Maven私服,第三方组织可以把自己组织内部的Maven依赖安装到私服上,提供给组织内部使用,搭建完私服之后,通过配置Maven,我们不止可以从中央仓库中获取Maven依赖,还可以从私服中获取Maven依赖。

下图是获取资源的过程,中央仓库的资源会从中央仓库获取,其他资源会从私服仓库获取

Maven进阶概念入门详解_第16张图片

私服搭建

通过Nexus搭建私服

Nexus是Sonatype公司的一款Maven私服产品

下载地址:Download (sonatype.com)

Maven进阶概念入门详解_第17张图片

私服仓库介绍

安装好之后我们来看一下私服默认的仓库列表

Maven进阶概念入门详解_第18张图片

可以将这些仓库分为三大类

  • 宿主仓库hosted:保存无法从中央仓库获取的资源
    • 自主研发
    • 第三方非开源项目
  • 代理仓库proxy
    • 代理远程仓库,通过nexus访问其他公共仓库
  • 仓库组:将若干个仓库组成一个群组,简化配置,它仅仅是一种配置,不是真实的仓库
    • 比如我们可以将二课项目相关的依赖放到一个仓库组中,将抽奖项目的依赖放到一个仓库组中

创建私服仓库

点击create repository

Maven进阶概念入门详解_第19张图片

选择maven2(hosted)

image-20220512124926302

填入仓库名称

Maven进阶概念入门详解_第20张图片

创建完之后在仓库列表可见,将新建的仓库加入maven-public仓库组,之后通过该仓库组的url访问

Maven进阶概念入门详解_第21张图片

点击maven-public仓库组

Maven进阶概念入门详解_第22张图片

本地仓库访问私服配置

配置本地仓库访问私服的权限(setting.xml文件),如果你想从这个仓库中获取或者部署资源,那么就需要server配置来验证权限,此处可以是不同的账号密码,不同的用户对于仓库的权限也不同。

配置Servers

<servers>
	<server>
		<id>ticknet-releaseid>
		<username>adminusername>
		<password>adminpassword>
	server>
	<server>
		<id>ticknet-snapshotsid>
		<username>adminusername>
		<password>adminpassword>
	server>
servers>

配置setting.xml的Profiles

    <profiles>
        <profile>
            <id>artifactoryid>
            <repositories>
                <repository>
                    <snapshots>
                        <enabled>falseenabled>
                    snapshots>
                    <id>repoid>
                    <name>reponame>
                    <url>xxxxurl>
                repository>
                <repository>
                    <snapshots/>
                    <id>snapshotsid>
                    <name>snapshots-onlyname>
                    <url>xxxxurl>
                repository>
            repositories>
        profile>
    profiles>

此处的URL通过

image-20220512151244007

这个copy按钮获取。

配置激活profiles

 <activeProfiles>
        <activeProfile>artifactoryactiveProfile>
 activeProfiles>

之后就可以从私服获取资源了

上传资源到私服

配置项目pom文件

<distributionManagement>
	<repository>
		<id>ticknet-releaseid>
		<url>http://localhost:8081/repository/ticknet-release/url>
	repository>
	<snapshotRepository>
		<id>ticknet-snapshotsid>
		<url>http://localhost:8081/repository/ticknet-release/url>
		snapshotRepository>
distributionManagement>

配置完执行生命周期的deploy即可

OK,大功告成。

你可能感兴趣的:(项目实战,maven,java,spring,boot)