Maven学习——maven高级

前言

前面,我们学习了maven基础,这对于普通的开发人员而言,已经足够了,但渴望升职加薪的我们怎么可能仅仅停留在初级呐,那我们就继续深入,学习下maven的分模块开发与设计(微服务开发会这样做)、聚合、继承、属性等内容。文章课程链接:黑马程序员Maven全套教程

一、分模块开发与设计

分模块开发就是将我们的项目拆分成一个个小的模块(便于开发和复用代码),一般有一个基础模块base,里面是我们常用的工具类、基础类等,其他模块依赖它,就可以对其进行使用了,当然,其他模块也可能存在被另一模块使用的情况
注意: 当我们在项目中使用同事开发的模块时,编译项目可能会出现错误,如果报错误could not find artifact ***,则是该模块还没有打包放到我们的本地仓库中,这时,我们可以在同事的模块里点开maven工具(IDEA中),双击执行生命周期中的install,该模块就会自动到本地仓库了

二、聚合

分模块开发会使我们的模块间层层依赖,假如某个模块更新了(其中的某个功能改变了),而其他模块是不知道的,这样就可能存在一些问题,因此,我们需要一个专门的模块来对他们进行管理,这种机制就叫聚合,如图
在这里插入图片描述
如何做到聚合,首先,我们创建一个模块,这个模块不做任何事情,只留下pom.xml文件即可,然后在文件中加入配置,此配置为尚硅谷尚融宝项目配置,配置后可以在IDEA工具中打开maven工具面板,进行编译、打包等操作,这时,就会按照依赖关系,一层层进行编译、打包的操作,直至最上层的module完成

		<!--定义该工程用于进行构建管理-->
    <packaging>pom</packaging>
    <modules>
    		 <!--具体的工程名称-->
        <module>srb-common</module>
        <module>service-base</module>
        <module>service-core</module>
        <module>service-sms</module>
        <module>service-oss</module>
        <module>service-gateway</module>
    </modules>

三、继承

首先,我们看看这张图,当我们的service模块使用的是5.1.9版本,dao模块使用的是5.2.0版本,如果两个版本的spring-context不兼容,那就可能会出现一些问题。
在这里插入图片描述
那么我们能不能对这种多个模块都需要用到的jar来做统一管理呐,答案肯定是能,如果你熟悉springboot,你就知道,springboot其中有一点就是帮我们解决jar包的冲突,我们在pom.xml文件中指定父工程spring-boot-starter-parent,即可帮我们解决依赖冲突(引入后依赖就不写版本号了)。下面,我们就来看看spring-boot-starter-parent是如何做到版本管理的,先看看源码,如图,我们发现它并没有相关的依赖,并且它还有父工程,我们跟进看看

在这里插入图片描述
spring-boot-dependencies中配置了大量提前定义好的坐标信息(涵盖java开发所用的绝大部分jar),当我们以它为父工程时(继承),我们的项目就引用了它配置好的坐标,这里注意两个标签

dependencyManagement:声明进行依赖管理,标签里写管理的jar的坐标、版本等信息
pluginManagement:声明进行插件管理,标签里写管理的插件的坐标、版本等信息

