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

一文带你搞定Maven全功能

突然发现自己关于Maven只是是处于最根底的运用阶段,不只不知道背面的一些原理,甚至连一些常见的概念都不是很清晰,只是会运用Maven构建项目,引进依靠,打包等最根底的操作,所以连忙补补课,成功完结了需求,而且在此处总结一下Maven中略微进阶一点的知识。

依靠

依靠是咱们在运用Maven构建项目时最常运用的功用,经过依靠标签,咱们能够直接从Maven库房中引进对应的Jar包,无需手动再将Jar添加到目录下了,可谓是十分方便,不过咱们除了运用,还需求考虑多模块下依靠之间的联系。

依靠装备

这个咱们应该都很了解了,经过<dependency>标签引进Maven依靠

<dependencies>
	<!-- servlet包 -->
     <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
     </dependency>
</dependencies>

引进依靠之后,改写一下Maven依靠就能够引进相关的Jar包了。

依靠传递

依靠具有传递性,当咱们引进了一个依靠的时分,就会主动引进该依靠引进的一切依靠,依次往下引进一切依靠。

比方咱们引进了Druid数据库连接池的SpringBoot-Starter,那么就会主动引进一些依靠

一文带你搞定Maven全功能

如图,咱们只是引进了druid-spring-boot-starter依靠,就主动引进了该依靠依靠的依靠。总而言之便是套娃就完事了。

咱们将这三个依靠称为直接引进的依靠,而咱们在<dependency>标签中引进的依靠称为直接依靠,那么假如这两个重复了而且版别不一样的话会怎么办呢,最终引进的到底是哪个版别呢,仍是说都会引进呢?

假如重复了,遵从以下规矩

一文带你搞定Maven全功能

简略来说,便是越在外层的优先级越高,假如同级的就依照装备次序,装备次序靠前的覆盖装备次序靠后的。

可选依靠

可选依靠指对外隐藏当时所依靠的资源

<dependency>
	<groupId>junit</groupId>
	<artifactId>junit</artifactId>
	<version>4.12</version>
	<optional>true</optional>
</dependency>

装备了该选项之后,直接依靠就失效了。

扫除依靠

扫除依靠指主动断开直接依靠的资源

<dependency>
	<groupId>junit</groupId>
	<artifactId>junit</artifactId>
	<version>4.12</version>
	<exclusions>
		<exclusion>
			<groupId>org.hamcrest</groupId>
			<artifactId>hamcrest-core</artifactId>
		</exclusion>
	</exclusions>
</dependency>

装备了该选项之后,直接依靠也会失效。

扫除依靠和可选依靠的差异:

可选依靠是依靠供给者设置的,比方咱们引进了Durid,那么该选项由Durid开发者设置

扫除依靠由依靠引进者设置,比方咱们引进了Durid,那么咱们能够设置该选项

依靠规模

依靠的jar默许情况能够在任何地方运用,能够经过scope标签来改动依靠的效果规模。

一文带你搞定Maven全功能

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

其实假如咱们偷懒的话,全部都默许也不是不或许,不过为了咱们程序代码的可读性与简洁性,仍是依照规范来比较好。

生命周期与插件

项目构建生命周期

Maven项目构建生命周期描绘的是一次构建进程阅历了多少个事件,咱们能够把生命周期当成一个人的年纪。

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

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

第一个和第三个周期比较简略,咱们要点介绍一下default阶段

先上一张劝退图

一文带你搞定Maven全功能

以上便是defalut阶段完好的生命周期,其中标红的地方,是几个比较重要的周期,在Idea的Maven东西中也能表现出来

一文带你搞定Maven全功能

当咱们在Idea中点击这几个生命周期时,Maven会主动将之前一切的生命周期都履行到,就相似于假如我18岁了,那么我肯定阅历过8岁。

插件

插件便是Idea中Maven东西的Plugins部分

一文带你搞定Maven全功能

经过pom文件中的<build></build>标签引进新的插件

<build>
        <plugins>
            <plugin>
                <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>
        </plugins>
</build>

那么什么是插件呢?

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

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

  • 经过插件能够自界说其他功用

    <build>
    	<plugins>
    		<plugin>
    			<groupId>org.apache.maven.plugins</groupId>
    			<artifactId>maven-source-plugin</artifactId>
    			<version>2.2.1</version>
    			<executions>
    				<execution>
    					<goals>
    						<goal>jar</goal>
    					</goals>
    					<phase>generate-test-resources</phase>
    				</execution>
    			</executions>
    		</plugin>
    	</plugins>
    </build>
    

    上述自界说插件的效果指的是在generate-test-resources生命周期履行打jar包的操作。

