Bootstrap

Springboot创建Mave聚合工程(可灵活创建任意版本)

前言

请注意,从2022年第四季度发布的 Spring 6 框架开始,最低 Java 版本要求已提升至 JDK 17。Spring 6 对内部架构进行了重构,并将最低 Java 版本要求改为 JDK 17。同样,Spring Boot 3 也将要求最低 Java 版本为 JDK 17,同时spring官网上和 IntelliJ IDEA工具里创建项目已经下架了springboot2和jdk8系列。

尽管 JDK 17 和 Spring Boot 3 带来了众多新特性和性能提升,许多项目仍倾向于采用 JDK 8 和 Spring Boot 2。这主要归因于以下四点:

  • 高度的成熟与稳定:JDK 8 和 Spring Boot 2 经过时间的考验,展现出极高的成熟度与稳定性,为长期运行的企业级应用提供了坚实的基础。
  • 广泛的社区支持:它们拥有庞大的开发者社群,丰富的资源和广泛的第三方库及工具支持,为开发者带来了极大的便利。
  • 良好的兼容性与较低的迁移成本:与现有系统无缝对接,避免了高昂的迁移成本,包括代码重构、测试及人员培训等。
  • 性能满足需求:尽管 JDK 17 和 Spring Boot 3 在性能上有所提升,但 JDK 8 和 Spring Boot 2 的性能已足够应对大多数应用场景。

综上所述,JDK 8 + Spring Boot 2 凭借其无可比拟的成熟度、稳定性和广泛的社区支持,仍然是众多项目的首选。然而,对于新项目,建议考虑采用 JDK 21 + Spring Boot 3,特别是其引入的虚拟线程技术,将极大提升并发性能并简化多线程编程。但请注意,这项技术尚需市场的进一步验证且目前网上资料相对较少。对于老项目,则建议保持现状,以避免不必要的迁移风险。

本文将详细指导如何在 IntelliJ IDEA 中创建 Maven 聚合工程,并引入已停止官方发布的 Spring Boot 2 版本。Spring Boot 3 的工程创建步骤与此类似,读者可参照执行。

1 需要的环境与项目结构

环境说明:windows11、idea2023.3.8,maven3.6.3、openjdk8、springboot2.7.18

  1. idea2023.3.8官网地址:idea官网下载
  2. maven:windwos安装多版本Maven(图文详细版)
  3. openjdk:OracleJDK与OpenJDK的区别(附带win11下多版本jdk安装)
  4. SpringBoot官网:SpringBoot版本说明
jialiangkj-pet-common: 通用模块,项目中常用的一些工具类和公共类等。
jialiangkj-pet-pojo: 实体类模块,存放实体类对象,例如: BO、VO等对象。
jialiangkj-pet-mapper四: dao接口模块,专门存放操作数据库的dao接口。
jialiangkj-pet-service: 业务模块,进行业务逻辑的处理。
jialiangkj-pet-api: 控制器模块,用于页面请求api访问,

2 Idea新建Maven工程

浏览器打开springboot官网(环境说明里有),查看可选择的GA版本

image-20241104110340201

Spring Boot版本说明

  • GA版本
    • 含义:General Availability,即正式发布的稳定版本。
    • 特点:官方推荐,适合生产环境使用,已经经过充分测试和验证。
  • 其他版本标识
    • M版本:里程碑版本,开发周期的阶段性成果,可能包含未修复的bug或不稳定功能。
    • RC版本:候选版本,接近最终发布版本,已经经过大量测试和验证,但仍可能包含小调整。
    • SNAPSHOT版本:快照版本,处于开发阶段,用于持续集成和部署,可能包含未完成的新特性或修复。
  • 版本号命名规则
    • 使用三个整数表示:主版本号、次版本号和修订版本号。
    • 主版本号增加:API或框架行为不兼容改变,或重大新特性引入。
    • 次版本号增加:新特性引入,但API或框架行为兼容。
    • 修订版本号增加:bug修复或非破坏性修改。
    • 主版本号为偶数表示稳定版本,奇数表示开发版本。

