1、序言
本文以将在参照ruoyi若依系统代码架构的基础上进行优化,执行VSCode+Gradle+Springboot多模块的项目搭建实践,成不成也就讲究着看吧,我们暂且命名为JoJava。掌握本文后,您可以轻松对MAVEN下的多模块JAVA项目迁移到Gradle下。虽然本文以VSCode作为开发工具,但核心代码同样适用于IntelliJ IDEA+Gradle环境。网上很多的类似内容似乎不够完整或过于繁琐。
相关代码将持续更新到以下JoJava代码块仓库,免费开放给大家:jojava: 一些常用的java代码块集合https://gitee.com/duihao/jojava
本文开发环境:
OpenJDK21、Spring Boot 3.1.5、Gradle8.4、Visual Studio Code 1.8.3
最终搭建后将形成以下多模块SpringBoot项目代码结构:
JoJava
│
├── app
│ ├── build.gradle
│ └── src
├── common
│ ├── build.gradle
│ └── src
├── framework
│ ├── build.gradle
│ └── src
├── generator
│ ├── build.gradle
│ └── src
├── quartz
│ ├── build.gradle
│ └── src
├── system
│ ├── build.gradle
│ └── src
├── ui
│ ├── build.gradle
│ └── src
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
2、创建根项目工程
在VSCode下使用Ctrl+Shift+P快捷键创建项目 -> 选择 “Spring Initializr: Create a Gradle Project...”创建Spring项目。依次选择 Springboot 版本(3.1.5)、输入项目包组名 Group Id(com.jojava)、项目ID(jojava)等之后,创建一个新项目。
创建项目步骤按提示依次执行选择即可,如果您需要详细了解创建项目的步骤细节,请参考系列讲座的另一篇文章《JAVA新实战1:使用vscode+gradle+openJDK21搭建java springboot3项目开发环境》。
默认创建的项目为单模块结构,多模块项目下根目录下不存在src,这里把默认生成的src目录直接删除,然后执行后续操作。
3、根项目工程build.gradle
针对默认创建的单模块项目,我们受限需要通过修改根配置build.gradle来让项目具备多模块基本能力,本步骤是整个项目改造为多模块模式的关键。
请参考以下配置内容修改,其中jdk版本号需要与您的安装环境匹配:
plugins {
id 'java'
id 'org.springframework.boot' version '3.1.5' apply false
id 'io.spring.dependency-management' version '1.1.3'
}
group = 'com.jojava'
version = '0.0.1-SNAPSHOT'
java {
sourceCompatibility = '21'
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
// 所有项目(主项目+子项目)配置
allprojects {
// 指定需要的插件
// 指定语言
apply plugin: 'java'
// 配置项目信息(继承主项目)
group group
version version
// 配置仓库
repositories {
//阿里
maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
//腾讯
//maven { url 'https://mirrors.cloud.tencent.com/nexus/repository/maven-public/' }
//华为
//maven { url 'https://developer.huawei.com/repo/' }
mavenCentral()
gradlePluginPortal()
mavenLocal()
}
}
// 子项目配置
subprojects {
// 子项目插入组件
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'java'
// 编译JDK版本
// sourceCompatibility = '21'
// 配置字符编码
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}
// 子项目引用依赖
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-elasticsearch'
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
}
tasks.named('test') {
useJUnitPlatform()
}
// 开启构建bootJar
tasks.bootJar {
enabled = true
}
// tasks.jar {
// enabled = true
// }
}
allprojects代码块:该代码块中的配置将适用于所有项目,包括根项目和所有子项目。可以在其中定义共享的配置和依赖项。
subprojects代码块:该代码块中的配置将只应用于子项目,而不包括根项目。可以在其中设置子项目独有的配置或覆盖allprojects中的配置,子项目能自动继承在这里配置的依赖。
特别注意:
在subproject对象内,apply 插件需要与默认创建的plugins保持一致。
比如,我这里默认生成的plugins如下
那么,对应apply配置结果如下:
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'java'
实际配置结果截图:
4、创建子项目
在当前主项目下,使用Ctrl+Shift+P快捷键创建项目 -> 选择 “Spring Initializr: Create a Gradle Project...”创建Java Spring子模块,各个步骤设置均与主项目保持一致,最后一步目录选择,请直接选主目录。
我这里先创建app、common两个子模块。创建后修改子模块的 build.gradle 配置,仅在子模块配置中保留,以下代码。
更改子项目资源目录下src/main/resources/ 配置为文件名为 application.yml(JAVA新实战系列教程中均推荐配置文件采用yml格式)。
这里注意在创建子项目之后,VSCode下不会自动被识别为JAVA模块结构,需要手动操作下,右键子项目目录,在弹出的菜单中选择“Add Folder to Java Source Path”即可,这样就可以方便创建class、包等java常用文件了。
5、根项目工程setting.gradle
这里需要在默认生成的基础之上增加对子项目的引用,以建立父子关系,内容如下:
6、Common子项目build.gradle
该项目为是全系统各项目工程的核心依赖项目,一般被其他项目依赖,而不依赖其他项目,其build.gradle内容极简,如下:
tasks.bootJar {
enabled = false //关闭
}
dependencies {
}
7、App子项目build.gradle
该项目为全系统入口启动项目,也是当前系统应用的主体打包输出项目,依赖多个子项目,这里以依赖 common项目为例,其build.gradle内容如下:
dependencies {
implementation project(':common')
}
8、编写Common模块代码
在Common项目下创建包config,然后创建JoConfig类,用于后面在App项目中进行调用测试。VSCode中的创建方式参考下图:
JoConfig类文件代码如下:
package com.jojava.config;
public class JoConfig {
/** 项目名称 */
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
9、编写App模块代码
在App项目下创建包controller,然后创建HomeController类,用于测试。
代码如下:
package com.jojava.app.controller;
import java.util.Map;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.jojava.common.config.JoConfig;
@RestController
public class HomeController {
/**
* @param model
* @return
*/
@RequestMapping("/home")
public String home(Map<String, Object> model) {
System.out.print("对号入座,容易实现!");
JoConfig joConfig = new JoConfig();
joConfig.setName("Duihao JoJava");
return joConfig.getName() + " - 对号入座,容易实现!";
}
}
从下面标记中可以看到,这里已经在App项目中成功引用Common项目下的类及方法,并实现了一个简单的web方式的调用方法编写。
10、App项目启动类设置
作为全系统的主体打包输出项目,必须要设置一个启动类,否则整个项目将没有启动入口,一般情况下在创建Java Spring Boot类型子项目时已自动生成。
若未自动生成过,请在 app下直接创建类AppApplication类文件,代码如下:
package com.jojava.app;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class AppApplication {
public static void main(String[] args) {
SpringApplication.run(AppApplication.class, args);
}
}
编辑Spring项目启动配置文件 application.yml,代码如下:
# 开发环境配置
server:
# 服务器的HTTP端口,默认为8080
port: 8081
servlet:
encoding:
charset: UTF-8
enabled: true
force: true
force-response: true
# 应用的访问路径
context-path: /
tomcat:
# tomcat的URI编码
uri-encoding: UTF-8
# 连接数满后的排队数,默认为100
accept-count: 1000
threads:
# tomcat最大线程数,默认为200
max: 800
# Tomcat启动初始化的线程数,默认值10
min-spare: 100
11、项目启动运行
方法1:使用Java Projects方式启动,点击下图中按钮
方法2:使用Gradle Projects方式启动,点击下图中按钮
12、查看运行结果
浏览器访问 http://127.0.0.1:8081/home 返回以下内容,表示成功。
13、结束语
网上找了很多种基于gradle的JAVA Spring Boot多模块项目教程,有各种各样的问题,且对VSCode支撑的教程几乎难找,本案已力求简单,并足够全面,在VSCode+gradle下的SpringBoot多模块项目架构实战经验。
本教程中只写了两个子项目,实际将结合对若依ruoyi系统的架构理解和优化进行补齐,并形成一个可复用的框架,相关代码将会随着系列教程的持续更新同步更新,大家也可以略过教程直接下载已写好的代码框架进行使用。
代码请去这里下载JoJava代码块:jojava: 一些常用的java代码块集合https://gitee.com/duihao/jojava