Maven学习——maven高级

maven高级

  • 前言
  • 一、分模块开发与设计
  • 二、聚合
  • 三、继承
  • 四、属性
    • 自定义属性
    • 内置属性
    • Setting属性
    • java系统属性
  • 五、版本管理
    • 工程版本
    • 工程版本号约定
  • 六、资源配置
  • 七、多环境开发配置
  • 八、跳过测试(了解)
  • 九、私服
    • nexus服务器安装与使用
    • 仓库分类与手动上传组件
      • 概念
      • 操作
    • 本地仓库访问私服和IDEA上传资源
  • end...

前言

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

一、分模块开发与设计

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

二、聚合

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

		
    <packaging>pompackaging>
    <modules>
    		 
        <module>srb-commonmodule>
        <module>service-basemodule>
        <module>service-coremodule>
        <module>service-smsmodule>
        <module>service-ossmodule>
        <module>service-gatewaymodule>
    modules>

三、继承

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

Maven学习——maven高级_第3张图片
spring-boot-dependencies中配置了大量提前定义好的坐标信息(涵盖java开发所用的绝大部分jar),当我们以它为父工程时(继承),我们的项目就引用了它配置好的坐标,这里注意两个标签

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

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

  <groupId>org.springframework.bootgroupId>
  <artifactId>spring-boot-dependenciesartifactId>
  <version>2.3.4.RELEASEversion>
  <packaging>pompackaging>
  <name>spring-boot-dependenciesname>
  
  <properties>
    
    <activemq.version>5.15.13activemq.version>
    <antlr2.version>2.7.7antlr2.version>
    <appengine-sdk.version>1.9.82appengine-sdk.version>
  properties>
  
  <dependencyManagement>
    <dependencies>
      
      <dependency>
        <groupId>org.apache.activemqgroupId>
        <artifactId>activemq-amqpartifactId>
        
        <version>${activemq.version}version>
      dependency>
      <dependency>
        <groupId>org.apache.activemqgroupId>
        <artifactId>activemq-blueprintartifactId>
        <version>${activemq.version}version>
      dependency>
    dependencies>
  dependencyManagement>
  <build>
    
    <pluginManagement>
      <plugins>
      	 
        <plugin>
          <groupId>org.codehaus.mojogroupId>
          <artifactId>build-helper-maven-pluginartifactId>
          <version>${build-helper-maven-plugin.version}version>
        plugin>
        <plugin>
          <groupId>org.codehaus.mojogroupId>
          <artifactId>exec-maven-pluginartifactId>
          <version>${exec-maven-plugin.version}version>
        plugin>
    pluginManagement>
  build>

继承的不仅仅只有jar和插件,如图,都可以进行继承
Maven学习——maven高级_第4张图片
前面讲了聚合和继承,我们来整理下他们的区别
Maven学习——maven高级_第5张图片

四、属性

自定义属性

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

  <properties>
    
    <activemq.version>5.15.13activemq.version>
    <antlr2.version>2.7.7antlr2.version>
    <appengine-sdk.version>1.9.82appengine-sdk.version>
  properties>
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.apache.activemqgroupId>
        <artifactId>activemq-amqpartifactId>
        
        <version>${activemq.version}version>
      dependency>
      <dependency>
        <groupId>org.apache.activemqgroupId>
        <artifactId>activemq-blueprintartifactId>
        <version>${activemq.version}version>
      dependency>
    dependencies>
  dependencyManagement>

这样做的好处:

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

内置属性

作用:使用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/srbjdbc.url>
    <jdbc.username>rootjdbc.username>
  properties>
  <build>
   
    <resources>
      <resource>
        
        <directory>${project.basedir}/src/main/resourcesdirectory>
        
        <filtering>truefiltering>
      resource>
    resources>
    
    <testResources>
      <testResource>
        <directory>${project.basedir}/src/main/resourcesdirectory>
        <filtering>truefiltering>
      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_devid>
      
      <properties>
        <jdbc.url>jdbc:mysql://127.0.0.1:3306/srbjdbc.url>
      properties>
      
      <activation>
        <activeByDefault>trueactiveByDefault>
      activation>
    profile>

    
    <profile>
      <id>pro_testid>
      <properties>
        <jdbc.url>jdbc:mysql://180.6.6.6:3306/srbjdbc.url>
      properties>
    profile>
  profiles>

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

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

Maven学习——maven高级_第7张图片
如果都不配置,就不起效,可以通过install来到本地仓库看看

八、跳过测试(了解)

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

九、私服

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

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很相似了

仓库分类与手动上传组件

概念

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

  1. 宿主仓库hosted

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

  1. 代理仓库proxy

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

  1. 仓库组group

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

操作

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

创建一个宿主仓库
先进入到这个设置页面,点击创建仓库,如图
Maven学习——maven高级_第12张图片
进来后,我们发现有各式各类的仓库,我们选择hosted,如图
Maven学习——maven高级_第13张图片
然后取个名test-release,点击完成就创建好了,这时,我们退出来就发现多了这个仓库

加入到组
首先进入到组页面,如图,点击maven-public
Maven学习——maven高级_第14张图片
进入后,按如下操作,将其添加到右边,再点击保存,这样就能起到帮我们找资源的目的了
Maven学习——maven高级_第15张图片
手工加入一个资源
如图,进入到该界面,进入到我们新建的仓库
Maven学习——maven高级_第16张图片
进入后,选择添加,如图

Maven学习——maven高级_第17张图片
然后在里面添加相应的资源和坐标信息即可,添加完就能看到相应的资源了

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

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


<servers>
	<server>
		<id>test-releaseid>
		<username>adminusername>
		<password>adminpassword>
	server>
servers>


<mirror>
	<id>nexus-testid>
	
	<mirrorOf>*mirrorOf>
	
	<url>http://localhost:8081/repository/maven-public/url>
mirror>

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

<distributionManagement>
    
    <repository>
      <id>test-releaseid>
      <url>http://localhost:8081/repository/maven-public/url>
    repository>
    
    <snapshotRepository>
      <id>***id>
      <url>***url>
    snapshotRepository>
  distributionManagement>

注意,这个id要与上面maven配置文件的server中id一致,因为它需要根据这个id去找账户名密码
配置好后,我们点击这个按钮,就可以完成配置了,如图
Maven学习——maven高级_第19张图片

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

end…

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

你可能感兴趣的:(中间件/工具,maven,intellij-idea,java)