Spring Boot的版本号及其相关标识对于选择合适的版本对项目开发至关重要。GA版本是稳定且推荐使用的版本,而其他版本标识则提供了关于版本稳定性和开发阶段的重要信息。

spring官方模版新建时无法选择旧版本创建

打开idea可以选择创建spring项目

image-20241103224318604

可以看到目前创建springboot新工程最低版本要求是3.2.11

image-20241103224436033

因为我们要创建springboot2.7.18版本,所以不选择上述创建方式,思路是先创建maven聚合工程,然后再引入springboot低版本的依赖

打开idea新建工程

image-20241103212156330

根据自己需要填写项目名称,保存路径等

image-20241103212422048

选择已有的jdk,此处选择spring官方推荐使用BellSoft Liberica JDK

image-20241103212549850

点击创建后选择this windows当前窗口打开项目工程

配置本地maven库

image-20241103213352420

根目录模块下鼠标右键添加api模块

image-20241103213605677

创建模块api模块

image-20241103213930132

添加common通用模块

image-20241103225316208

添加mapper模块

image-20241103225421889

添加pojo模块

image-20241103225446068

添加service模块

image-20241103225516673

添加模块完成后点击项目根目录模块的pom文件可以看到如下

image-20241103220302821

加入项目名称、项目地址、项目描述

<name>jialiangkj-pet-dev</name>
<url>htttp: gitte、github</url>
<description>佳良宠物商城后台</description>

加入输出为UTF-8编码模式,删除项目创建时多余的内容

<properties>
    <java.version>1.8</java.version>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>

加入一些聚合工程描述说明

    <!--
        1. 聚合工程里可以分为顶级项目(顶级工程、父工程)与子工程,这两者的关系其实就是父子继承的关系
        子工程在maven里称之为模块(module),模块之间是平级,是可以相互依赖的。
        2. 子模块可以使用顶级工程里所有的资源(依赖),子模块之间如果要使用资源,必须构建依赖(构建关系)
        3. 一个顶级工程是可以由多个不同的子工程共同组合而成。
    -->

完成以上步骤后pom文件

image-20241104011458680

3 SpringBoot引入并测试

添加springboot依赖管理,一般在中大型项目中会选择使用做版本依赖管理,具体作用如下

<dependencyManagement> 用于集中管理依赖的版本和其他配置信息,避免在多个模块中重复定义相同的依赖版本。具体作用如下:

  1. 集中管理依赖版本:在父 POM 中定义依赖版本,子模块直接继承,无需重复定义。
  2. 提供默认配置:为依赖提供默认的配置信息,如版本、范围、类型等。
  3. 避免版本冲突:确保整个项目的依赖版本一致,减少潜在的兼容性问题。

这样做的好处是,当需要更新依赖版本时,只需在父 POM 中修改一次,所有子模块都会自动使用新的版本,确保项目各子模块版本依赖一致。

添加版本号信息值,自己的软件版本号此处我写1.0.0,值随意自己用,springboot版本号2.7.18

<properties>
    <jialiangkj-pet-dev.version>1.0.0</jialiangkj-pet-dev.version>
    <spring-boot.version>2.7.18</spring-boot.version>
</properties>

添加springboot依赖项,和项目构建

