Java Pom 两个模块需要互相引用怎么办

news/2024/11/13 12:32:25/文章来源:https://www.cnblogs.com/bkbk123/p/18538515
  1. Java POM 模块化是什么

在 Java 项目中,特别是在使用 Maven 作为构建工具时,"POM 模块化"是一个重要的概念,它指的是将大型项目拆分成多个更小、更易于管理的模块(或称为子项目)。每个模块都有自己的pom.xml文件,该文件定义了模块的构建配置,包括依赖关系、插件、目标平台等。

1.1 POM(Project Object Model)

POM 是 Maven 项目管理和构建的核心文件,它通常是一个名为pom.xml的 XML 文件。POM 文件包含了项目的所有配置信息,Maven 通过这些信息来构建项目、管理依赖以及执行其他构建任务。

1.2 模块化

模块化是一种将软件分解成一组独立但可互操作的模块的技术。在 Maven 项目中,模块化意味着将大型应用程序或库拆分成更小的组件,每个组件都负责一组特定的功能或业务逻辑。这些组件(即模块)可以通过 Maven 的依赖管理机制相互依赖,从而形成一个完整的应用程序或库。

1.3 Maven 模块化项目的优点

(1)可重用性:模块可以被多个项目共享和重用。

(2)易于管理:大型项目拆分成多个小模块后,每个模块都可以独立构建和测试,从而简化了整个项目的构建和测试过程。

(3)清晰的依赖关系:通过 POM 文件中的依赖声明,可以清晰地看到模块之间的依赖关系。

(4)团队协作:不同的模块可以由不同的团队或开发者并行开发,提高了开发效率。

(5)灵活性:模块化使得项目更加灵活,可以更容易地添加、删除或替换模块。

1.4 Maven 模块化项目的结构

一个 Maven 模块化项目通常包含一个父 POM 文件和多个子模块。父 POM 文件定义了所有子模块共享的构建配置和依赖管理策略。子模块则继承父 POM 的配置,并根据需要添加特定的配置或依赖。

1.5 示例

假设有一个名为MyProject的 Maven 模块化项目,它包含三个子模块:common、module-a和module-b。项目的目录结构可能如下所示:

MyProject/
|-- pom.xml (父POM)
|-- common/
| |-- pom.xml
| |-- src/
| |-- main/
| |-- java/
| |-- com/example/common/
|-- module-a/
| |-- pom.xml
| |-- src/
| |-- main/
| |-- java/
| |-- com/example/modulea/
|-- module-b/
|-- pom.xml
|-- src/
|-- main/
|-- java/
|-- com/example/moduleb/

在这个例子中,MyProject/pom.xml是父 POM 文件,它定义了所有子模块共有的配置和依赖。common、module-a和module-b是子模块,它们分别包含自己的pom.xml文件和源代码。这些子模块可以通过 Maven 的依赖机制相互依赖,也可以依赖外部库。

通过模块化,MyProject项目变得更加清晰、易于管理和维护。开发者可以独立地构建和测试每个模块,而不必担心它们之间的依赖关系。同时,模块化的结构也使得项目更加灵活,可以更容易地根据需求进行扩展或修改。

  1. Java Pom 两个模块需要互相引用方法示例

在 Maven 项目中,当两个模块(或称为子项目)需要互相引用时,通常意味着这两个模块之间存在紧密的依赖关系。然而,Maven 的常规依赖管理并不直接支持循环依赖(即 A 依赖 B,B 又依赖 A),因为这会导致构建过程中的死锁。不过,大多数情况下,可以通过重新设计模块结构或利用 Maven 的特性(如聚合和继承)来避免直接的循环依赖。

但假设我们的场景是合理的,比如两个模块分别负责不同的业务逻辑,但确实需要共享一些公共的类或接口,而这些类或接口又分布在两个模块中。这种情况下,我们可以考虑将共享的部分提取到一个新的模块中,然后让这两个模块都依赖于这个新模块。

我将展示一个简化的例子,其中两个模块module-a和module-b通过 Maven 的聚合(Aggregation)和继承(Inheritance)机制来组织,并假设它们通过共享一个公共的父 POM 来管理依赖,而不是直接互相引用。

2.1 项目结构

my-project/
|-- pom.xml (父POM)
|-- module-a/
| |-- pom.xml
| |-- src/
| |-- main/
| |-- java/
| |-- com/example/modulea/ModuleA.java
|-- module-b/
| |-- pom.xml
| |-- src/
| |-- main/
| |-- java/
| |-- com/example/moduleb/ModuleB.java
|-- common/
|-- pom.xml
|-- src/
|-- main/
|-- java/
|-- com/example/common/SharedClass.java

2.2 父 POM (my-project/pom.xml)


4.0.0
com.example
my-project
1.0-SNAPSHOT
pom

<modules>  <module>module-a</module>  <module>module-b</module>  <module>common</module>  
</modules>  

2.3 common 模块 (common/pom.xml)


4.0.0

com.example
my-project
1.0-SNAPSHOT

