首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

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

编程知识
2024年09月20日 14:51

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模块化项目,它包含三个子模块:commonmodule-amodule-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文件,它定义了所有子模块共有的配置和依赖。commonmodule-amodule-b是子模块,它们分别包含自己的pom.xml文件和源代码。这些子模块可以通过Maven的依赖机制相互依赖,也可以依赖外部库。

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

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

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

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

我将展示一个简化的例子,其中两个模块module-amodule-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)

<project xmlns="http://maven.apache.org/POM/4.0.0"  
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
    <modelVersion>4.0.0</modelVersion>  
    <groupId>com.example</groupId>  
    <artifactId>my-project</artifactId>  
    <version>1.0-SNAPSHOT</version>  
    <packaging>pom</packaging>  
  
    <modules>  
        <module>module-a</module>  
        <module>module-b</module>  
        <module>common</module>  
    </modules>  
</project>

2.3 common 模块 (common/pom.xml)

<project xmlns="http://maven.apache.org/POM/4.0.0"  
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
    <modelVersion>4.0.0</modelVersion>  
    <parent>  
        <groupId>com.example</groupId>  
        <artifactId>my-project</artifactId>  
        <version>1.0-SNAPSHOT</version>  
    </parent>  
  
    <artifactId>common</artifactId>  
  
    <dependencies>  
        <!-- 这里可以添加common模块需要的依赖 -->  
    </dependencies>  
</project>

2.4 module-amodule-b 的POM文件

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

<!-- 以module-a为例 -->  
<project xmlns="http://maven.apache.org/POM/4.0.0"  
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
    <modelVersion>4.0.0</modelVersion>  
    <parent>  
        <groupId>com.example</groupId>  
        <artifactId>my-project</artifactId>  
        <version>1.0-SNAPSHOT</version>  
    </parent>  
  
    <artifactId>module-a</artifactId>  
  
    <dependencies>  
        <dependency>  
            <groupId>com.example</groupId>  
            <artifactId>common</artifactId>  
            <version>${project.version}</version>  
        </dependency>  
        <!-- 其他依赖 -->  
    </dependencies>  
</project>

2.5 结论

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

3. 如何使用Maven模块化

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

3.1 创建父POM

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

<!-- 父POM (位于项目根目录) -->  
<project xmlns="http://maven.apache.org/POM/4.0.0"  
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
    <modelVersion>4.0.0</modelVersion>  
    <groupId>com.example</groupId>  
    <artifactId>my-project-parent</artifactId>  
    <version>1.0-SNAPSHOT</version>  
    <packaging>pom</packaging>  
  
    <!-- 依赖管理 -->  
    <dependencyManagement>  
        <dependencies>  
            <!-- 这里定义子模块可能需要的依赖项及其版本 -->  
        </dependencies>  
    </dependencyManagement>  
  
    <!-- 插件管理 -->  
    <build>  
        <pluginManagement>  
            <!-- 这里定义构建过程中可能需要的插件及其配置 -->  
        </pluginManagement>  
    </build>  
  
    <!-- 模块列表 -->  
    <modules>  
        <module>module-a</module>  
        <module>module-b</module>  
        <!-- 其他子模块 -->  
    </modules>  
</project>

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

3.2 创建子模块

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

<!-- 子模块A的POM (位于module-a目录) -->  
<project xmlns="http://maven.apache.org/POM/4.0.0"  
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
    <modelVersion>4.0.0</modelVersion>  
    <parent>  
        <groupId>com.example</groupId>  
        <artifactId>my-project-parent</artifactId>  
        <version>1.0-SNAPSHOT</version>  
    </parent>  
  
    <artifactId>module-a</artifactId>  
  
    <!-- 依赖项(如果需要的话) -->  
    <dependencies>  
        <!-- 这里可以声明具体的依赖项,版本号可以从父POM中继承 -->  
    </dependencies>  
  
    <!-- 其他配置 -->  
</project>

3.3 构建项目

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

bash复制代码

mvn clean install

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

3.4 依赖管理

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

3.5 插件管理

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

3.6 结论

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