<dependencyManagement>
    <dependencies>
        <!-- SpringBoot的依赖配置-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${spring-boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

    </dependencies>
</dependencyManagement>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.6.1</version>
            <configuration>
                <source>${java.version}</source>
                <target>${java.version}</target>
                <encoding>${project.build.sourceEncoding}</encoding>
            </configuration>
        </plugin>
    </plugins>
</build>

image-20241103224808397

加入环境配置,local、dev、prod分别对应本地环境、开发环境、生成环境,这里默认是开发环境,任意在pom文件下添加即可

可用于配置application在不同环境时的启动选择和对应的日志级别(可根据自己需要增加或减少配置环境)

    <profiles>
        <profile>
            <id>local</id>
            <properties>
                <!-- 环境标识,需要与配置文件的名称相对应 -->
                <profiles.active>local</profiles.active>
                <logging.level>info</logging.level>
            </properties>
        </profile>
        <profile>
            <id>dev</id>
            <properties>
                <!-- 环境标识,需要与配置文件的名称相对应 -->
                <profiles.active>dev</profiles.active>
                <logging.level>info</logging.level>
            </properties>
            <activation>
                <!-- 默认环境 -->
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <profile>
            <id>prod</id>
            <properties>
                <profiles.active>prod</profiles.active>
                <logging.level>warn</logging.level>
            </properties>
        </profile>
    </profiles>

添加代码更新依赖后,会看到环境选择

image-20241103225753409

在common的pom文件里添加springboot-web的依赖

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

image-20241103230744523

然后给各模块添加逐级依赖关系,api->service->mapper->pojo->common,按照此依赖关系分别在pom文件里进行添加依赖关系

api模块,除了引用service模块外还需要添加项目构建

<dependencies>
    <dependency>
        <groupId>cn.com.jialiangkj</groupId>
        <artifactId>jialiangkj-pet-service</artifactId>
        <version>1.0-SNAPSHOT</version>
        <scope>compile</scope>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>${maven-plugins.version}</version>
            <configuration>
                <source>${java.version}</source>
                <target>${java.version}</target>
                <encoding>${project.build.sourceEncoding}</encoding>
            </configuration>
        </plugin>
    </plugins>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <!-- 关闭过滤 -->
            <filtering>false</filtering>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
            <!-- 引入所有 匹配文件进行过滤 -->
            <includes>
                <include>application*</include>
                <include>bootstrap*</include>
                <include>banner*</include>
            </includes>
            <!-- 启用过滤 即该资源中的变量将会被过滤器中的值替换 -->
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

service模块

<dependencies>
    <dependency>
        <groupId>cn.com.jialiangkj</groupId>
        <artifactId>jialiangkj-pet-mapper</artifactId>
        <version>1.0-SNAPSHOT</version>
        <scope>compile</scope>
    </dependency>
</dependencies>

mapper模块

<dependencies>
    <dependency>
        <groupId>cn.com.jialiangkj</groupId>
        <artifactId>jialiangkj-pet-pojo</artifactId>
        <version>1.0-SNAPSHOT</version>
        <scope>compile</scope>
    </dependency>
</dependencies>

pojo模块

<dependencies>
    <dependency>
        <groupId>cn.com.jialiangkj</groupId>
        <artifactId>jialiangkj-pet-common</artifactId>
        <version>1.0-SNAPSHOT</version>
        <scope>compile</scope>
    </dependency>
</dependencies>

分别添加对应的依赖,记得添加坐标后点一下右上角的maven更新不然会无效

image-20241103231830828

依赖下载完毕后在api模块新建application.yml、application-local.yml、application-dev.yml、application-prod.yml

其中application.yml配置如下

# app访问端口号  约定:8090
server:
  port: 8090
  max-http-header-size: 8KB  # 设置HTTP头的最大大小
  tomcat:
    max-connections: 2000  # 设置Tomcat的最大连接数
    max-threads: 200 # 最大线程数
    max-http-form-post-size: 2MB  # 设置表单POST请求的最大大小
    uri-encoding: UTF-8
    connection-timeout: 10000 # 连接超时时间,单位是毫秒

image-20241103225933976

查看API模块下的依赖,可以看到已经按层级添加成功

image-20241103232245342

在api模块下添加springboot启动应用

package cn.com.jialiangkj;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class);
    }
}

image-20241103232548147

新建一个controller包,存放http请求的控制器

image-20241103233220561

在其下新添加一个名为TestController的控制器类

image-20241103233729934

添加如下测试代码

package cn.com.jialiangkj.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test")
public class TestController {

    @GetMapping("/hello")
    public String hello(){
        return "Hello World!";
    }
}

image-20241104105018393

在根目录工程点击,install安装各模块

image-20241104105319017

鼠标右键点击运行Application启动应用程序

image-20241104105356998

应用启动成功
image-20241104105504207

打开浏览器输入:localhost:8090/test/hello,可以看到已经正常返回Hello World

image-20241104105704217

