IDEA 搭建 Maven模块化项目

news2024/9/21 21:42:04

目录

1.前言

2. 软硬件环境

3.项目搭建

3.1.创建 SpringBoot 父项目

3.2. 构建子项目centerdao

3.3. 构建子项目centerweb

4. 建立父子 Module 依赖

4.1 删除不必要文件

4.2.修改 Parent 项目 packaging

4.3.修改子项目pom.xml 信息

4.4. 补充说明

5. 项目继承关系

6. 发布 WEB 服务

7. 结语


1.前言

多模块项目,适用于一些比较大的项目,通过合理的模块拆分,实现代码的复用,便于维护和管理。尤其是一些开源框架,也是采用多模块的方式,提供插件集成,用户可以根据需要配置指定的模块

构建微服务项目,基本上会对模块进行明确的划分,比如:

  • 抽象定义公共代码及Util封装进行引用
  • 业务代码进行单独定义模块
  • 数据库等DB操作相关抽离单独模块
  • 提供外部平台调取的接口单独定义模块

上面的拆分也并非绝对,随着架构师对于项目结构的不同理解,可能会衍生出不同的模块

比较经典的就是 Dubbo 将接口 API 进行抽离提供生产者接口,打为 Jar 包供消费端调用

本篇文章也会从零到一创建 SpringBoot 父子模块的项目,演示聚合、继承的项目特性,并针对不引人注意的知识点进行讲解

2. 软硬件环境

电脑: win10

创建项目工具: IDEA 2022.3

JDK 版本:JDK8

Maven版本: 3.6.1

3.项目搭建

3.1.创建 SpringBoot 父项目

1)首先打开 IDEA 工具,点击File ---->new ---> Create New Project

2)选择 Spring Initializr(初始化),选择Project SDK 1.8,类型选择maven,Java语言选择8

Group: 项目组织唯一的标识符,实际对应 Java 的包的结构,是 main 目录里 Java 的目录结构Group 也就是 groupId,分为多个段;一般情况下 第一段为域,第二段为公司,第三段为项目名称以 Nacos 源码进行举例,Group 为 com.alibaba.nacos:com 为商业组织,alibaba 为公司名称,nacos 就是项目名称

Artifact: 项目的唯一的标识符,实际对应项目的名称,就是项目根目录的名称

Artifact 即为 artifactId,还是以 Nacos 举例,因为最近在看它~

Nacos 不同功能组件的 artifactId 各不相同,比如权限相关的子模块就是 nacos-auth,客户端相关是 nacos-client,具体到了项目功能组件

Type: 分为四种不同的类型,日常我们选择默认第一条就行,也就是 Maven Project

Language: 开发语言的话自然就是默认的 Java

Packaging: 打包方式,分为 War 包 和 Jar 包,这里选择 Jar 包

Java Version: 选择 Java 的一个版本,再坚持 20 年的 JDK 1.8

Version: 当前项目的一个版本,SNAPSHOT 为快照的意思

开发时一般使用此类型,因为对于 Maven 仓库的同步较为友好,有不同纬度的同步选择

Name: 定义项目名称

Description: 定义项目描述信息,帮助别人更好的了解项目

Package: 定义 main.java 目录下的结构

4)选择 SpringBoot 版本信息以及 Pom.xml 文件依赖组件

这里选择的 SpringBoot 版本是 2.7.1,jdk8对应2.*版本,点击 Next 继续进行创建项目

5)一个标准的 SpringBoot 项目就产生了

3.2. 构建子项目centerdao

在父项目的基础上直接创建module

1)点击菜单栏中 File -> New -> Module,不同版本中可能会有一点差异

 2)这里就是重复上述在创建 SpringBoot 项目时的步骤,Next 下一步

3)配置可按照需求进行选择,因为不同的 Module 需要引用不同的 Pom 依赖,后面会与 Parent 保持一个交互,确认创建信息,点击 Finish 生成项目

4)最终结构目录如下,项目已成功创建,后续我们要修改其中的 Pom.xml 使其成为真正的父子项目

3.3. 构建子项目centerweb

1)创建步骤与上边的centerdao一致

 2)添加spring web依赖,web项目作为整个项目的启动项目,继续添加代码简化依赖lombok

 

3)最终项目结构如下 

4. 建立父子 Module 依赖

将建立的 Parent 项目与后面创建的 Module 产生关联,需要改动以下几点

  • 修改 Parent 项目 Pom.xml 的打包方式 packaging 标签打包方式为 pom
  • 删除不必要文件并梳理 Pom.xml 依赖上下级关系
  • 需要新加一个 modules 标签,包含所有子项目,将所有的子模块都引入进去