From:https://www.cnblogs.com/TS86/p/18422647
本文地址: http://www.shuzixingkong.net/article/2159
0评论
提交 加载更多评论
其他文章 深入理解Java对象结构
一、Java对象结构 实例化一个Java对象之后,该对象在内存中的结构是怎么样的?Java对象(Object实例)结构包括三部分:对象头、对象体和对齐字节,具体下图所示 1、Java对象的三部分 (1)对象头 对象头包括三个字段,第一个字段叫作Mark Word(标记字),用于存储自身运行时的数据,
深入理解Java对象结构 深入理解Java对象结构 深入理解Java对象结构
RAG+Agent人工智能平台:RAGflow实现GraphRA知识库问答,打造极致多模态问答与AI编排流体验
RAG+Agent人工智能平台:RAGflow实现GraphRA知识库问答,打造极致多模态问答与AI编排流体验
RAG+Agent人工智能平台:RAGflow实现GraphRA知识库问答,打造极致多模态问答与AI编排流体验 RAG+Agent人工智能平台:RAGflow实现GraphRA知识库问答,打造极致多模态问答与AI编排流体验 RAG+Agent人工智能平台:RAGflow实现GraphRA知识库问答,打造极致多模态问答与AI编排流体验
SimpleAISearch:C# + DuckDuckGo 实现简单的AI搜索
最近AI搜索很火爆,有Perplexity、秘塔AI、MindSearch、Perplexica、memfree、khoj等等。 在使用大语言模型的过程中,或许你也遇到了这种局限,就是无法获取网上最新的信息,导致回答的内容不是基于最新的信息,为了解决这个问题,可以通过LLM+搜索引擎的方式实现。 以
SimpleAISearch:C# + DuckDuckGo 实现简单的AI搜索 SimpleAISearch:C# + DuckDuckGo 实现简单的AI搜索 SimpleAISearch:C# + DuckDuckGo 实现简单的AI搜索
痞子衡嵌入式:MCUBootUtility v6.3发布,支持获取与解析启动日志
-- 痞子衡维护的 NXP-MCUBootUtility 工具距离上一个大版本(v5.3.0)发布过去一年了,期间痞子衡也做过三个版本更新,但不足以单独介绍。这一次痞子衡为大家带来了全新重要版本v6.3.x,这次更新主要是想和大家特别聊聊 ROM 启动日志这个特性的支持。 一、v6.0 - v6.3
痞子衡嵌入式:MCUBootUtility v6.3发布,支持获取与解析启动日志 痞子衡嵌入式:MCUBootUtility v6.3发布,支持获取与解析启动日志
Nuxt Kit 中的模板处理
title: Nuxt Kit 中的模板处理 date: 2024/9/20 updated: 2024/9/20 author: cmdragon excerpt: 摘要:本文详细介绍了在Nuxt 3框架中,使用Nuxt Kit进行模板处理的方法,包括理解模板基本概念、使用addTemplate动
Nuxt Kit 中的模板处理 Nuxt Kit 中的模板处理
HiveServer2 文件描述符泄漏
现象 用户反馈 hs2 打开的文件描述符的数量一直在涨,但是当前 hs2 的连接只有个位数。 排查过程 首先找到 hs2 进程持有了哪些文件描述符,通过 lsof 命令 lsof -p $pid ,看到 hs2 进程确实在 /data/emr/hive/tmp/operation_logs/ 目录下
HiveServer2 文件描述符泄漏 HiveServer2 文件描述符泄漏 HiveServer2 文件描述符泄漏
【linux】【docker】Docker默认网段配置导致无法访问
背景 集团有N个基地,所有基地的网络使用的是172.x.x.x网段,这本身没有什么问题!但Docker默认的桥接网段也是172.17.x.x的,如果不修改docker的默认配置会导致个别基地无法访问!列举几个基地使用的网段 基地 网段 A基地 172.30.x.x B基地 172.28.x.x C基
将双通道音频转换为两条单通道音频的解决方案
方案一 代码 在Python中,可以使用wave模块来读取双通道(立体声)音频文件,并将每个通道分别保存为独立的音频文件。以下是一个简单的示例,演示了如何实现这一过程: import wave # 打开双通道音频文件 with wave.open(&#39;stereo_audio.wav&#39;