傻瓜式学习⭐在IDEA中创建多模块父子工程⭐

在IDEA中创建多模块父子工程

一、为什么要创建多模块化工程

大家都知道 Web 工程是 MVC 三层架构,并且在系统中一般会有前台和后台这种两个登录入口的存在。

这种情况一般都是用户前台登录,管理员后台登陆用来查看系统的信息以及系统的维护。

所以这便会有两个 View (视图)层,对应着便会有两个Conatroller(控制)层。

我们抛开 View 不谈,这是前端做的东西,那这时后端便对应这几个架构层:前台控制层(Manager)、后台控制层(Controller)、服务层(Service)以及数据层(Dao);

其中控制层分别用不同的接口,但是服务层以及数据层却用的是同一个。

在 Java 的结构中有着 “高内聚,低耦合” 的设计原则。那上述这个明显是不符合的,虽然说通过包名划分了层次,但是对于架构层次来说,所有东西都被耦合在一起了。因此我们需要进行多模块划分工程。

一个多层次划分的结构应该设这样的:

---- app-xxx
	|-- app-controller
	|        |-- pom.xml (jar)
	|
	|-- app-Manager
	|        |-- pom.xml (jar)
	|
	|-- app-Service
	|        |-- pom.xml (jar)
	|
	|-- app-Dao
	|        |-- pom.xml (jar)
	|
	|-- pom.xml (war)   

上述中,app-controller、app-Manager、app-Service、app-Dao 分别是不同的架构层,其中 app-controller、app-Service、app-Dao 构成一套服务,app-Manager、app-Service、app-Dao 也构成一套服务。很明显 app-controller 与 app-Manager 共用一套 app-Service 与 app-Dao。


二、Maven创建多模块父子项目

在上一篇博客中一个文件承载多个项目时,是创建了一个空项目来承载的,在本篇是多模块的父子工程,多个模块相互之间有联系,采用的是 Maven 来承载我们多个模块的。

1、创建父工程(Maven 项目)

在这里插入图片描述
在这里插入图片描述
之后我们点击 Next 创建 maven 项目。
在这里插入图片描述
这里我们就创建好 maven 项目了,结构如下:
在这里插入图片描述
我们要对其进行处理!
在这里插入图片描述
删除 src 文件,src 文件是保存源代码的,可是我们的多模块的代码存放在多个架构层中,所以不需要这个 src 来存放代码。更改图如下:
在这里插入图片描述

2、创建子工程(Maven 项目)

刚开始 New 一个 Moudle 。
在这里插入图片描述
在这里插入图片描述
点击 Next 即可。
在这里插入图片描述
创建的是 Spring Web 项目,选中 Finish 完成创建。

启动 SpringBoot ,测试!
在这里插入图片描述
成功,架构层架构如下。
在这里插入图片描述
另外,最外层的 maven 项目中的 pom.xml 文件

  1. 需要新加一个 modules 标签
  2. 添加打包方式为 pom
  3. 并新增一个 parent 标签
  4. 添加 springboot 依赖包。

完整的 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 http://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.5.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <packaging>pom</packaging>

    <modules>
        <module>springbootManager</module>
    </modules>

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

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

    <groupId>org.wang</groupId>
    <artifactId>maven-moremodule</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

</project>

而对于子工程中的 .xml 文件

  1. 需要更改其 parent 标签为其父工程
  2. 添加打包方式为 jar
  3. 删除依赖包(继承夫父工程的依赖包)

完整的 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.wang</groupId>
        <artifactId>maven-moremodule</artifactId>
        <version>1.0-SNAPSHOT</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    
    <packaging>jar</packaging>
    
    <groupId>com.wang</groupId>
    <artifactId>springbootManager</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springbootManager</name>
    <description>springbootManager</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
    </dependencies>

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

</project>

再次启动测试 Manager;
在这里插入图片描述
可以正常启动,可以证明继承了父工程的依赖。

再以相同的方法创建三个架构层,分别是:Controller、Service、Dao 。架构层架构如下:
在这里插入图片描述
我们可以先删除 springboot 中不影响项目的文件。
在这里插入图片描述
这些都是可以删除的,有的项目有一个 .iml 文件,这个是不能删除的,我的项目创建之后就没有这个文件。