<artifactId>common</artifactId>  <dependencies>  <!-- 这里可以添加common模块需要的依赖 -->  
</dependencies>  

2.4 module-a 和 module-b 的 POM 文件

这两个模块的 POM 文件将非常相似,除了它们的artifactId和可能的一些特定依赖外。它们都将依赖于common模块。


4.0.0

com.example
my-project
1.0-SNAPSHOT

<artifactId>module-a</artifactId>  <dependencies>  <dependency>  <groupId>com.example</groupId>  <artifactId>common</artifactId>  <version>${project.version}</version>  </dependency>  <!-- 其他依赖 -->  
</dependencies>  

2.5 结论

在这个例子中,module-a和module-b没有直接互相引用,而是通过共享一个common模块来避免循环依赖。这是处理 Maven 项目中模块间依赖关系的推荐方式。如果确实需要两个模块直接互相引用,那么可能需要重新考虑我们的项目结构或设计模式。

  1. 如何使用 Maven 模块化

使用 Maven 进行模块化是一种将大型项目分解为更小、更易于管理的部分的方法。每个模块都是一个独立的 Maven 项目,拥有自己的pom.xml文件,但可以通过 Maven 的继承和聚合特性与其他模块相关联。以下是如何使用 Maven 进行模块化的基本步骤:

3.1 创建父 POM

首先,我们需要创建一个父 POM(pom.xml),它将作为所有子模块的通用配置模板。父 POM 通常不包含源代码,而是定义了项目共有的配置,如依赖管理、插件配置、目标平台等。


4.0.0
com.example
my-project-parent
1.0-SNAPSHOT
pom

<!-- 依赖管理 -->  
<dependencyManagement>  <dependencies>  <!-- 这里定义子模块可能需要的依赖项及其版本 -->  </dependencies>  
</dependencyManagement>  <!-- 插件管理 -->  
<build>  <pluginManagement>  <!-- 这里定义构建过程中可能需要的插件及其配置 -->  </pluginManagement>  
</build>  <!-- 模块列表 -->  
<modules>  <module>module-a</module>  <module>module-b</module>  <!-- 其他子模块 -->  
</modules>  

注意:pom表明这是一个聚合 POM,它不会构建任何实际的产品,而是用来聚合和管理其他模块。

3.2 创建子模块

然后,我们需要在父 POM 的同级目录下(或指定的任何子目录中)创建子模块。每个子模块都应该有自己的pom.xml文件,并且通常会继承自父 POM。


4.0.0

com.example
my-project-parent
1.0-SNAPSHOT

<artifactId>module-a</artifactId>  <!-- 依赖项(如果需要的话) -->  
<dependencies>  <!-- 这里可以声明具体的依赖项,版本号可以从父POM中继承 -->  
</dependencies>  <!-- 其他配置 -->  
ckgw.kalilan.com ckgw.jiexinlong.com ckgw.shiyongsh.com ckgw.myjhedu.com ckgw.xczipper.com ckgw.yjlzk.com ckgw.huangpihushuichan.com ckgw.yifanyuanyang.com ckgw.dianyunzhisheng.com ckgw.jx-tq.com ckgw.shenshiapp.com ckgw.hxjweiyu.com ckgw.gjmsxy.com ckgw.zgmcpj.com ckgw.tiquality.com ckgw.toto58.com ckgw.lhcgzj.com ckgw.gdlddb.com ckgw.volanswing.com ckgw.smxbsbl.com ckgw.hflxzsgc.com ckgw.nxttyq.com ckgw.jiamuli.com ckgw.banchendb.com ckgw.aguailuo.com ckgw.gzhajd.com ckgw.gzxuezhe.com ckgw.zywl9780bq.com ckgw.nc-lianshun.com ckgw.sp0557.com ckgw.sxjnbw.com ckgw.sheanxf.com ckgw.fsyqd.com ckgw.ygjxjgc.com ckgw.cq-mba.com ckgw.boni168.com ckgw.kan-mei.com ckgw.gxqiangli.com ckgw.lzwgdn.com ckgw.gz-jianyou.com ckgw.zhongzhengja.com ckgw.cshszgyy.com ckgw.shengheyiyuan.com ckgw.ybgamer.com ckgw.hebeixinjinghua.com ckgw.hnlrst.com ckgw.gdrjzcgl.com ckgw.boyuanyiren.com ckgw.whxsdnhs.com ckgw.sdcehb.com ckgw.aisheng120.com ckgw.xiekur.com ckgw.wannianqngjanzhann.com ckgw.whxmlyyy.com ckgw.njcongchong.com ckgw.newpaint-tech.com ckgw.hyxxlx.com ckgw.kangjishengyuan.com ckgw.lidich.com ckgw.dianhaoguan.com ckgw.hczycb.com ckgw.mayunfuren.com ckgw.qianyanjs.com ckgw.punoche.com ckgw.daozhewang.com ckgw.yangzhie322.com ckgw.cdjycm.com ckgw.ltsshoes.com ckgw.mxksl.com ckgw.cdyhjj.com

