Gradle實戰及Maven專案遷移採坑記錄

lwtxzwt發表於2020-12-21

最近準備把專案從maven遷移到gradle。由於之前也沒接觸過gradle,中途也遇到了一些坑,這裡記錄一下供後來者參考,適合gradle新手小白參考。後續如果有其他gradle相關問題也會繼續更新。
這裡的版本採用的是6.7。環境安裝參考官方文章,通過gradle -version 判斷環境是否正確。

如何使用全域性引數

在gradle.properties中可以定義全域性引數,如以下:

springBootVersion=2.3.6.RELEASE

在build.gradle中通過${xxx}引用:

...
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
...

父子專案工程如何定義

這裡定義了一個demo-core,目錄結構如下:

/demo-core
	/demo-core-common
		build.gradle
	/demo-core-service
		build.gradle
	build.gradle
	settings.gradle
	gradle.properties

在setting.gradle中定義子專案包名

rootProject.name = 'demo-core'
include 'demo-core-common'
include 'demo-core-service'

在頂層的build.gradle可以通過subprojects,設定全域性子專案的配置

subprojects {
    apply plugin: 'java'
    apply plugin: 'idea'

    group = 'com.lwtxzwt'
    version = '1.0.0-SNAPSHOT'
    sourceCompatibility = 11
    targetCompatibility = 11

    repositories {
        mavenLocal()
        maven { url 'http://xxx.xxx.xxx/repository/maven-public/' }
        mavenCentral()
    }

    jar {
        enabled = true
    }
    
    tasks.withType(JavaCompile) {
        options.encoding = 'UTF-8'
    }
}

如何上傳到私服倉庫

這裡我們需要將demo-core-common打包上傳到私服倉庫,配置demo-core-common目錄下的build.gradle

apply plugin: 'java'
apply plugin: 'maven'

uploadArchives {
    repositories {
        def nexusUrl = '這裡配置maven的倉庫'
        mavenDeployer {
            def releasesRepoUrl = "$nexusUrl/repository/maven-releases/"
            def snapshotsRepoUrl = "$nexusUrl/repository/maven-snapshots/"
            repository(url: version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl) {
                authentication(userName: "$mavenUser", password: "$mavenPassword")
            }
        }
    }
}

這樣在gradle的task中就會出現upload,也可以通過upload命令上傳。
在這裡插入圖片描述

如何在service中依賴common的jar

我們需要在demo-core-service中依賴demo-core-common的jar包,配置demo-core-service

dependencies {
    implementation project(':demo-core-common')
	...
}

外部依賴更新後,本地未生效

當外部依賴的程式碼更新後,本地未生效。這是由於gradle存在快取機制,需要關閉快取機制,或者刪除本地jar包,才會觸發更新。這裡將快取期限設定為0,每次執行都會重新下載依賴。

configurations.all {
    resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
}

implementation和api的區別

implementation 表示依賴,即只依賴不打包進來。個人理解有點類似maven中的optional設定為true。
api 表示打包,即不僅依賴還打包進來,這樣上層就不用重複依賴。

compileOnly編譯時可用

compileOnly 表示編輯時用,即不參與打包。最經典的例子就是lombok,一般配合annotationProcessor使用。
annotationProcessor 表示用於註解處理器的依賴配置。不太常用,目前只在lombok中用到。

dependencies {

    compileOnly 'org.projectlombok:lombok:1.18.16'
    annotationProcessor 'org.projectlombok:lombok:1.18.16'

}

gradle外掛

類似maven的外掛,gradle也提供了很多基礎功能外掛。

  • 做maven上傳到私服時,我們就用了maven的外掛’maven’。
  • 當應用’io.spring.dependency-management’外掛的時候,Spring Boot外掛將自動從使用的Spring
    Boot版本匯入spring-boot-dependencies,你可以省略bom中宣告依賴的版本號。
  • 對於IDE的外掛’idea’或者’eclipse’等。

其他更多外掛可以到官方查閱:https://plugins.gradle.org

相關文章