其实简略的说,生命周期便是一个人的年纪阶段,而插件便是每个人在每个年纪需求做的事情

总结:

一文带你搞定Maven全功能

Maven将一个项目构建的进程分为一长串连续的生命周期,在对应的生命周期会经过插件完结对应的事件,经过运用Maven的生命周期,咱们能够获得咱们需求的功用,或许是打jar包,或许是安装到本地库房,或许是部署到私服。

模块聚合

当运用Maven进行多模块开发的时分,有或许呈现A模块依靠B模块,B模块依靠C模块,那么咱们假如想对A模块打包,那么就要先打包C模块,再打包B模块,最终打包A模块才干成功,不然会报错,而且,假如C模块更新了,咱们也要手动更新一切依靠C模块的模块,这样是及不方便的,Maven为了更好的进行多模块开发,供给了模块聚合的功用。

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

  • 运用过程,咱们用开源项目ruoyi的项目结构来看一下聚合在ruoyi中的运用

    1. 一文带你搞定Maven全功能

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

      <!--聚合的一切模块-->
      <modules>
              <module>ruoyi-admin</module>
              <module>ruoyi-framework</module>
              <module>ruoyi-system</module>
              <module>ruoyi-quartz</module>
              <module>ruoyi-generator</module>
              <module>ruoyi-common</module>
      </modules>
      <!--打包类型界说为pom-->
      <packaging>pom</packaging>
      
    3. 直接对打包类型为pom的模块进行生命周期的办理,Maven会主动帮咱们办理聚合的一切模块的生命周期,操作次序跟依靠次序有联系。

模块承继

仍是在多模块项目开发中,多个子模块或许会引进相同的依靠,可是他们有或许会各自运用不同的版别,版别问题,有或许会导致最终构建的项目出问题,所以咱们需求一种机制,来约好子模块的相关装备,于是就有了模块承继

效果:经过承继能够实现在子工程中沿用父工程中的装备

实现过程:仍是以ruoyi为例

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

     <parent>
            <artifactId>ruoyi</artifactId>
            <groupId>com.ruoyi</groupId>
            <version>3.8.1</version>
     </parent>
    
  2. 在父工程中界说依靠办理

    <dependencyManagement>
            <dependencies>
                <!-- SpringBoot的依靠装备-->
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-dependencies</artifactId>
                    <version>2.5.8</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
                <!-- 阿里数据库连接池 -->
                <dependency>
                    <groupId>com.alibaba</groupId>
                    <artifactId>druid-spring-boot-starter</artifactId>
                    <version>${druid.version}</version>
                </dependency>
                <!-- SpringBoot集成mybatis框架 -->
                <dependency>
                    <groupId>org.mybatis.spring.boot</groupId>
                    <artifactId>mybatis-spring-boot-starter</artifactId>
                    <version>${mybatis-spring-boot.version}</version>
                </dependency>
                <!-- pagehelper 分页插件 -->
                <dependency>
                    <groupId>com.github.pagehelper</groupId>
                    <artifactId>pagehelper-spring-boot-starter</artifactId>
                    <version>${pagehelper.boot.version}</version>
                </dependency>
        </dependencies>
    </dependencyManagement>
    
  3. 界说完结之后,子工程相关的依靠就无需界说版别号,会直接运用父工程的版别号

    <dependency>
                <groupId>com.github.pagehelper</groupId>
                <artifactId>pagehelper-spring-boot-starter</artifactId>
    </dependency>
    

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

一文带你搞定Maven全功能

特点

在Maven中,关于有些依靠或许需求确保相同的版别,比方Spring相关依靠,那么咱们就需求一个机制来确保这些依靠的版别都相同,咱们能够运用Maven中的特点,相似编程语言的全局变量

Maven中有很多特点:

  1. 自界说特点
  2. 内置特点
  3. Setting特点
  4. Java系统特点
  5. 环境变量特点

此处咱们要点讲解一下

自界说特点

效果:将一些字符串界说为变量,方便一致维护

运用过程:仍是以ruoyi为例

  1. 界说自界说特点

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

    <groupId>com.ruoyi</groupId>
    <artifactId>ruoyi</artifactId>
    <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全功能