对于子工程中的 .xml 文件

  • 修改 Module 项目 pom.xml中parent 标签为其父工程
  • 添加打包方式为 jar
  • 删除依赖包:继承夫父工程的依赖包

4.1 删除不必要文件

1)删除父项目红框标注的内容:src 文件是保存源代码的,可是我们的多模块的代码存放在多个架构层中,所以不需要这个 src 来存放代码

2)删除除启动项目centerweb之外的启动文件和配置文件和启动类

删除后的项目结构是这样的: 

4.2.修改 Parent 项目 packaging

打开 Parent 项目的根 Pom.xml 文件,新增下方代码

    <!--打包方式-->
    <packaging>pom</packaging>
    <modules>
        <!-- 配置子项目-->
        <!-- 对应artifactId-->
        <module>centerdao</module>
        <module>centerweb</module>
    </modules>

packaging 包含三个值 Jar、War、Pom,默认 Jar的方式

首先来解释下 packaging 为 Pom 的意思,宏观而言即没有代码需要测试或者编译,也没有资源需要处理

Jar: 内部调用或作为服务进行发布使用

War: 需要部署的项目

Pom: 寓意为一个父级项目,一般作为项目聚合和依赖传递使用

modules 代表了 Parent 项目下的子 Module,体现了聚合的思想

这里把 父项目Parent 项目的 Pom.xml 配置复制出来,帮助大家后续排查问题

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.11</version>
        <relativePath/> 
    </parent>
    <groupId>com.ykx.center</groupId>
    <artifactId>centerparent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>centerparent</name>
    <description>SpringBoot 父子模块项目</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <!--打包方式-->
    <packaging>pom</packaging>
    <modules>
        <!-- 配置子项目-->
        <!-- 对应artifactId-->
        <module>centerdao</module>
        <module>centerweb</module>
    </modules>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

spring-boot-maven-plugin 的作用是运行 mvn package 时会将项目打包为可运行的 jar 包,java -jar 运行即可

如果不加这个 pluginsjava -jar xxx.jar 会报出如下错误

xxx/target/bootdemo-remote-api-0.0.1-SNAPSHOT.jar中没有主清单属性

4.3.修改子项目pom.xml 信息

创建后的子项目的 Parent 信息是 SpringBoot 配置,修改后如下

	<parent>
		<groupId>com.ykx.center</groupId>
		<artifactId>centerparent</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>

4.4. 补充说明

另外说一下 dependencies 和 dependencyManagement 标签做一个讲解

1)dependencies

        如果 Parent 项目中使用 dependencies 标签,标签内的依赖默认传递子 Module,不用子 Module 进行显示书写依赖

2)dependencyManagement

        dependencyManagement 与dependencies 不同的是,标签内的依赖不会默认传递子 Module,其作用只是为了统一版本声明        

        如果子 Module 依赖 Parent 项目中 dependencyManagement 标签内的 pom 依赖,需要显示在子 Module 的 pom 文件中进行书写

5. 项目继承关系

我们按照《构建子 Module》章节的内容,构建出如下所述的子 Module,如果centerweb项目引用centerdao项目

		<!--引用dao项目-->
		<dependency>
			<groupId>com.ykx</groupId>
			<artifactId>centerdao</artifactId>
			<version>0.0.1-SNAPSHOT</version>
		</dependency>

