Gradle实战系列(一)__初体验
本系列文章主要目的并非要精通 Gradle ,而且是从应用的角度上,根据项目开发过程中,最经常用到的功能来说明如何从无到有建立自己的 Gradle 建构脚本。
必要条件
在使用 Gradle 之前,首先假设读者对于 Ant 及 Maven 已经有基本的认识并且有实际的使用经验
准备工作
- 安装 JDK ,在环境变量中设定 JAVA_HOME 。
- 下载 Gradle 压缩档,解压缩后在环境变量中设定 GRADLE_HOME 为解压缩后的文件夹路径,例如:C:\gradle-3.3,并且将 Gradle 安装目录中的 bin 文件夹加入环境变量的 Path 变量中,例如:C:\gradle-3.3\bin。
从无到有
首先建立工程资料夹 gradle_sample ,并且在该资料夹下执行初始化指令
gradle init
执行成功后,会在资料夹中产生基本的档案,其中 build.gradle 及 settings.gradle 这两个档案是主要的建构脚本
[gradle_sample]
├---[.gradle]
│ ├---[3.3]
│ ├---[taskArtifacts]
│ ├---fileHashes.bin
│ ├---fileSnapshots.bin
│ ├---taskArtifacts.bin
│ ├---taskArtifacts.lock
│
├---[gradle]
│ ├---[wrapper]
│ ├---gradle-wrapper.jar
│ ├---gradle-wrapper.properties
│
├---build.gradle
├---gradlew
├---gradlew.bat
├---settings.gradle
build.gradle
apply plugin: 'java'
repositories {
jcenter()
}
dependencies {
compile 'org.slf4j:slf4j-api:1.7.21'
testCompile 'junit:junit:4.12'
}
- apply plugin:表示执行过程将引入的插件
- repositories:表示执行过程中会从哪些仓库中寻找依赖的 jar 包
- dependencies:表示执行过程需要依赖的 jar 包
settings.gradle
rootProject.name = 'gradle_sample'
- rootProject.name:表示项目名称,也是建构完成后预设的包名
Hellow Gradle
执行下列命令建立代码的文件夹
mkdir src\main\java
在 src\main\java 就爱如第一支程序 Hello.java
public class Hello {
public static void main(String[] args) {
System.out.println("Hello Gradle");
}
}
Gradle 执行时透过命令列传入参数决定要执行哪些 task,一般重新建构整个工程至少会包含 clean 及 build 这两个 task
gradle clean build
建构过程中可以看到除了参数传入的两个 task 之外,实际上还执行了其他默认被依赖的 task
:clean
:compileJava
:processResources UP-TO-DATE
:classes
:jar
:assemble
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:check UP-TO-DATE
:build
BUILD SUCCESSFUL
Total time: 1.252 secs
执行成功后可以在 gradle_sample\build\libs 这个路径下看到根据项目名称打包出来的 gradle_sample.jar
[gradle_sample]
├---[.gradle]
│ ├---[3.3]
│ ├---[taskArtifacts]
│ ├---fileHashes.bin
│ ├---fileSnapshots.bin
│ ├---taskArtifacts.bin
│ ├---taskArtifacts.lock
│
├---[build]
│ ├---[classes]
│ │ ├---[main]
│ │ ├---Hello.class
│ │
│ ├---[libs]
│ │ ├---gradle_sample.jar
│ │
│ ├---[tmp]
│ │ ├---[compileJava]
│ │ │ ├---[emptySourcePathRef]
│ │ │
│ ├---[jar]
│ ├---MANIFEST.MF
│
├---[gradle]
│ ├---[wrapper]
│ ├---gradle-wrapper.jar
│ ├---gradle-wrapper.properties
│
├---build.gradle
├---gradlew
├---gradlew.bat
├---settings.gradle
还记得在 Hello.java 中有一个 main 方法,我们可以透过修改 build.gradle,加入一个task,让 Gradle 自动帮我们执行这个 main 方法
task run(type: JavaExec, dependsOn: 'build') {
classpath = sourceSets.main.runtimeClasspath
if(project.hasProperty('mainClass')){
main = "${project.getProperty('mainClass')}"
}
doFirst {
println "===== run begin"
}
doLast {
println "===== run end"
}
}
这是一个类型为 JavaExec 的 task, task 名称为 run,是依赖于 build 之后执行的,在 task 主体中设定了 classpath, mainClass 参数表示带有 main 方法的完整类名,透过 -P 可以将 mainClass 参数传入 Gradle 执行, doFirst 及 doLast 可以在 task 执行前/后执行其他动作
gradle run -PmainClass=Hello
从执行结果中可以看出来, run 是在原本的 build 之后才执行的
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:jar UP-TO-DATE
:assemble UP-TO-DATE
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:check UP-TO-DATE
:build UP-TO-DATE
:run
===== run begin
Hello Gradle
===== run end
BUILD SUCCESSFUL
Total time: 1.227 secs
设定包名及版本号
前面提到 rootProject.name 是预设的包名,在 build.gradle 透过 archivesBaseName 可以另外指定包名,同时透过设定 version 来指定版本号
archivesBaseName = 'sample.hello'
version = '1.0-SNAPSHOT'
重新执行后可以发现 jar 包名变成 sample.hello-1.0-SNAPSHOT.jar,除此之外也可以在 build.gradle 里面透过修改执行 build 时包含的 task jar 来设定包名及版本号
jar {
baseName = 'sample.hello'
version = '1.0-SNAPSHOT'
}
以上是本文对 Gradle 的基本介绍,可以由此下载 build.gradle