这样,就能起到管理的作用了
这里贴上spring-boot-dependencies的部分源码,并加以解释

  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-dependencies</artifactId>
  <version>2.3.4.RELEASE</version>
  <packaging>pom</packaging>
  <name>spring-boot-dependencies</name>
  <!--...-->
  <properties>
    <!--统一定义版本号,好维护,防止版本冲突,这里只列举了三个-->
    <activemq.version>5.15.13</activemq.version>
    <antlr2.version>2.7.7</antlr2.version>
    <appengine-sdk.version>1.9.82</appengine-sdk.version>
  </properties>
  <!--声明进行依赖管理-->
  <dependencyManagement>
    <dependencies>
      <!--具体的jar,原本非常多,基本涵盖java开发中的所有jar,这里只随便列举两个-->
      <dependency>
        <groupId>org.apache.activemq</groupId>
        <artifactId>activemq-amqp</artifactId>
        <!--对应前面配置的版本号名称-->
        <version>${activemq.version}</version>
      </dependency>
      <dependency>
        <groupId>org.apache.activemq</groupId>
        <artifactId>activemq-blueprint</artifactId>
        <version>${activemq.version}</version>
      </dependency>
    </dependencies>
  </dependencyManagement>
  <build>
    <!--当然,插件也可以实现继承,格式是一样的,声明进行插件管理-->
    <pluginManagement>
      <plugins>
      	 <!--具体的插件-->
        <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>build-helper-maven-plugin</artifactId>
          <version>${build-helper-maven-plugin.version}</version>
        </plugin>
        <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>exec-maven-plugin</artifactId>
          <version>${exec-maven-plugin.version}</version>
        </plugin>
    </pluginManagement>
  </build>

继承的不仅仅只有jar和插件,如图,都可以进行继承
在这里插入图片描述
前面讲了聚合和继承,我们来整理下他们的区别
在这里插入图片描述

四、属性

自定义属性

自定义属性我们在继承部分有使用,使用properties标签标识,内容写我们自定义的属性,如版本号,可以自定义版本号,后面的依赖直接引用,建议格式为:***.version,示例代码如下

  <properties>
    <!--统一定义版本号,好维护,防止版本冲突,这里只列举了三个-->
    <activemq.version>5.15.13</activemq.version>
    <antlr2.version>2.7.7</antlr2.version>
    <appengine-sdk.version>1.9.82</appengine-sdk.version>
  </properties>
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.apache.activemq</groupId>
        <artifactId>activemq-amqp</artifactId>
        <!--对应前面配置的版本号名称-->
        <version>${activemq.version}</version>
      </dependency>
      <dependency>
        <groupId>org.apache.activemq</groupId>
        <artifactId>activemq-blueprint</artifactId>
        <version>${activemq.version}</version>
      </dependency>
    </dependencies>
  </dependencyManagement>

这样做的好处:

  1. 方便维护,如果坐标很多,改个版本号你还得去慢慢找,当然你可以用搜索快速定位,但是配置属性更快更好看吧
  2. 防止版本冲突,当我们需要使用到spring,需要引入其相关jar(如图),而且引入的jar版本应一致,不然可能出现问题,这时,我们可以定义一个 spring.version的属性,统一对相关jar的版本进行管理,当然你也可以一个一个改,但你能保证你永远不会出错吗
    在这里插入图片描述

内置属性

作用:使用maven内置属性,快速配置
调用格式

${basedir} ${version}

Setting属性

作用:使用maven配置文件settingxml中的属性标签,用于动态配置
调用格式:

${settings.localRepository}

java系统属性

作用:读取java属性配置
调用格式:

${user.home}

系统属性查询方式,cmd执行

mvn help:system

五、版本管理

工程版本

工程版本分为两个版本(每个公司定义的版本号都有区别,实际按照规则要求命名即可)
SNAPSHOT(快照版本:maven工程版本默认就是这个)

项目开发过程中,为方便团队成员合作,解决模块间相互依赖和时间更新的问题,开发者对每个模块进行构建的时候,输出的临时版本
快照版本UI随着开发的进展不断更新

RELEASE(发布版本)

项目开发到进入阶段里程碑后,向团队外部发布较为稳定的版本,这种版本对应的构建文件是稳定的,即便进行功能的后续开发,也不会改变当前发布版本的内容

工程版本号约定

约定规范
<主版本>.<次版本>.<增量版本>.<里程碑版本>,例如5.1.9.RELEASE

主版本:表示项目重大架构的变更,如:spring5和springboot2相较于spring4和springboot1的迭代
次版本:表示有较大的功能增加和变化,或者全面系统地修复漏洞
增量版本:表示有重大漏洞的修复
里程碑版本:表明一个版本的里程碑(版本内部),这样的版本同下一个正式版本相比,相对来说不是很稳定,需要更多的测试

