首页 > 编程语言 >java pom两个模块需要互相引用怎么办

java pom两个模块需要互相引用怎么办

时间:2024-09-17 21:22:09浏览次数:15  
标签:依赖 java spring ssm pom 模块 org com

在Maven项目中,如果两个模块(通常称为子模块)需要互相引用,这通常意味着你的项目结构可能需要重新考虑或调整。Maven默认不支持直接的循环依赖,因为这会导致构建过程中的死锁。但是,有几种方法可以处理这种情况或避免它:

1. 重新设计项目结构

首先,考虑是否有可能重新设计项目结构来避免循环依赖。这可能涉及到将共享的代码或功能提取到一个新的、单独的模块中,然后让原先的两个模块都依赖于这个新的模块。

2. 使用Maven的provided作用域

如果两个模块之间的依赖是编译时的,但运行时不会直接依赖于对方(例如,它们可能都依赖于一个共同的库,但只是在编译时需要对方的接口),你可以考虑将依赖设置为provided作用域。然而,这通常不适用于直接的模块间依赖,因为它假设运行时环境将提供所需的依赖。

java pom两个模块需要互相引用怎么办_spring

3. 聚合与继承

  • 聚合(Aggregation):使用<modules>标签在父POM中聚合所有子模块。这允许你在一个命令中构建所有模块,但它不解决直接的模块间依赖问题。
<?xml version="1.0" encoding="UTF-8"?>
<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.itheima</groupId>
    <artifactId>ssm</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!--定义该工程用于进行构建管理-->
    <packaging>pom</packaging>
    <!--定义工程管理那些pom-->
    <!--管理的工程列表-->
    <modules>
    <!--具体的工程名称-->
        <module>../ssm_controller</module>
        <module>../ssm_dao</module>
        <module>../ssm_service</module>
        <module>../ssm_pojo</module>
    </modules>

    <!--声明此处进行依赖管理-->
    <dependencyManagement>

    <!--具体的依赖-->
        <dependencies>
            <!--添加自己的工程模块的依赖-->
           <!--spring环境-->
            <!--spring环境-->
            <!--spring环境-->

            <dependency>
                <groupId>com.itheima</groupId>
                <artifactId>ssm_pojo</artifactId>
                <version>1.0-SNAPSHOT</version>
            </dependency>

            <dependency>
                <groupId>com.itheima</groupId>
                <artifactId>ssm_service</artifactId>
                <version>1.0-SNAPSHOT</version>
            </dependency>

            <dependency>
                <groupId>com.itheima</groupId>
                <artifactId>ssm_dao</artifactId>
                <version>1.0-SNAPSHOT</version>
            </dependency>


            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>5.1.9.RELEASE</version>
            </dependency>


            <!--mybatis环境-->
            <!--mybatis环境-->
            <!--mybatis环境-->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.5.3</version>
            </dependency>
            <!--mysql环境-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.47</version>
            </dependency>
            <!--spring整合jdbc-->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jdbc</artifactId>
                <version>5.1.9.RELEASE</version>
            </dependency>
            <!--spring整合mybatis-->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis-spring</artifactId>
                <version>2.0.3</version>
            </dependency>
            <!--druid连接池-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.1.16</version>
            </dependency>
            <!--分页插件坐标-->
            <dependency>
                <groupId>com.github.pagehelper</groupId>
                <artifactId>pagehelper</artifactId>
                <version>5.1.2</version>
            </dependency>


            <!--springmvc环境-->
            <!--springmvc环境-->
            <!--springmvc环境-->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>5.1.9.RELEASE</version>
            </dependency>
            <!--jackson相关坐标3个-->
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
                <version>2.9.0</version>
            </dependency>
            <!--servlet环境-->
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
                <version>3.1.0</version>
                <scope>provided</scope>
            </dependency>


            <!--其他组件-->
            <!--其他组件-->
            <!--其他组件-->
            <!--junit单元测试-->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
            </dependency>
            <!--spring整合junit-->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-test</artifactId>
                <version>5.1.9.RELEASE</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <build>
        <pluginManagement>

        <!--设置插件-->
        <plugins>
                <!--具体的插件配置-->
                <plugin>
                    <groupId>org.apache.tomcat.maven</groupId>
                    <artifactId>tomcat7-maven-plugin</artifactId>
                    <version>2.1</version>
                    <configuration>
                        <port>80</port>
                        <path>/</path>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <source>7</source>
                        <target>7</target>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>
  • 继承(Inheritance):一个模块可以通过<parent>标签继承另一个模块的POM设置。但是,这同样不解决直接的循环依赖问题。
<!--声明此处进行依赖管理-->
<dependencyManagement>
    <!--具体的依赖-->
    <dependencies>
        <!--spring环境-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.1.9.RELEASE</version>
        </dependency>
    <dependencies>
<dependencyManagement>

### **3.4)继承依赖使用**

在子工程中定义依赖关系,无需声明依赖版本,版本参照父工程中依赖的版本