文件结构如下:
在这里插入图片描述
干净,接下来修改 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 http://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.5.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <packaging>pom</packaging>

    <modules>
        <module>springbootManager</module>
        <module>springbootController</module>
        <module>springbootService</module>
        <module>springbootDao</module>
    </modules>

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

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

    <groupId>org.wang</groupId>
    <artifactId>maven-moremodule</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

</project>

子工程的文件和 Manager 层的文件相同,下面只给出 Dao 层的文件。

<?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.wang</groupId>
        <artifactId>maven-moremodule</artifactId>
        <version>1.0-SNAPSHOT</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <packaging>jar</packaging>

    <groupId>com.wang</groupId>
    <artifactId>springbootDao</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springbootDao</name>
    <description>springbootDao</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>

    </dependencies>

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

</project>

我们可以每层都分别测试,是否继承了父项目。在测试之前,要先关闭上一次测试的项目,都是会出现端口被占用的错误。

接口调用,Controller 层需要调用 Service 层的方法。

在 Controller 层导入Service 层。

    <dependencies>
        <dependency>
            <groupId>com.wang</groupId>
            <artifactId>springbootService</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>

编写 Service 方法:
在这里插入图片描述

编写 Controller 层的方法,调用 Service 层的方法:

这块有的同学不能引入 Service 层中的类,麻烦把 Maven 进行配置。

在这里插入图片描述

package com.wang.controller;

import com.wang.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloController {

    @Autowired
    HelloService helloService;

    @RequestMapping("hello")
    @ResponseBody
    public String hello() {
        return helloService.hello();
    }

}

调用进行测试:

启动 Controller 层中的启动类。

在这里插入图片描述
成功,这下我们可以对工程进行模块解耦。

另外,父工程导入的依赖,子工程可以继承。

父工程导入 lombok 依赖包。

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

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

在这里插入图片描述
子工程中也会有。

欢迎留言!!!

热门文章

暂无图片
编程学习 ·

exe4j详细使用教程(附下载安装链接)

一、exe4j介绍 ​ exe4j是一个帮助你集成Java应用程序到Windows操作环境的java可执行文件生成工具&#xff0c;无论这些应用是用于服务器&#xff0c;还是图形用户界面&#xff08;GUI&#xff09;或命令行的应用程序。如果你想在任务管理器中及Windows XP分组的用户友好任务栏…
暂无图片
编程学习 ·

AUTOSAR从入门到精通100讲(126)-浅谈车载充电系统通信方案

01 引言 本文深入研究车载充电系统策略,设计出一套基于电动汽车电池管理系统与车载充电机的CAN通信协议,可供电动汽车设计人员参考借鉴。 02 电动汽车充电系统通讯网络 电动汽车整车控制系统中采用的是CAN总线通信方式,由一个整车内部高速CAN网络、内部低速CAN网络和一个充电…
暂无图片
编程学习 ·

CMake(九):生成器表达式

当运行CMake时&#xff0c;开发人员倾向于认为它是一个简单的步骤&#xff0c;需要读取项目的CMakeLists.txt文件&#xff0c;并生成相关的特定于生成器的项目文件集(例如Visual Studio解决方案和项目文件&#xff0c;Xcode项目&#xff0c;Unix Makefiles或Ninja输入文件)。然…
暂无图片
编程学习 ·

47.第十章 网络协议和管理配置 -- 网络配置(八)

4.3.3 route 命令 路由表管理命令 路由表主要构成: Destination: 目标网络ID,表示可以到达的目标网络ID,0.0.0.0/0 表示所有未知网络,又称为默认路由,优先级最低Genmask:目标网络对应的netmaskIface: 到达对应网络,应该从当前主机哪个网卡发送出来Gateway: 到达非直连的网络,…
暂无图片
编程学习 ·

元宇宙技术基础

请看图&#xff1a; 1、通过AR、VR等交互技术提升游戏的沉浸感 回顾游戏的发展历程&#xff0c;沉浸感的提升一直是技术突破的主要方向。从《愤怒的小鸟》到CSGO,游戏建模方式从2D到3D的提升使游戏中的物体呈现立体感。玩家在游戏中可以只有切换视角&#xff0c;进而提升沉浸…
暂无图片
编程学习 ·