六、资源配置

通过前面的学习,我们知道maven已经能帮我们做许多事情了,但maven觉得还不够,它还要帮我们做点其他事,比如资源配置,常见的就是数据源的配置,我们在properties文件中编写jdbc.driver、jdbc.url等(现在都是yaml文件了),maven表示直接配到pom.xml,我一起就管了,那就满足maven?
我们先在属性处配置属性,并在build处加上配置,配置开发资源和测试资源

  <properties>
    <jdbc.url>jdbc:mysql://127.0.0.1:3306/srb</jdbc.url>
    <jdbc.username>root</jdbc.username>
  </properties>
  <build>
   <!--配置资源文件对应的信息-->
    <resources>
      <resource>
        <!--路径,一定要对,${project.basedir}项目路径为maven自带属性,方便配置所有的模块-->
        <directory>${project.basedir}/src/main/resources</directory>
        <!--参与过滤,false不解析,打包的时候就是配的值(${jdbc.url})-->
        <filtering>true</filtering>
      </resource>
    </resources>
    <!--测试资源,路径不是main,是test-->
    <testResources>
      <testResource>
        <directory>${project.basedir}/src/main/resources</directory>
        <filtering>true</filtering>
      </testResource>
    </testResources>
  </build>

然后在我们原始的配置文件(properties)中这样写

jdbc.url=${jdbc.url}
jdbc.username=${jdbc.username}

七、多环境开发配置

相信有开发经验的小伙伴对其一点不陌生,我们编写配置文件时,一般有四个,一个基础的配置application.yml,一个开发:application-local.yml,一个测试:application-test.yml,一个生产:application-pro.yml,maven的多环境配置也是一样的道理,直接上代码
分为两部分,创建多环境和配置多环境

	<!--创建多环境-->
  <profiles>
    <!--定义具体环境:开发-->
    <profile>
      <!--定义环境对应的唯一名称-->
      <id>pro_dev</id>
      <!--定义环境中换用的属性值-->
      <properties>
        <jdbc.url>jdbc:mysql://127.0.0.1:3306/srb</jdbc.url>
      </properties>
      <!--设置默认启动,这里配了就不用配置运行参数了-->
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
    </profile>

    <!--定义具体环境:测试-->
    <profile>
      <id>pro_test</id>
      <properties>
        <jdbc.url>jdbc:mysql://180.6.6.6:3306/srb</jdbc.url>
      </properties>
    </profile>
  </profiles>

配置如图,在maven启动项中添加

mvn 指令 -p 环境定义id
mvn install -p pro_dev

在这里插入图片描述
如果都不配置,就不起效,可以通过install来到本地仓库看看

八、跳过测试(了解)

注意:要在合理的时候使用,不能滥用
在这里插入图片描述
如何跳过,可以在maven工具栏点击红框按钮,然后test被划掉代表已跳过,也可以使用命令行和在pom.xml中进行配置,这里只做了解,不在讲解具体操作
在这里插入图片描述

九、私服

私服的作用就不多谈了,直接进入正题,开始搭建私服

nexus服务器安装与使用

下载地址:https://www.sonatype.com/products/repository-oss
下载好相应的系统版本,解压开,其中包含两个目录,一个为服务器,一个为工作空间(运行的所有数据)
启动:
进入bin目录,双击nexus.exe,输入命令启动

nexus /run nexus

启动时间较长,请耐心等待,如果出现Started Sonatype ***则为启动成功
访问:
默认地址为 http://loclhost:8081,浏览器回车后进入到页面
当然,端口可以更改,配置文件地址为 /etc/nexus-default.properties,可以对其更改,具体就不展示了,跟我们常用的配置文件几乎一样
其次,服务器的相关配置也可以更改,路径为 /bin/nexus.vmoptions,配置项和JVM很相似了

仓库分类与手动上传组件

概念

