IDEA搭建Maven模塊化項目的實現

1.前言

為瞭更好地組織和管理項目代碼。通過將一個大型項目分解成多個模塊,每個模塊都可以獨立地編譯、測試和部署,從而提高項目的可維護性和可擴展性。多模塊項目,適用於一些比較大的項目,通過合理的模塊拆分,實現代碼的復用,便於維護和管理。尤其是一些開源框架,也是采用多模塊的方式,提供插件集成,用戶可以根據需要配置指定的模塊。

構建微服務項目,基本上會對模塊進行明確的劃分,比如:

  • 抽象定義公共代碼及工具類封裝進行引用
  • 業務代碼進行單獨定義模塊
  • 對外提供的接口服務單獨定義模塊
  • 不同功能系統不同模塊
  • ……

上面的拆分也並非絕對,隨著架構師對於項目結構的不同理解,可能會衍生出不同的模塊

本篇文章會詳細演示如何創建 SpringBoot 父子模塊的項目,針對部分知識點著重講解

2. 軟硬件環境

電腦: win10

創建項目工具: IDEA 2022.3

JDK 版本:JDK8

Maven版本: 3.6.1

3.項目搭建

3.1.創建 SpringBoot 父項目

1)首先打開 IDEA 工具,創建spring項目 ,點擊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。

Type: 分為四種不同的類型,日常我們選擇默認第一條就行,也就是 Maven Project

Language: 開發語言的話自然就是默認的 Java

Packaging: 打包方式,分為 War 包 和 Jar 包,這裡選擇 Jar 包

Java Version: 選擇 Java 的一個版本,再堅持 20 年的 JDK 1.8

Version: 當前項目的一個版本,SNAPSHOT 為快照的意思

開發時一般使用此類型,因為對於 Maven 倉庫的同步較為友好,有不同緯度的同步選擇

Name: 定義項目名稱

Description: 定義項目描述信息,幫助別人更好的瞭解項目

Package: 定義 main.java 目錄下的結構

3)選擇 SpringBoot 版本信息以及 Pom.xml 文件依賴組件

這裡選擇的 SpringBoot 版本是 2.7.1,jdk8對應2.*版本,點擊 Next 繼續進行創建項目

4)一個標準的 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. 驗證項目

在 Parent 項目 pom.xml中 dependencies 標簽中定義瞭 spring-boot-starter-web 依賴,直接使用 web 相關內容即可,直接可以運行

centerweb中創建 Controller 控制器

@RestController
public class DemoController {
     @RequestMapping("/ok")
    public String test() {   
        return "OK";
    }
}

啟動項目

啟動後端項目成功後,使用restfultool請求接口

參考

IDEA 最便捷創建 SpringBoot 父子 Module 項目

到此這篇關於IDEA搭建Maven模塊化項目的實現的文章就介紹到這瞭,更多相關IDEA搭建Maven模塊化項目內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: