Maven高级

目录

一、分模块设计与开发

二、继承与聚合

继承

步骤

版本锁定

聚合

操作方法

三、bug汇总解决

1、未找到parent.relativePath

2、Unable to find main class

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


一、分模块设计与开发

为什么要分模块开发?

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

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

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

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

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

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

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


二、继承与聚合

继承

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

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

实现:<parent></parent>

步骤

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

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

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

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

同时它也不需要.mvn、src、Help.md、mvnw.cmd、mvnw文件,统统删掉即可

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

    <!-- 父模块的打包方式 -->
    <packaging>pom</packaging>


    <!-- 父模块的信息 -->
    <groupId>com.wal</groupId>
    <artifactId>Sticker</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>Sticker</name>

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

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

同样使用Spring Initializr创建 server 模块

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

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

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


        <dependencies>
            <!-- 在这里添加子模块都重复用到的的依赖 -->

        </dependencies>

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

测试启动一下  

成功运行

版本锁定

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

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

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

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

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

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

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

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

聚合

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

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

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

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

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

操作方法

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

    <modules>
        <module>server</module>
        <module>pojo</module>
        <module>common</module>
    </modules>

执行父模块的install命令 

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

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]

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

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


三、私服

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

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

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

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

资源上传与下载

私服中有三个仓库

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

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

使用步骤

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

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

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

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


四、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]

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

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

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

<relativePath />空标签默认就是去父模块中寻找pom.xml ,如果找不到可以尝试在这里手动写一下路径

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

解决方法:

此时有两种处理方式

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

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

2、或者直接使用mvn命令

mvn install -am

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

2、Unable to find main class

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

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

此时再install一下

成功打包 

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

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

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

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

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

  • 38
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

An1ong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值