前面,我们学习了maven基础,这对于普通的开发人员而言,已经足够了,但渴望升职加薪的我们怎么可能仅仅停留在初级呐,那我们就继续深入,学习下maven的分模块开发与设计(微服务开发会这样做)、聚合、继承、属性等内容。文章课程链接:黑马程序员Maven全套教程
分模块开发就是将我们的项目拆分成一个个小的模块(便于开发和复用代码),一般有一个基础模块base,里面是我们常用的工具类、基础类等,其他模块依赖它,就可以对其进行使用了,当然,其他模块也可能存在被另一模块使用的情况
注意: 当我们在项目中使用同事开发的模块时,编译项目可能会出现错误,如果报错误could not find artifact ***,则是该模块还没有打包放到我们的本地仓库中,这时,我们可以在同事的模块里点开maven工具(IDEA中),双击执行生命周期中的install,该模块就会自动到本地仓库了
分模块开发会使我们的模块间层层依赖,假如某个模块更新了(其中的某个功能改变了),而其他模块是不知道的,这样就可能存在一些问题,因此,我们需要一个专门的模块来对他们进行管理,这种机制就叫聚合,如图
如何做到聚合,首先,我们创建一个模块,这个模块不做任何事情,只留下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不兼容,那就可能会出现一些问题。
那么我们能不能对这种多个模块都需要用到的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.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和插件,如图,都可以进行继承
前面讲了聚合和继承,我们来整理下他们的区别
自定义属性我们在继承部分有使用,使用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>
这样做的好处:
作用:使用maven内置属性,快速配置
调用格式
${basedir} ${version}
作用:使用maven配置文件settingxml中的属性标签,用于动态配置
调用格式:
${settings.localRepository}
作用:读取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
如果都不配置,就不起效,可以通过install来到本地仓库看看
注意:要在合理的时候使用,不能滥用
如何跳过,可以在maven工具栏点击红框按钮,然后test被划掉代表已跳过,也可以使用命令行和在pom.xml中进行配置,这里只做了解,不在讲解具体操作
私服的作用就不多谈了,直接进入正题,开始搭建私服
下载地址: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很相似了
这里先引入一个图
首先,我们的资源分为两种,一种是自己公司的资源,一种是中央库下载的。开发过程中,我们既需要从私服拿,又要从中央服务器拿,是不是很麻烦,因此,我们在私服上搞一个专门对接中央服务器的仓库,拿的时候就只需要从私服拿了。其次,我们会不定期的发布一些新的版本,有些是快照版本,有些是发布版本,我们肯定是需要把他们分开的,因此会建立多个仓库。多个仓库后,大家都往里边放,久而久之,当我需要使用某个资源时,我还得问问在哪个仓库(可能放的同事也记不得在哪了),因此,引入仓库组,将仓库配到组下,我们引入组,组就能帮我们挨个仓库找资源了,不需要我们知道具体在哪
仓库分类
保存无法从中央仓库获取的资源,如自主研发和第三方非开源项目(oracle连接jar)
代理远程仓库,通过nexus访问其他公共仓库,例如中央仓库、阿里仓库
将若干个仓库组成一个群组,简化配置,仓库组不能保存资源,属于设计型仓库
进入到nexus的操作页面,我们首先需要登录,点击右上角登录,根据提示,输入账号密码,账号为admin,密码在提示的目录下,进入后,重设密码,在开启匿名访问选项时不勾选,然后就完成了
我们先来介绍下他的功能模块,如图
Search为查找资源的,Browse为浏览资源的,Upload为上传下载资源的
顶上两个按钮,第一个为当前的页面是浏览用的,第二个为设置用的
创建一个宿主仓库
先进入到这个设置页面,点击创建仓库,如图
进来后,我们发现有各式各类的仓库,我们选择hosted,如图
然后取个名test-release,点击完成就创建好了,这时,我们退出来就发现多了这个仓库
加入到组
首先进入到组页面,如图,点击maven-public
进入后,按如下操作,将其添加到右边,再点击保存,这样就能起到帮我们找资源的目的了
手工加入一个资源
如图,进入到该界面,进入到我们新建的仓库
进入后,选择添加,如图
然后在里面添加相应的资源和坐标信息即可,添加完就能看到相应的资源了
上面,我们讲到了手动的资源上传,这适用于第三方的资源,我们经常还是在IDEA开发工具中进行操作,下面我们就进行相应的配置,如图,我们在上传和下载时需要配置这些内容
在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去找账户名密码
配置好后,我们点击这个按钮,就可以完成配置了,如图
在发布前,可以看到控制台打印一些信息,这是在下载一些组件,发布完成好后可以到nexus的页面上进行查看是否发布成功
**如果总结的还行,就点个赞呗 @_@ 如有错误,欢迎指点!