这里先引入一个图
在这里插入图片描述
首先,我们的资源分为两种,一种是自己公司的资源,一种是中央库下载的。开发过程中,我们既需要从私服拿,又要从中央服务器拿,是不是很麻烦,因此,我们在私服上搞一个专门对接中央服务器的仓库,拿的时候就只需要从私服拿了。其次,我们会不定期的发布一些新的版本,有些是快照版本,有些是发布版本,我们肯定是需要把他们分开的,因此会建立多个仓库。多个仓库后,大家都往里边放,久而久之,当我需要使用某个资源时,我还得问问在哪个仓库(可能放的同事也记不得在哪了),因此,引入仓库组,将仓库配到组下,我们引入组,组就能帮我们挨个仓库找资源了,不需要我们知道具体在哪
仓库分类

  1. 宿主仓库hosted

保存无法从中央仓库获取的资源,如自主研发和第三方非开源项目(oracle连接jar)

  1. 代理仓库proxy

代理远程仓库,通过nexus访问其他公共仓库,例如中央仓库、阿里仓库

  1. 仓库组group

将若干个仓库组成一个群组,简化配置,仓库组不能保存资源,属于设计型仓库

操作

进入到nexus的操作页面,我们首先需要登录,点击右上角登录,根据提示,输入账号密码,账号为admin,密码在提示的目录下,进入后,重设密码,在开启匿名访问选项时不勾选,然后就完成了
我们先来介绍下他的功能模块,如图
在这里插入图片描述
Search为查找资源的,Browse为浏览资源的,Upload为上传下载资源的
顶上两个按钮,第一个为当前的页面是浏览用的,第二个为设置用的

创建一个宿主仓库
先进入到这个设置页面,点击创建仓库,如图
在这里插入图片描述
进来后,我们发现有各式各类的仓库,我们选择hosted,如图
在这里插入图片描述
然后取个名test-release,点击完成就创建好了,这时,我们退出来就发现多了这个仓库

加入到组
首先进入到组页面,如图,点击maven-public
在这里插入图片描述
进入后,按如下操作,将其添加到右边,再点击保存,这样就能起到帮我们找资源的目的了
在这里插入图片描述
手工加入一个资源
如图,进入到该界面,进入到我们新建的仓库
在这里插入图片描述
进入后,选择添加,如图

在这里插入图片描述
然后在里面添加相应的资源和坐标信息即可,添加完就能看到相应的资源了

本地仓库访问私服和IDEA上传资源

上面,我们讲到了手动的资源上传,这适用于第三方的资源,我们经常还是在IDEA开发工具中进行操作,下面我们就进行相应的配置,如图,我们在上传和下载时需要配置这些内容
在这里插入图片描述
在maven的配置文件(setting.xml)中进行配置

<!--访问服务器的账号密码-->
<servers>
	<server>
		<id>test-release</id>
		<username>admin</username>
		<password>admin</password>
	</server>
</servers>

<!--下载的地址-->
<mirror>
	<id>nexus-test</id>
	<!--*代表全部(私服和中央),central代表中央-->
	<mirrorOf>*</mirrorOf>
	<!--去页面上url处粘贴-->
	<url>http://localhost:8081/repository/maven-public/</url>
</mirror>

我们要将资源在IDEA中上传到仓库中,需要在pom.xml中做如下配置

<distributionManagement>
    <!--发布版本的地址-->
    <repository>
      <id>test-release</id>
      <url>http://localhost:8081/repository/maven-public/</url>
    </repository>
    <!--快照版本的地址-->
    <snapshotRepository>
      <id>***</id>
      <url>***</url>
    </snapshotRepository>
  </distributionManagement>

注意,这个id要与上面maven配置文件的server中id一致,因为它需要根据这个id去找账户名密码
配置好后,我们点击这个按钮,就可以完成配置了,如图
在这里插入图片描述

在发布前,可以看到控制台打印一些信息,这是在下载一些组件,发布完成好后可以到nexus的页面上进行查看是否发布成功

end…

**如果总结的还行,就点个赞呗 @_@ 如有错误,欢迎指点!

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值