天天看點

SpringBoot+Gradle建構多子產品項目

SpringBoot+Gradle建構多子產品項目

1 概述

Gradle

由于建構速度比

Maven

快,且比

Maven

靈活,是以很多後端的應用都使用了

Gradle

進行建構,但一個問題是,

Gradle

的多子產品項目比較難建構,再加上

Gradle

的更新非常快,這就給建構一個多子產品

Gradle

項目造成了不少的困難。

基于此出發點,本文提供了兩種形式的使用

Gradle

建構的

Spring Boot

多子產品項目:

  • Java + Gradle

  • Kotlin + Gradle + Kotlin DSL

為了減少出現各種錯誤的機率,步驟做得非常詳細(多圖預警),文末也附上了源碼,下面就一起來看看吧。

2 環境

  • Gradle 6.8.2

  • Spring Boot 2.4.3

  • Kotlin 1.4.30

  • Open JDK 11

3

Java + Gradle

主要步驟:

  • 使用

    Spring Initializer

    建立項目
  • 修改

    build.gradle

  • 建立子產品
  • 編寫子產品
  • 運作
  • 測試

3.1 建立項目

直接使用

IDEA

提供的

Spring Initializer

即可,建構工具選擇

Gradle

SpringBoot+Gradle建構多子產品項目

依賴:

SpringBoot+Gradle建構多子產品項目

建構完成後删除

src

目錄,因為根目錄屬于管理子產品目錄不提供運作的應用:

SpringBoot+Gradle建構多子產品項目

3.2 修改

build.gradle

這是最複雜的一步,并且

Gradle

版本更新的話步驟可能會不一樣,首先在底部添加一個空的

subprojects

SpringBoot+Gradle建構多子產品項目

接着把

dependencies

以及

test

移動進去:

SpringBoot+Gradle建構多子產品項目

最後一步是,在

subprojects

開頭,添加插件

apply

,根據預設初始化建立的

plugins

,逐一添加。

比如這裡預設使用了三個插件:

SpringBoot+Gradle建構多子產品項目

apply

subprojects

中:

SpringBoot+Gradle建構多子產品項目

3.3 建立子產品

File -> New -> Module

SpringBoot+Gradle建構多子產品項目

輸入子產品名即可,這裡的例子是建立兩個子產品:

  • service

  • app

SpringBoot+Gradle建構多子產品項目
SpringBoot+Gradle建構多子產品項目

建立好後如圖所示:

SpringBoot+Gradle建構多子產品項目

完成建立之後,把兩個子產品中的

build.gradle

除了

repositories

之外的全部删去,僅保留

repositories

SpringBoot+Gradle建構多子產品項目
SpringBoot+Gradle建構多子產品項目

3.4 編寫子產品

3.4.1

service

子產品

首先建立包,根據根目錄中的

group

建立:

SpringBoot+Gradle建構多子產品項目
SpringBoot+Gradle建構多子產品項目

接着編寫一個叫

TestService

的帶

@Service

注解的類,裡面包含一個

test

方法:

SpringBoot+Gradle建構多子產品項目

同時修改

service

子產品的

build.gradle

,添加

bootJar

jar

選項:

bootJar{
    enabled = false
}

jar{
    enabled = true
}
           
SpringBoot+Gradle建構多子產品項目

3.4.2

app

同樣先根據根目錄的

group

建立包:

SpringBoot+Gradle建構多子產品項目

接着在

app

build.gradle

添加

service

子產品的依賴:

SpringBoot+Gradle建構多子產品項目

再建立啟動類以及一個

Controller

SpringBoot+Gradle建構多子產品項目

代碼如下:

package com.example;

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,args);
    }
}
           
package com.example.controller;

import com.example.service.TestService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class TestController {
    private final TestService service;
    @GetMapping("/test")
    public String test(){
        return service.test();
    }
}
           

3.5 運作

接下來就可以運作了,可以直接點選

Application

旁邊的綠色小三角:

SpringBoot+Gradle建構多子產品項目

或者從運作配置中選擇

Application

運作(

IDEA

自動建立的,原來的那個

DemoApplication

帶一個×是因為啟動檔案已經删除了,可以順便把該配置删除):

SpringBoot+Gradle建構多子產品項目

沒問題的話就可以成功運作了:

SpringBoot+Gradle建構多子產品項目

同時浏覽器通路

localhost:8080/test

會出現

test

字樣:

SpringBoot+Gradle建構多子產品項目

3.6 測試

在建立測試類之前,也需要先建立包,且需要確定包名與啟動類的包名一緻:

SpringBoot+Gradle建構多子產品項目

再建立測試類:

SpringBoot+Gradle建構多子產品項目
package com.example;

import com.example.service.TestService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class JavaTest {
    @Autowired
    private TestService service;
    @Test
    public void test(){
        System.out.println(service.test());
    }
}
           

接着進行測試:

SpringBoot+Gradle建構多子產品項目

這樣使用

Java

+

Gradle

建構一個多子產品的

Spring Boot

項目就成功了。

4

Kotlin + Gradle + Kotlin DSL

Kotlin DSL

在原生

Gradle

Groovy DSL

)的基礎上進行改進,但同時文法也變得更加陌生,難度是以也加大了不少,不過這并沒有難倒筆者。建構多子產品的基本步驟與上面類似:

  • Spring Initializer

  • build.gradle.kts

4.1 建立項目

選擇

Kotlin

Gradle

SpringBoot+Gradle建構多子產品項目
SpringBoot+Gradle建構多子產品項目

同樣删除

src

SpringBoot+Gradle建構多子產品項目

4.2 修改

build.gradle.kts

同樣在尾部添加一個空的

subprojects

SpringBoot+Gradle建構多子產品項目

dependencies

tasks

SpringBoot+Gradle建構多子產品項目
SpringBoot+Gradle建構多子產品項目

最後在

subprojects

開始處

apply

插件,根據預設的插件進行

apply

SpringBoot+Gradle建構多子產品項目
apply{
    plugin("io.spring.dependency-management")
    plugin("org.springframework.boot")
    plugin("org.jetbrains.kotlin.plugin.spring")
    plugin("org.jetbrains.kotlin.jvm")
}
           

plugins

中的

kotlin

org.jetbrains.kotlin

的簡寫,在

subprjects

中注意加上即可。

4.3 建立子產品

File -> New -> Module

,把一些必要選項勾選上:

SpringBoot+Gradle建構多子產品項目

這裡同樣建立兩個子產品:

  • app

  • service

SpringBoot+Gradle建構多子產品項目
SpringBoot+Gradle建構多子產品項目

同樣把兩個子產品中的

build.gradle.kts

删除其他部分留下

repositories

SpringBoot+Gradle建構多子產品項目

4.4 編寫子產品

4.4.1

service

首先根據根目錄的

build.gradle.kts

SpringBoot+Gradle建構多子產品項目
SpringBoot+Gradle建構多子產品項目

編寫

TestService

SpringBoot+Gradle建構多子產品項目

最後修改

build.gradle.kts

,加上

tasks.bootJar

tasks.jar

tasks.bootJar{
    enabled = false
}

tasks.jar{
    enabled = true
}
           
SpringBoot+Gradle建構多子產品項目

4.4.2

app

先建立包:

SpringBoot+Gradle建構多子產品項目

添加對

service

SpringBoot+Gradle建構多子產品項目

再建立一個啟動類以及一個

Controller

SpringBoot+Gradle建構多子產品項目
package com.example

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

@SpringBootApplication
class Application

fun main(args:Array<String>) {
    SpringApplication.run(Application::class.java,*args)
}
           
package com.example.controller

import com.example.service.TestService
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RestController

@RestController
class TestController {
    @Autowired
    lateinit var service: TestService
    @GetMapping("/test")
    fun test() = service.test()
}
           

4.5 運作

點選

main

旁邊的綠色小三角即可:

運作成功:

SpringBoot+Gradle建構多子產品項目

同樣可以通路

localhost:8080/test

SpringBoot+Gradle建構多子產品項目

4.6 測試

注意在編寫測試之前需要保證測試類與啟動類在同一個包下,也就是需要先建立包:

SpringBoot+Gradle建構多子產品項目
SpringBoot+Gradle建構多子產品項目
package com.example

import com.example.service.TestService
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest

@SpringBootTest
class KotlinTest {
    @Autowired
    lateinit var service: TestService
    @Test
    fun test(){
        println(service.test())
    }
}
           

直接點選小三角測試即可:

SpringBoot+Gradle建構多子產品項目

測試通過,這樣

Kotlin+Gradle+Kotlin DSL

的多子產品

Spring Boot

項目就算建立完成了。

5 總結

筆者在實踐的過程中也遇到了無數的錯誤,比如找不到類,或者

build.gradle

/

build.gradle.kts

檔案錯誤,幸好有萬能的搜尋引擎,幫筆者解決了錯誤,最後才成功寫下這篇文章。

總的來說,

Gradle

建立多子產品項目要比

Maven

要難,而且

Gradle

的更新速度很快,文法變化較大,相比之下

Maven

非常穩定,最新的

Maven 3.6.3

還是19年11月釋出的,然而

Gradle

都準備

7.0

了:

SpringBoot+Gradle建構多子產品項目
SpringBoot+Gradle建構多子產品項目

筆者建議,如果是真的需要使用

Gradle

,需要考慮一下團隊的狀況,畢竟上手難度要大于

Maven

,如果在

Gradle

建立多子產品的過程中遇到一些極其難以解決的問題,轉為

Maven

不失為一個好辦法。

6 源碼

附上兩個例子的源碼:

  • Github
  • 碼雲
  • CODE CHINA