pom文件装备

<version>1.0.0.RELEASE</version>

工程版别号约好

一文带你搞定Maven全功能

工程版别

一文带你搞定Maven全功能

环境装备

一个项目,开发环境、测验环境、出产环境的装备文件必然不同,那么Maven就需求进行多环境装备办理

Maven多环境对应Idea中Maven东西的Profiles

一文带你搞定Maven全功能

装备文件:经过<profiles>装备文件装备,一个profile代表一个可选项

<profiles>
        <profile>
            <id>local</id>
            <properties>
                <!-- 环境标识,需求与装备文件的称号相对应 -->
                <profiles.active>local</profiles.active>
                <logging.level>debug</logging.level>
            </properties>
        </profile>
        <profile>
            <id>dev</id>
            <properties>
                <!-- 环境标识,需求与装备文件的称号相对应 -->
                <profiles.active>dev</profiles.active>
                <logging.level>debug</logging.level>
            </properties>
            <activation>
                <!-- 默许环境 -->
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <profile>
            <id>test</id>
            <properties>
                <profiles.active>test</profiles.active>
                <logging.level>debug</logging.level>
            </properties>
        </profile>
        <profile>
            <id>prod</id>
            <properties>
                <profiles.active>prod</profiles.active>
                <logging.level>warn</logging.level>
            </properties>
        </profile>
</profiles>

然后咱们在application.yml装备文件中设置即可,之后经过设置maven的profiles,就能够动态调整环境了。

一文带你搞定Maven全功能

私服

Maven私服指的是企业自己建立的Maven库房,经过Maven私服,第三方安排能够把自己安排内部的Maven依靠安装到私服上,供给给安排内部运用,建立完私服之后,经过装备Maven,咱们不止能够从中心库房中获取Maven依靠,还能够从私服中获取Maven依靠。

下图是获取资源的进程,中心库房的资源会从中心库房获取,其他资源会从私服库房获取

一文带你搞定Maven全功能

私服建立

经过Nexus建立私服

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

下载地址:Download (sonatype.com)

一文带你搞定Maven全功能

私服库房介绍

安装好之后咱们来看一下私服默许的库房列表

一文带你搞定Maven全功能

能够将这些库房分为三大类

  • 宿主库房hosted:保存无法从中心库房获取的资源
    • 自主研发
    • 第三方非开源项目
  • 署理库房proxy
    • 署理长途库房,经过nexus拜访其他公共库房
  • 库房组:将若干个库房组成一个群组,简化装备,它只是是一种装备,不是实在的库房
    • 比方咱们能够将二课项目相关的依靠放到一个库房组中,将抽奖项目的依靠放到一个库房组中

创立私服库房

点击create repository

一文带你搞定Maven全功能

挑选maven2(hosted)

一文带你搞定Maven全功能

填入库房称号

一文带你搞定Maven全功能

创立完之后在库房列表可见,将新建的库房加入maven-public库房组,之后经过该库房组的url拜访

一文带你搞定Maven全功能

点击maven-public库房组

一文带你搞定Maven全功能

本地库房拜访私服装备

装备本地库房拜访私服的权限(setting.xml文件),假如你想从这个库房中获取或者部署资源,那么就需求server装备来验证权限,此处能够是不同的账号密码,不同的用户关于库房的权限也不同。

装备Servers

<servers>
	<server>
		<id>ticknet-release</id>
		<username>admin</username>
		<password>admin</password>
	</server>
	<server>
		<id>ticknet-snapshots</id>
		<username>admin</username>
		<password>admin</password>
	</server>
</servers>

装备setting.xml的Profiles

    <profiles>
        <profile>
            <id>artifactory</id>
            <repositories>
                <repository>
                    <snapshots>
                        <enabled>false</enabled>
                    </snapshots>
                    <id>repo</id>
                    <name>repo</name>
                    <url>xxxx</url>
                </repository>
                <repository>
                    <snapshots/>
                    <id>snapshots</id>
                    <name>snapshots-only</name>
                    <url>xxxx</url>
                </repository>
            </repositories>
        </profile>
    </profiles>

此处的URL经过

这个copy按钮获取。

装备激活profiles

 <activeProfiles>
        <activeProfile>artifactory</activeProfile>
 </activeProfiles>

之后就能够从私服获取资源了

上传资源到私服

装备项目pom文件

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

装备完履行生命周期的deploy即可

OK,功德圆满。