```xml
<dependencies>
    <!--spring环境-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
    </dependency>
</dependencies>

4. 分离公共接口

将两个模块共同需要的接口、类、工具类等提取到一个单独的模块中,然后让两个模块都依赖于这个公共模块。这是解决循环依赖问题的最常见和最推荐的方法。

5. 使用Maven的dependency:unpack-dependencies插件

虽然不推荐,但理论上你可以使用Maven的dependency:unpack-dependencies插件来将一个模块的编译产物(如jar)作为另一个模块的源文件或资源来处理。然而,这种方法既复杂又容易出错,且违背了Maven的依赖管理原则。

<build>  
    <plugins>  
        <plugin>  
            <groupId>org.apache.maven.plugins</groupId>  
            <artifactId>maven-dependency-plugin</artifactId>  
            <version>2.8</version>  
        </plugin>  
    </plugins>  
</build>  

结论

通常情况下,最佳做法是重新设计你的项目结构,将共享的代码或功能提取到单独的模块中,并避免直接的循环依赖。这样不仅可以解决构建问题,还可以提高代码的可维护性和可重用性。如果必须保持当前的模块结构,那么可能需要仔细考虑是否真的需要这种循环依赖,或者是否有其他方法可以实现相同的功能。

标签:依赖,java,spring,ssm,pom,模块,org,com
From: https://blog.51cto.com/u_15266301/12038820

相关文章

  • 【Java 优选算法】双指针(下)
    欢迎关注个人主页:逸狼创造不易,可以点点赞吗~如有错误,欢迎指出~有效三角形的个数题目链接解法解法1:暴力枚举--->O(n^3)解法2:利用单调性,使用双指针来解决---->O(n^2)优化:对整个数组进行排序先固定最大数在最大数的左区间内,使用双指针算法,快速统计出符合要......
  • php开启pdo与pdo_mysql扩展模块的方法
    在Windows服务器中启用PHP的PDO(PHPDataObjects)和PDO_MySQL扩展模块的方法如下:步骤1:定位 php.ini 文件找到 php.ini 文件:通常,php.ini 文件位于PHP安装目录中,例如 C:\xampp\php(如果是XAMPP环境)或者其他PHP安装路径下。如果不确定 php.ini 文件的位置,可以在PHP脚本......
  • Java - 2 变量
    Java-2变量变量是程序的基本组成单位变量的三个基本要素:类型+名称+值声明变量=分配内存先声明,后使用变量在同一个作用域不可以重名数据类型基本数据类型:数值型/字符型(本质是整数)/布尔型引用数据类型:类(class)/接口(interface)/数组([])/*数值型-整数*/......
  • JavaScript:对组织值进行排序
    要对组织值进行排序,你可以使用JavaScript中的数组排序方法 sort()。下面是一些示例代码,展示如何对不同类型的组织值进行排序:示例1:对数字数组进行排序constnumbers=[5,2,9,1,5,6];//使用sort()方法进行升序排序numbers.sort((a,b)=>a-b);console.log(n......
  • Java轻量级测试框架的实现与使用 总篇
    Java轻量级测试框架的实现与使用总篇java8,jdk8,测试,assert背景每次写算法题,用例不过总要到本地调试一下,总觉得测试代码写起来又没营养又很麻烦,即便是借助junit测试框架也很麻烦,太重了,写完又觉得测试代码不美观需要删掉。正好在学习spring过程中接触到注解,研究其原理时......
  • 前端JavaScript面试重难点: 闭包+内存泄漏+垃圾回收机制
    前置知识!!!闭包是Javascript语言的一个重难点,也是它的特色,很多高级应用都要依靠闭包来实现。在各种专业文献上学习"闭包"的时候,就一个感觉–“抽象”!特别是学习内存泄漏的时候,没想明白为什么使用闭包的时候不及时清除函数中的元素会导致内存泄漏,直到我的......
  • Java 如何计算jar包的HASH哈希值
    在做授权系统的时候用到了一个小功能发出来分享一下。全部代码如下:importjava.io.File;importjava.io.FileInputStream;importjava.io.InputStream;importjava.net.URISyntaxException;importjava.security.MessageDigest;importjava.security.NoSuchAlgorithmExcepti......
  • Java 性能调优:优化 GC 线程设置
    垃圾回收器使用一组称为GC线程的线程来执行回收工作。有时JVM可能会分配过多或过少的GC线程。本文将讨论JVM为什么会出现这种情况、其影响以及可能的解决方案。1咋查找应用程序的GC线程数量进行线程转储分析来确定应用程序的GC线程数量:从生产服务器捕获threaddump使......
  • Java基础语法-标识符
    标识符关键字Java所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符标识符注意点所有的标识符都应该以字母(A-Z或者a-z),美元($),或者下划线(_)开始首字符之后可以是字母(A-Z或者a-z),美元($),下划线(_)或数字的任何字符组合不能使用关键字作为......
  • day03 - Java集合和常用类
    第一章Collection集合1.Collection概述集合:java中提供的一种容器,可以用来存储多个数据集合和数组既然都是容器,它们有啥区别呢?数组的长度是固定的。集合的长度是不固定的。集合可以随时增加元素,其大小也随之增加数组中存储的是同一类型的元素,可以存储基本数据类型值。......