Gradle(四)Maven 项目迁移 Gradle 项目实践

目录

    • 一、迁移背景
      • [1.1 迁移原因](#1.1 迁移原因)
      • [1.2 项目背景](#1.2 项目背景)
    • 二、迁移步骤
      • [2.1 方式一:使用 `gradle init` 命令](#2.1 方式一:使用 gradle init 命令)
      • [2.2 方式二:手动迁移](#2.2 方式二:手动迁移)
        • [1)创建 Gradle 构建文件(build.gradle、settings.gradle)](#1)创建 Gradle 构建文件(build.gradle、settings.gradle))
        • [2)移除 Maven 配置文件](#2)移除 Maven 配置文件)
        • 3)验证构建功能

一、迁移背景

1.1 迁移原因

最近嫌弃 项目编译比较慢,又听说 Gradle 构建速度会比 Maven 快很多(官方的说法是至少快2倍),于是萌生了将已有项目的 Maven 编译,迁移到 Gradle 编译的想法。当然,万事开头难,所以我决定先从一个 Demo 项目开始入手。

1.2 项目背景

  1. 项目基本信息:
  • 项目名称:springboot-demo
  • 版本:0.0.1-SNAPSHOT
  • Java版本:1.8
  1. 目录结构:
nginx 复制代码
springboot-demo/
├── .gitignore                     # Git忽略文件配置
├── pom.xml                        # Maven项目配置文件
├── README.md                      # 项目说明文档
└── src/
    ├── main/                      # 主要源代码目录
    │   ├── java/
    │   │   └── com/
    │   │       └── demo/
    │   │           ├── SpringbootDemoApplication.java  # 应用启动类
    │   │           ├── Example.java                    # 示例类
    │   │           ├── common/
    │   │           │   └── Result.java                # 通用响应类
    │   │           └── controller/
    │   │               └── DemoController.java        # 示例控制器
    │   └── resources/
    │       └── application.properties                 # 应用配置文件
    └── test/                      # 测试源代码目录
        └── java/
            └── com/
                └── demo/
                    └── SpringbootDemoApplicationTests.java  # 测试类

最外层文件内容如下所示:

  1. Maven依赖:
  • Spring Boot Web Starter (spring-boot-starter-web)
  • Spring Boot Test Starter (spring-boot-starter-test)
  • Lombok
  • FastJSON (1.2.78)
  • Commons Codec (1.11)
  • Commons IO (2.16.1)

pom.xml 内容如下:

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>
    <groupId>com.example</groupId>
    <artifactId>springboot-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-demo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.4.5</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
            <version>1.18.20</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <version>2.4.5</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.78</version>
        </dependency>

        <!-- 加解密工具包 -->
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.11</version>
        </dependency>

        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.16.1</version>
        </dependency>

    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.4.5</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <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>

二、迁移步骤

2.1 方式一:使用 gradle init 命令

  • Gradle 官方非常贴心的内置了插件,可以一键将 Maven 的 pom.xml 转换为 Gradle 配置,只需要在项目目录内执行如下命令:

    shell 复制代码
    gradle init

​ 执行结果:

​ 迁移后目录:

  • 优点: 使用 gradle init 命令这种方式简单便捷;
  • 缺点: 适用范围却非常有限。如果 pom.xml 中包含 <parent><dependencyManagement> 这种依赖管理内容,gradle init 是不支持转换的。

2.2 方式二:手动迁移

顾名思义,手动迁移就是需要手动根据依赖内容进行逐一 pom.xmlbuild.gradle 的转换。这种方式就比较考验开发者对于 Maven 和 Gradle 这两种构建工具的了解程度了。

整体包括三个迁移步骤:

  1. 创建Gradle构建文件 :编写build.gradlesettings.gradle文件,迁移项目配置和依赖声明。
  2. 清理Maven配置 :删除原有的pom.xml及Maven相关文件(如mvnw)。
  3. 验证构建功能 :执行gradle build等命令,确保项目正常编译、测试和运行。
1)创建 Gradle 构建文件(build.gradle、settings.gradle)

build.gradle 配置:

groovy 复制代码
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'org.springframework.boot:spring-boot-gradle-plugin:2.4.5'
    }
}

apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    // Spring Boot starters
    implementation 'org.springframework.boot:spring-boot-starter-web'

    // 开发工具
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'

    // 工具库
    implementation 'com.alibaba:fastjson:1.2.78'
    implementation 'commons-codec:commons-codec:1.11'
    implementation 'commons-io:commons-io:2.16.1'

    // 测试依赖
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'org.junit.jupiter:junit-jupiter-api'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
}

test {
    useJUnitPlatform()
}

bootJar {
    enabled = true
    archiveClassifier = ''
}

jar {
    enabled = false
}

settings.gradle 配置:

groovy 复制代码
rootProject.name = 'springboot-demo'

关键配置说明:

  1. 插件配置
    • spring-boot插件提供Spring Boot项目支持;
    • dependency-management插件用于管理依赖版本;
    • java插件提供Java项目基本功能。
  2. 项目基本信息
    • 保持与原来Maven项目相同的groupversion
    • 指定Java 1.8兼容性。
  3. 依赖管理
    • 使用implementation替代Maven的<dependency>
    • 开发时依赖使用compileOnlydevelopmentOnly
    • 注解处理器使用annotationProcessor
  4. 测试配置
    • 明确使用JUnit 5平台;
    • 保持与Maven相同的测试依赖。
2)移除 Maven 配置文件

迁移完成后,可以删除一下 Maven 特定文件:

  • pom.xml(主Maven配置文件)
  • .mvn/目录(如果有)
  • mvnwmvnw.cmd(Maven包装器脚本)
3)验证构建功能

在 IDEA 中,我们可以右键 build.gradle,选择 Link Gradle Project 进行关联。

关联之后,可能会出现一些报错,需要我们根据提示进行 Gradle 和 JDK 的版本调整:

在 Settings 中进行 Gradle 和相应 JDK 的配置,如下所示:

等待 Gradle 将依赖导入完毕。

如果过程中出现如下报错:

  • Cause: org.gradle.api.internal.artifacts.dsl.LazyPublishArtifact.<init>(Lorg/gradle/api/provider/Provider;)V

说明 gradle-wrapper.properties 与 Gradle 核心版本不一致,需要调整:

关联成功之后提示如下:

右侧 Gradle 刷新之后也能看到我们的项目了:

点击 IDEA 中的 Debug 按钮进行启动,可以看到控制台中已经启动成功了:

项目中存在如下接口:

java 复制代码
import com.demo.common.Result;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * <p> @Title DemoController
 * <p> @Description 测试控制器
 *
 * @author ACGkaka
 * @date 2021/11/5 9:34
 */
@RestController
@RequestMapping("/test")
public class DemoController {

    @GetMapping("/hello")
    public Result<Object> hello() {
        return Result.succeed("hello world");
    }
}

启动项目后,请求本地接口:http://localhost:8088/test/hello

请求结果如下所示:

迁移前后,项目的构建速度对比如下:

Maven 构建:(耗时 7 秒 743 毫秒)

Gradle 构建:(耗时 2 秒 410 毫秒)

速度提升:(1-2410/7743)* 100% = 68.88%

整理完毕,完结撒花~ 🌻

参考地址:

1.手把手,一步步教你将Maven项目迁移到Gradle,https://zhuanlan.zhihu.com/p/185013144