3.3 构建项目

在父 POM 所在的目录下运行 Maven 命令,Maven 会自动找到并构建所有列在标签下的子模块。

bash复制代码

mvn clean install

这个命令会首先清理之前构建生成的文件,然后编译、测试并安装所有子模块到本地 Maven 仓库中。

3.4 依赖管理

在父 POM 中定义的部分允许我们指定依赖项及其版本号,但不会在父 POM 中实际引入这些依赖项。子模块可以通过声明相同的依赖项(不包括版本号)来继承这些依赖项及其版本号。

3.5 插件管理

类似地,部分允许我们在父 POM 中定义插件及其配置,但不会在父 POM 中实际执行这些插件。子模块可以通过继承这些插件配置来简化插件配置过程。

3.6 结论

通过 Maven 模块化,我们可以将大型项目分解为更小、更易于管理的部分,同时利用 Maven 的继承和聚合特性来共享配置和依赖项。这有助于提高项目的可维护性、可重用性和可扩展性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/830815.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python decimal模块用法

decimal 模块:decimal意思为十进制,这个模块提供了十进制浮点运算支持1.可以传递给Decimal整型或者字符串参数,但不能是浮点数据,因为浮点数据本身就不准确。在Python中,将变量声明为 Decimal 类型通常用于需要高精度和小数运算的场合。Decimal 类型属于 decimal 模块,提…

使用Visual Studio Code 快速新建Net项目

前言最近,总是听大家说Visual Studio Code写后端代码非常好用,蓝后,就自己亲身体验了一下,还是很香的。正文1.首先需要安装Dotnet SDK,我这里安装的8.0版本,如下图:2.安装完DotNet SDK,就可以使用命令创建控制台应用了,如下图:3.新建的控制台应用如下图,有一丢丢的简…

20222402 2024-2025-1《网络与系统攻防技术》实验四实验报告

一、实验内容 本周学习内容 计算机病毒(Virus):通过感染文件(可执行文件、数据文件、电子邮件等)或磁盘引导扇区进行传播,一般需要宿主程序被执行或人为交互才能运行 蠕虫(Worm):一般为不需要宿主的单独文件,通过网络传播,自动复制通常无需人为交互便可感染传播 恶意移动代码…

GeoHash处理经纬度,降维,空间填充曲线

个人博客:无奈何杨(wnhyang) 个人语雀:wnhyang 共享语雀:在线知识共享 Github:wnhyang - Overview参考 https://segmentfault.com/a/1190000042971576 GeoHash原理以及代码实现_geohash编码-CSDN博客 GeoHash代码实现--java_geohash java代码示例-CSDN博客 在线经纬度距离…

windows环境下cmd窗口打开就进入到对应目录,一般人都不知道~

前言 很久以前,我还在上一家公司的时候,有一次我看到我同事打开cmd窗口的方式,瞬间把我惊呆了。原来他打开cmd窗口的方式,不是一般的在开始里面输入cmd,然后打开cmd窗口。而是另外一种方式。 我这个同事是个技术控,喜欢研究新的技术,研究一些提高效率的小窍门。这一方面…

黑马PM- B端产品-客户管理

客户管理公海管理商机管理

C盘满了,C盘无损扩容,简单实现

C盘爆满原因很多,无外乎当年固态硬盘贵,C盘分区过小,或者装系统时无意把分区分的太小,这就造成了一个困扰,C盘满了,变成红色,造成软件无法运行,电脑无法启动。如果重新分区,电脑上的资料就没了,所以今天就来介绍一款不用重装系统,扩充C盘容量的方法,操作非常简单,…

SchedulingConfigurer 实现定时任务(动态修改cron,解决@Scheduled需重启服务问题)

通过实现Sc接口,实现定时任务,解决@Scheduled的定时任务改动cron需要服务重启的问题。@Slf4j @Component public class ATestScheduleJob implements SchedulingConfigurer {@Value("${a.c:0/5 * * * * ?}")private String cron1;@Overridepublic void configureT…

20222319 2024-2025-1 《网络与系统攻防技术》实验四实验报告

1.实验要求 1.1 实验内容 一、恶意代码文件类型标识、脱壳与字符串提取 对提供的rada恶意代码样本,进行文件类型识别,脱壳与字符串提取,以获得rada恶意代码的编写作者,具体操作如下: (1)使用文件格式和类型识别工具,给出rada恶意代码样本的文件格式、运行平台和加壳工具…

黑马PM- B端产品- CRM产品概述

CRM的定义CRM的核心要素CRM的设计思路

推荐模型梳理

Summary 目录Summary标准序列推荐模型其他推荐模型FPMCDNN(Pooling)GRU4Rec(RNN-based)GRU4Rec+(RNN-based)Caser(CNN-based)SASRec(Transformer-based)DIN(Transformer-based)BERT4Rec(Transformer-based)TiSASRec(Transformer-based)FMLP-Rec(Transformer-b…