参考环境
gradle 6.5.1 + jdk8
下载
https://gradle.org/next-steps/?version=6.5.1&format=bin
配置环境变量(略)
配置国内镜像
-
单个项目有效
build.gradle
repositories { // mavenCentral() maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' } }
-
全部项目有效
GRADLE_HOME/init.d/init.gradle
allprojects{ repositories { def ALIYUN_REPOSITORY_URL = 'https://maven.aliyun.com/repository/public/' def ALIYUN_JCENTER_URL = 'https://maven.aliyun.com/repository/jcenter/' def ALIYUN_GOOGLE_URL = 'https://maven.aliyun.com/repository/google/' def ALIYUN_GRADLE_PLUGIN_URL = 'https://maven.aliyun.com/repository/gradle-plugin/' all { ArtifactRepository repo -> if(repo instanceof MavenArtifactRepository){ def url = repo.url.toString() if (url.startsWith('https://repo1.maven.org/maven2/')) { project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_REPOSITORY_URL." remove repo } if (url.startsWith('https://jcenter.bintray.com/')) { project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_JCENTER_URL." remove repo } if (url.startsWith('https://dl.google.com/dl/android/maven2/')) { project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_GOOGLE_URL." remove repo } if (url.startsWith('https://plugins.gradle.org/m2/')) { project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_GRADLE_PLUGIN_URL." remove repo } } } maven { url ALIYUN_REPOSITORY_URL } maven { url ALIYUN_JCENTER_URL } maven { url ALIYUN_GOOGLE_URL } maven { url ALIYUN_GRADLE_PLUGIN_URL } } }
gradle项目结构
整体结构图
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
├── buildSrc
│ ├── build.gradle
│ └── src
│ └── main
│ └── groovy
│ ├── demo.java-application-conventions.gradle
│ ├── demo.java-common-conventions.gradle
│ └── demo.java-library-conventions.gradle
├── app
│ ├── build.gradle
│ └── src
│ ├── main
│ │ └── java
│ │ └── demo
│ │ └── app
│ │ ├── App.java
│ │ └── MessageUtils.java
│ └── test
│ └── java
│ └── demo
│ └── app
│ └── MessageUtilsTest.java
├── list
│ ├── build.gradle
│ └── src
│ ├── main
│ │ └── java
│ │ └── demo
│ │ └── list
│ │ └── LinkedList.java
│ └── test
│ └── java
│ └── demo
│ └── list
│ └── LinkedListTest.java
└── utilities
├── build.gradle
└── src
└── main
└── java
└── demo
└── utilities
├── JoinUtils.java
├── SplitUtils.java
└── StringUtils.java
项目有关文件
settings.gradle
//项目名称
rootProject.name = 'demo'
// 多个模块名称
include('app', 'list', 'utilities')
多个子项目共享构建逻辑和配置,使用约定插件buildSrc
buildSrc / src / main / groovy / demo.java-common-conventions.gradle
plugins {
// java插件,构建java项目的所有功能
id 'java'
}
repositories {
//存储库-外部依赖项的源
jcenter()
}
//标准依赖项
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.2'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
}
tasks.named('test') {
useJUnitPlatform()
}
buildSrc / src / main / groovy / demo.java-library-conventions.gradle
plugins {
id 'demo.java-common-conventions'
id 'java-library'
}
buildSrc / src / main / groovy / demo.java-application-conventions.gradle
plugins {
id 'demo.java-common-conventions'
id 'application'
}
子项目中的构建文件
app / build.gradle
plugins {
id 'demo.java-application-conventions'
}
dependencies {
implementation project(':utilities')
}
application {
mainClass = 'demo.app.App'
}
list / build.gradle
plugins {
id 'demo.java-library-conventions'
}
utilities/ build.gradle
plugins {
id 'demo.java-library-conventions'
}
dependencies {
api project(':list')
}
包含3块
-
每个脚本都包含1个plugins{}块来应用插件。
-
依赖关系:dependencies {}
依赖关系可以是外部的
也可以是子项目的,使用project(...)
-
一个或多个配置块,如application{}
build.gradle
buildSrc / build.gradle
plugins {
id 'groovy-gradle-plugin'
}
repositories {
gradlePluginPortal()
}
调用方式
命令行
初始化
运行tests
详情报告地址: /build/reports
执行全部模块的tests。
./gradlew check
指定模块的test
./gradlew :App:check
运行应用
执行mainClass指定的main方法
./gradlew run
备注:第一次执行打包脚本gradlew 会下载gradle版本到本地的~/.gradle/wrapper/dists,会有点延迟。
打包应用
包含命令行脚本和相关的依赖。
./gradlew build
生成的结果为:app/build/distributions/app.tarand
app/build/distributions/app.zip
发布Build Scan
./gradlew build --scan
会发布到https://scans.gradle.com/,浏览器查看详build详情。
IDE(idea)
配置
方式1:单独指定安装的gradle环境位置。
方式2:IDEA默认就会使用gradle wrapper来创建项目,所以无需安装gradle也可以正常运行。
gradle vs maven
-
更灵活:gradle与maven都提供了约定配置,但是maven比较僵化,gradle更灵活。maven是xml,gradle的.gradle文件本身是groovy脚本。
-
高性能:gradle构建时间更短。
增量构建(处理更改的文件);Build Cache(缓存构建的结果);Gradle Daemon(守护线程随时将构建信息热存储在内存)。
备注:gradle至少比maven快1倍,使用build Cache有可能快100倍。
-
用户体验好:随时更新
命令行工具:https://github.com/gradle/gradle-completion
基于Web的UI工具(也可以支持maven):https://scans.gradle.com/
-
依赖管理
maven的scope:compile(默认)、provided、test、runtime
gradle的scope:
- implementation(默认):编译和运行可见,但不会暴露在类库使用者的编译时。
- api:跟implementation一样,编译和运行可见,但会暴露给类库使用者。
- compileOnly和runtimeOnly:编译时可见和运行时可见。
- testImplementation:测试编译和测试运行时可见。
总结
- gradle可以初始生成JAVA项目
- 支持多模块项目
- 支持多模块间共享配置,约定插件buildSrc(convention plugins)
- 支持多项目执行同一个task,指定项目执行task
- 支持构建,bundle(打包),运行应用