flink的伪分布式搭建

一 flink的伪分布式搭建 1.1 执行架构图 1.Flink程序需要提交给 Job Client2.Job Client将作业提交给 Job Manager3.Job Manager负责协调资源分配和作业执行。 资源分配完成后&#xff0c;任务将提交给相应的 Task Manage。4.Task Manager启动一个线程以开始执行。Task Manage…
暂无图片
编程学习 ·

十进制正整数与二进制字符串的转换(C++)

Function one&#xff1a; //十进制数字转成二进制字符串 string Binary(int x) {string s "";while(x){if(x % 2 0) s 0 s;else s 1 s;x / 2;}return s; } Function two&#xff1a; //二进制字符串变为十进制数字 int Decimal(string s) {int num 0, …
暂无图片
编程学习 ·

[含lw+源码等]微信小程序校园辩论管理平台+后台管理系统[包运行成功]Java毕业设计计算机毕设

项目功能简介: 《微信小程序校园辩论管理平台后台管理系统》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 本系统包含微信小程序做的辩论管理前台和Java做的后台管理系统&#xff1a; 微信小程序——辩论管理前台涉及技术&#xff1a;WXML 和 WXS…
暂无图片
编程学习 ·

树莓派驱动DHT11温湿度传感器

1&#xff0c;直接使用python库 代码如下 import RPi.GPIO as GPIO import dht11 import time import datetimeGPIO.setwarnings(True) GPIO.setmode(GPIO.BCM)instance dht11.DHT11(pin14)try:while True:result instance.read()if result.is_valid():print(ok)print(&quo…
暂无图片
编程学习 ·

ELK简介

ELK简介 ELK是三个开源软件的缩写&#xff0c;Elasticsearch、Logstash、Kibana。它们都是开源软件。不过现在还新增了一个 Beats&#xff0c;它是一个轻量级的日志收集处理工具(Agent)&#xff0c;Beats 占用资源少&#xff0c;适合于在各个服务器上搜集日志后传输给 Logstas…
暂无图片
编程学习 ·

Linux 基础

通常大数据框架都部署在 Linux 服务器上&#xff0c;所以需要具备一定的 Linux 知识。Linux 书籍当中比较著名的是 《鸟哥私房菜》系列&#xff0c;这个系列很全面也很经典。但如果你希望能够快速地入门&#xff0c;这里推荐《Linux 就该这么学》&#xff0c;其网站上有免费的电…
暂无图片
编程学习 ·

Windows2022 无线网卡装不上驱动

想来 Windows2022 和 windows10/11 的驱动应该差不多通用的&#xff0c;但是死活装不上呢&#xff1f; 搜一下&#xff0c;有人提到 “默认安装时‘无线LAN服务’是关闭的&#xff0c;如果需要开启&#xff0c;只需要在“添加角色和功能”中&#xff0c;选择开启“无线LAN服务…
暂无图片
编程学习 ·

【嵌入式面试宝典】版本控制工具Git常用命令总结

目录 创建仓库 查看信息 版本回退 版本检出 远程库 Git 创建仓库 git initgit add <file> 可反复多次使用&#xff0c;添加多个文件git commit -m <message> 查看信息 git status 仓库当前的状态git diff 差异对比git log 历史记录&#xff0c;提交日志--pret…
暂无图片
编程学习 ·

用Postman生成测试报告

newman newman是一款基于nodejs开发的可以运行postman脚本的工具&#xff0c;使用Newman&#xff0c;可以直接从命令运行和测试postman集合。 安装nodejs 下载地址&#xff1a;https://nodejs.org/en/download/ 选择自己系统相对应的版本内容进行下载&#xff0c;然后傻瓜式安…
暂无图片
编程学习 ·

Java面向对象之多态、向上转型和向下转型

文章目录前言一、多态二、引用类型之间的转换Ⅰ.向上转型Ⅱ.向下转型总结前言 今天继续Java面向对象的学习&#xff0c;学习面向对象的第三大特征&#xff1a;多态&#xff0c;了解多态的意义&#xff0c;以及两种引用类型之间的转换&#xff1a;向上转型、向下转型。  希望能…