Maven高级

目录

一、分模块设计与开发

二、继承与聚合

继承

步骤

版本锁定

聚合

操作方法

三、bug汇总解决

1、未找到parent.relativePath

2、Unable to find main class

3、java: 模块循环不支持注解处理。请确保将循环 [common,pojo] 中的所有模块排除在注解处理之外


一、分模块设计与开发

为什么要分模块开发?

假设我们现在要开发一个大型的电商平台,其中会有很多个模块功能要实现

Maven高级_第1张图片

 假如我们现在把这些模块的代码全部放到一个java项目中,而且为了效率和速度需要有多个人同时开发,它们同时操作这一个项目,那么管理和维护都会变得相当困难,自己写的代码也会难以复用。

Maven高级_第2张图片

为此,我们将项目按照功能拆分成若干个模块,方便项目的维护、拓展,也方便模块间相互调用,资源共享

比如我们可以将一个项目分为三个模块 

Maven高级_第3张图片

那么此时management模块中就没有pojo与utils了。如果要使用到这连两个模块中的类,那么就可以通过导入依赖坐标的方式引入

注意:分模块开发需要先针对模块功能进行设计,再进行编码,不会先将工程开发完毕,然后再进行拆分的

接下来我们会来一步步创建一个多模块工程


二、继承与聚合

继承

概念:描述的是两个工程之间的关系,与Java中的继承相似,子工程可以继承父工程中的配置信息,常见于依赖关系的继承。

作用:简化依赖配置,统一依赖管理

实现:

Maven高级_第4张图片

步骤

1、创建一个父模块,设置打包方式为pom(默认是jar)

打包方式 说明
jar 普通模块打包,springboot项目基本都是jar包(内嵌tomcat运行)
war 普通web程序打包,需要部署在外部的tomcat服务器中运行
pom 父工程或聚合工程,该模块不写代码,仅进行依赖管理  

首先我们还是像之前单模块一样,使用Spring Initializr创建一个父模块

Maven高级_第5张图片

这个模块是为了统一管理依赖版本,聚合子模块的,因此在创建的时候不需要在这里添加任何依赖

Maven高级_第6张图片

同时它也不需要.mvn、src、Help.md、mvnw.cmd、mvnw文件,统统删掉即可Maven高级_第7张图片

配置父模块pom.xml文件,修改打包方式为pom。底下那个是父模块默认的自己的信息,可以对其进行更改,

    
    pom


    
    com.wal
    Sticker
    0.0.1-SNAPSHOT
    Sticker

2、在子工程的pom.xml文件中,配置继承关系

接着再来创建需要的子模块,在父模块上右键创建新的模块

Maven高级_第8张图片

同样使用Spring Initializr创建 server 模块

Maven高级_第9张图片

这个模块是用来启动后端服务的,存放Controller、Service、Mapper的,因此只需要这个模块中保留启动类即可。也要引入web依赖

接下来我们要去子模块中,在parent中改成父模块的信息。所有的子模块都需要这一步

Maven高级_第10张图片

3、在父工程中配置各个工程共有的依赖(子工程会自动继承父工程的依赖)


        
            

        

原本这里还有两个起步依赖,但是父模块并不需要,所以给删了。

测试启动一下  

成功运行

版本锁定

父模块中引入的依赖会继承到子模块中,但如果子模块中已经自己引入了一个不同版本的该依赖,那么就会优先生效子模块中的依赖。

这样的话就会出现一个问题,假如三个子模块中都要使用同一个依赖,但是版本各不相同,那么就会导致程序无法正常运行

Maven高级_第11张图片

因此需要在父模块中使用来统一管理依赖版本

Maven高级_第12张图片

此时子工程引入依赖时就无需指定版本号,父工程统一管理。变更依赖版本,只需要在父工程中统一更改即可。

注:下定义的依赖并不会引入进父工程中,要引入依赖需要这个标签外额外开一个才行

如果你觉得这样配置太繁琐,那么还有另一种方式,创建在其中直接定义一个版本的常量。这样直接让子模块中调用版本号即可

Maven高级_第13张图片

小细节: 在需要使用到web服务的模块中只需要引入web起步依赖即可,不需要指定版本号,父模块也一样。这是因为,父模块还有也有一个parent

Maven高级_第14张图片

我们在创建springboot工程的时候早就选择过了要使用的springboot版本,这些信息就存储在了父模块的parent中

聚合

所谓聚合,就是将多个模块组织成一个整体,同时进行项目的构建,一键操作

为什么要一键操作,这是因为我们在为项目进行打包的时候,其中的模块错综复杂,相互依赖。

Maven高级_第15张图片

比如这个例子中,一个模块引入了另一个模块,那么就要依次为子模块和父模块执行install,然后才能package,非常麻烦。

因此,我们需要一个专门负责聚合的模块,聚合工程。它必须是不具备任何业务能力的空工程,其中只能有一个pom文件。