4 聚合工程测试

在service模块下添加servcie和impl包

image-20241104111426973

在service下添加一个TestService接口,如果包关系已经折叠可以选择展开新增

image-20241104111336169

在TestService下添加以下测试代码

package cn.com.jialiangkj.service;

public interface TestService {
    public String helloTest();
}

image-20241104121238113

在impl包下新建一个TestServiceImpl实现类,用于实现TestService接口里的方法

package cn.com.jialiangkj.service.impl;

import cn.com.jialiangkj.service.TestService;
import org.springframework.stereotype.Service;

@Service
public class TestServiceImpl implements TestService {
    @Override
    public String helloTest() {
        return "helloTest: hello world!";
    }
}

image-20241104121248088

返回api模块找到之前创建的TestController控制器,添加测试代码

@Autowired
private TestService testService;

@GetMapping("/helloTest")
public String helloTest(){
    return testService.helloTest();
}

image-20241104121313013

点击install安装模块后,再重新运行Application

注意:一定要重新install后才能重新运行程序,否则模块代码依赖没安装上运行会报错或者没效果。

image-20241104121529314

打开浏览器输入:http://localhost:8090/test/helloTest

可以看到已经正常加载到对应接口里引入的service代码,至此maven搭建springboot聚合工程已经完成。

image-20241104121804082

5 springboot3版本引入

springboot3官方建议最低需要jdk17,所以在引入之前请确保自己电脑的环境变量里已经加载了jdk17或以上版本。

示例环境:idea2023.3.8、opendjk21、springboot3.2.11、maven3.9.9

为了方便,我们把上面已经完成的spring2.7.18项目工程,复制一份修改jdk和maven环境和springboot版本号即可。

修改jdk版本,打开ide的项目设置

注意此处需要本机环境变量切换到jdk21具体请参考 章节1 需要的环境与项目结构 有openjdk多版本安装和切换教程。

image-20241104151302091

项目工程设置为jdk21

image-20241104151345445

image-20241104151456136

image-20241104151517850

打开设置把编译环境设置为jdk21

image-20241104151604088

image-20241104151631321

修改maven版本和仓库路径,打开idea进入settings设置

注意此处需要本机环境变量切换到maven3.9.9具体请参考 章节1 需要的环境与项目结构 有maven多版本安装和切换教程。

image-20241104151604088 image-20241104151723118

确认jdk版本是否已经选为21,如果没有则自行选择与环境变量匹配的jdk版本

image-20241104151822898

image-20241104151842345

修改完毕后,找到根目录下的pom文件,修改maven的版本依赖

<spring-boot.version>3.2.11</spring-boot.version>
<java.version>21</java.version>
<maven-plugins.version>3.9.0</maven-plugins.version>

image-20241104152054892

image-20241104152141927

为了方便我们测试查看效果,把api模块下的application端口号修改为9091

image-20241104152322100

修改完毕后清除打包的依赖,重新安装各模块依赖

image-20241104152401793

启动运行application,可以看到此处已经使用springboot3.2.11和java21启动运行项目

image-20241104152433211

打开浏览器输入:http://localhost:9001/test/helloTest,可以查看到对应的访问效果

image-20241104132621152

6 不同环境启动项目

之前在上面创建工程时,我们引入了多环境的配置,他们分别对应着maven的编译环境和application对应环境的文件配置,关系如下图

image-20241104153112943

在application.yml文件里,我们还需要添加配置绑定启动文件,这样yaml就会读取根目录下profiles.active的值,由于我们在右侧勾选了dev,此处对应值是dev

# Spring配置
spring:
  profiles:
    active: @profiles.active@

image-20241104154911562

如果运行程序后报错,需要重新刷新maven依赖,或者检查根目录下的pom文件里资源过滤配置是否添加

image-20241104160113912

image-20241104161610959

配置完毕后,启动程序会按下图1、2步骤执行

image-20241104153441492

可以看到启动程序后端口已经安装dev下设置运行

image-20241104161721151
在实际项目开发中,可根据项目需要灵活设置本地环境、开发环境、生产环境的配置项

;