然后修改centenweb子 Module 的 pom.xml 文件如下

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>com.ykx.center</groupId>
		<artifactId>centerparent</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>
	<groupId>com.centerweb</groupId>
	<artifactId>centerweb</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>centerweb</name>
	<description>centerweb子项目</description>
	<properties>
		<java.version>1.8</java.version>
		<centerdao.version>0.0.1-SNAPSHOT</centerdao.version>
	</properties>
	<dependencies>
		<!--引用dao项目-->
		<dependency>
			<groupId>com.ykx</groupId>
			<artifactId>centerdao</artifactId>
			<version>${centerdao.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot</artifactId>
		</dependency>
	</dependencies>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<excludes>
						<exclude>
							<groupId>org.projectlombok</groupId>
							<artifactId>lombok</artifactId>
						</exclude>
					</excludes>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

通过继承关系的设置,centerdao 中的代码就可以被 centerweb  项目进行引用

6. 发布 WEB 服务

在 Parent 项目 pom.xml dependencies 标签中定义了 spring-boot-starter-web 依赖,直接使用 web 相关内容即可

centerweb中创建 Controller 控制器

@RestController
public class DemoController {

    @GetMapping("/echo/{name}")
    public String sayHello(@PathVariable("name") String name) {
        return "Hello World " + name;
    }
}

启动后端项目成功后,浏览器输入 http://localhost:8080/echo/mahua 请求后端服务

7. 结语

由于作者水平有限, 希望大家能够反馈指正文章中错误不正确的地方, 感谢 🙏

小伙伴的喜欢就是对我最大的支持 😆 , 希望大家能够 点赞、评论、在看三连

参考

IDEA 最便捷创建 SpringBoot 父子 Module 项目

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ios15及以上webview、Safari使用Websocket断连,1006无清晰错误码

文章目录 问题表现&#xff1a;定位疑似原因&#xff1a;解决方式&#xff1a;定位问题思路过程记录&#xff1a;1、对比前端代码运行环境问题2、写纯请求前端代码连接&#xff0c;确认是否接口部署服务问题&#xff1b;3、IOS连接是否有对TSL安全协议版本有要求&#xff08;使…

【Java入门合集】第六章异常处理

博主&#xff1a;命运之光 专栏&#xff1a;JAVA入门 学习目标 掌握异常的概念&#xff0c;Java中的常见异常类&#xff1b; 掌握Java中如何捕获和处理异常&#xff1b; 掌握自定义异常类及其使用&#xff1b; 目录 异常概述 异常体系 常见的异常 Java的异常处理机制 方式…

The Certificate Of Harbor On Rancher(2.5.16)

序言 针对Rancher2.5.16版本的情况. 问题是: 当我们创建RancherServcie后,RancherService会在容器内通构建k3s环境,然后k3s去我们的私有Harbor拉取镜像. 问题就在我们虽然在虚拟机上给docker设置了可以不通过Https的方式拉取Hrabor的镜像,但是RancherService中的k3s也会去拉…

Android---bitmap优化

目录 Bitmap 占用内存大小计算 Bitmap | Drawable | InputStream | Byte[] 之间进行转换 Bitmap 相关方法 BitmapFactory 工厂类 Bitmap 占用内存大小计算 Bitmap 作为位图&#xff0c;需要读入一张图片中每一个像素点的数据&#xff0c;其主要占用内存的地方也正是这些像…

【axios 使用】下载文件流 以及 获取响应头header content-disposition

获取数据都知道&#xff0c;使用的是 axios,主要是设置 responseType: blob 由于项目使用的是 apipost &#xff0c;所以在使用的时候还要设置 isReturnNativeResponse -是否返回本机响应标头&#xff0c;一般可能设置 responseType: blob 就可以了 export function getDow…

本地使用IIS快速搭建一个属于自己的网站,并发布公网访问「无需购买云服务器」

文章目录 1.前言2.Windows网页设置2.1 Windows IIS功能设置2.2 IIS网页访问测试 3. Cpolar内网穿透3.1 下载安装Cpolar内网穿透3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5.结语 1.前言 在网上各种教程和介绍中&#xff0c;搭建网页都会借助各种软件的帮助&#xf…

java+iClientOpenlayers实现城市内涝积涝模拟内涝模拟演进

程序实现效果图 洪水演进过程 一、应用背景 城市内涝和积涝是一个严重的问题&#xff0c;特别是在气候变化的背景下。为了更好地了解这个问题&#xff0c;模拟城市内涝和积涝是非常重要的。这个过程可以帮助我们预测哪些区域可能会受到影响&#xff0c;以及在发生内涝和积涝时…

人人都应该知道的CPU缓存运行效率

提到CPU性能&#xff0c;大部分同学想到的都是CPU利用率&#xff0c;这个指标确实应该首先被关注。但是除了利用率之外&#xff0c;还有很容易被人忽视的指标&#xff0c;就是指令的运行效率。如果运行效率不高&#xff0c;那CPU利用率再忙也都是瞎忙&#xff0c;产出并不高。 …

“LSTM之父”谈AI威胁论:AI将超越人类智力,对人类不感兴趣,呼吁暂停AI是一种误导

他因在人工智能&#xff08;AI&#xff09;、深度学习和人工神经网络领域内做出的成就而知名&#xff0c;一度被称为“&#xff08;现代&#xff09;AI 之父”或“深度学习之父”。 他提出的长短期记忆网络&#xff08;LSTM&#xff09;被谷歌、苹果、亚马逊、Meta 等科技巨头…

Ims跟2/3G会议电话(Conference call)流程差异介绍

2/3G Conference call 合并(Merged)通话前,两路电话只能一路保持(Hold),一路通话(Active)。 主叫Merged操作,Hold的一路会变成Active,进入会议通话。 例如终端A跟C通话,再跟B通话,此时B就是Active状态,C从Active变成Hold状态。Merged进入会议通话后,C又从Hold变…

亚马逊关于婴儿摇篮的政策需要做的认证标准

本政策适用的婴儿摇篮 婴儿摇篮 婴儿摇篮是一种旨在为婴儿提供睡眠环境的小床。婴儿摇篮由独立支腿、固定框架或支腿、轮式底座、摇摆底座或可以相对于固定底座摇摆的底座支撑。在静止&#xff08;不摇摆或不摆动&#xff09;时&#xff0c;婴儿摇篮的睡眠表面与水平面的夹角…

ASEMI代理ADI亚德诺LT6230CS6-10#TRPBF车规级芯片

编辑-Z LT6230CS6-10#TRPBF特点&#xff1a; 低噪声电压&#xff1a;1.1nV/ √Hz 低电源电流&#xff1a;3.5mA/Amp&#xff08;最大值&#xff09; 低失调电压&#xff1a;350μV&#xff08;最大值&#xff09; 增益带宽积&#xff1a; LT6230&#xff1a;215MHz&#…

设计模式之【桥接模式】,多用组合少用继承

文章目录 一、什么是桥接模式1、使用场景2、代理、桥接、装饰器、适配器 4 种设计模式的区别3、桥接模式的优缺点4、桥接模式的四种角色 二、实例桥接模式优化代码 三、源码中使用的桥接模式1、桥接模式在JDBC中的应用 一、什么是桥接模式 桥接模式&#xff08;Bridge Pattern…

【Java 并发编程】Java 线程本地变量 ThreadLocal 详解

Java 线程本地变量 ThreadLocal 详解 1. ThreadLocal 简介2. ThreadLocal 的使用2.1 ThreadLocal 接口&#xff08;1&#xff09;initialValue()&#xff08;2&#xff09;get()&#xff08;3&#xff09;set(T value)&#xff08;4&#xff09;remove() 2.2 ThreadLocal 应用 …

springboot链接redis (Windows版本)

1。 下载链接 https://redis.io/download/ 2.下载完成之后傻瓜安装 3. 打开下载安装路径 3.输入cmd回车 4.依次执行以下命令 redis-server.exe redis-server.exe redis.windows.conf redis-cli shutdown exit redis-server.exe redis.windows.conf 可成功启动redis 5…

(五)Kubernetes - 手动部署(二进制方式安装)

Kubernetes - 手动部署 [ 4 ] 1 增加Master节点(高可用架构)1.1 部署Master2 Node1.1.1 安装Docker(Master1)1.1.2 启动Docker、设置开机自启(Master2)1.1.3 创建etcd证书目录(Master2)1.1.4 拷贝文件(Master1)1.1.5 删除证书(Master2)1.1.6 修改配置文件和主机名(Master2)1.1.…

在线一键解jsjiami.v6

在当今的互联网时代&#xff0c;JavaScript是web开发的核心技术之一。但是&#xff0c;为了保护JavaScript代码的安全性&#xff0c;很多开发者会使用JS加密技术。其中一个常用的JS加密工具是jsjiami.v6。 JS加密通过对JavaScript代码进行混淆、压缩、编码等多种操作&#xff…

使用crond定时跑脚本备份数据库

前言&#xff1a; 开发环境 服务器&#xff1a;centos 7&#xff08;腾讯云轻量服务器&#xff09; 数据库&#xff1a;mysql 5.7 一、crond是什么&#xff1f; crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程&#xff0c;与windows下的计划任务…

车载测试-can报文解析规则实例

报文解析 报文组成 一般报文主要有以下几个参数&#xff08;比较全的情况下&#xff09; 例 解析报文时主要用到的是帧ID和帧数据 帧ID 接收到的帧ID是十六进制的形式&#xff0c;由29位标识符转换的&#xff0c;目前大多数的通信协议中都直接给出了相应的帧ID&#xff0c…

一文读懂ChatGPT(全文由ChatGPT撰写)

最近ChatGPT爆火&#xff0c;相信大家或多或少都听说过ChatGPT。到底ChatGPT是什么&#xff1f;有什么优缺点呢&#xff1f; 今天就由ChatGPT自己来给大家答疑解惑~ 全文文案来自ChatGPT&#xff01; 01 ChatGPT是什么 ChatGPT是一种基于人工智能技术的自然语言处理系统&…