欸,巧了,父模块不就正好符合这个条件吗?因此父工程也担任了聚合工程的作用。

操作方法

在父工程(聚合工程)的pom文件中,添加设置当前聚合工程所包含的子模块名称

    
        server
        pojo
        common
    

执行父模块的install命令 

Maven高级_第16张图片

注意:这里有一个易错点,如果某个子模块的构建依赖于其他模块的安装,而这些模块还未安装,就可能导致构建失败。 出现报错

Non-resolvable parent POM for com.wal:server:0.0.1-SNAPSHOT: Could not find artifact com.wal:Sticker:pom:0.0.1-SNAPSHOT and 'parent.relativePath' points at no local POM @ line 6, column 13 -> [Help 2]

先把这段配置代码注释掉,执行install。

然后再注释回来,install。这样就可以正常运行了。


三、私服

私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,用来代理位于外部的中央仓库,用于解决团队内部的资源共享与资源同步问题

比如:企业中有A、B两个开发组,A开发了一个工具jar包,B想要使用,那么就要引入依赖。 A是没有权限将jar包上传至中央仓库的,中央仓库全世界只有一个,但又要让B下载到,因此需要上传至私服中。

Maven高级_第17张图片

我们引入一个依赖,那么此时就会先去本地仓库查找,如果本地仓库中没有,就会去私服中查找依赖。若是私服中也没有该依赖,才会去中央仓库中寻找。

注:私服在企业开发中,一个项目/公司,只需要一台即可(无需我们搭建,会使用就行了)

资源上传与下载

Maven高级_第18张图片

私服中有三个仓库

  • central:存储从中央仓库中下载的依赖
  • release(发行版本):功能趋于稳定、当前停止更新,可以用于发行的依赖,存储在release仓库中
  • snapshot(快照版本):功能不稳定, 尚处于开发中的版本,存储在snapshot仓库中

比如:查看我们之前创建的模块信息,版本号默认是snapshot,这代表正在开发中

Maven高级_第19张图片

使用步骤

1、设置私服的访问用户名/密码(maven的setting.xml中servers中配置)

Maven高级_第20张图片

2、IDEA的maven工程的pom.xml文件中配置上传(发布)的地址

Maven高级_第21张图片

3、设置私服依赖下载的仓库组地址(maven中settings.xml中的mirrors、profiles中配置)

如果配置过阿里云的仓库,需要将其直接替换掉,因为那也是一个私服

Maven高级_第22张图片

Maven高级_第23张图片


四、bug汇总解决

作为一个初学者,在这里遇到了非常多的bug,在这里集中汇总讲解一下

1、未找到parent.relativePath

Non-resolvable parent POM for com.wal:server:0.0.1-SNAPSHOT: Could not find artifact com.wal:Sticker:pom:0.0.1-SNAPSHOT and 'parent.relativePath' points at no local POM @ line 6, column 13 -> [Help 2]

原因:我们为了统一聚合打包使用了

Maven高级_第24张图片

如果某个子模块的构建依赖于其他模块的安装,而这些模块还未安装,就可能导致构建失败。 出现报错

首先一定要确定这地方与父模块的信息是相同的,名字是区分大小写的,不要写错,这样才能找到

Maven高级_第25张图片空标签默认就是去父模块中寻找pom.xml ,如果找不到可以尝试在这里手动写一下路径

./是本目录,../是上级目录

解决方法:

此时有两种处理方式

Maven高级_第26张图片

1、先把这段配置代码注释掉,执行install。

然后再注释回来,install。这样就可以正常运行了。

2、或者直接使用mvn命令

mvn install -am

这个命令告诉 Maven 在构建时同时构建必要的模块。这样,Maven 会先构建并安装所有的依赖模块,然后再构建并安装当前模块。这通常可以解决类似的依赖问题。如果问题仍然存在,可能需要检查子模块之间的依赖关系,确保它们之间的依赖关系正确配置。或者还是直接用上一种方法吧。

2、Unable to find main class

Maven高级_第27张图片

原因:你在别的模块中使用了创建spring-boot-maven-plugin打包

Maven高级_第28张图片

那么就必须要一个main方法作为入口,但是这个子模块是管理资源或者工具的,要勾八入口啊,所以最好的解决方法还是直接将这段配置删掉。

此时再install一下

Maven高级_第29张图片成功打包 

3、java: 模块循环不支持注解处理。请确保将循环 [common,pojo] 中的所有模块排除在注解处理之外

原因:你的依赖传递设计的有问题,大概是你一个模块A引入了另一个模块B之后,这个模块B又引入了模块A。这样就导致了循环,

也有可能是你在父模块中直接全部引入了所有模块依赖

Maven高级_第30张图片

解决方法:重新设计你的依赖引入去,别导致循环就OK了

4、我只遇到了这几个bug,还遇到什么bug可以在评论区留言

你可能感兴趣的:(maven,java)