Gradle

Published: by Creative Commons Licence

  • Tags:

Centos下载安装

利用SDKMAN安装。

先安装SDKMAN

> curl -s "https://get.sdkman.io" | bash
> source "$HOME/.sdkman/bin/sdkman-init.sh"
> sdk version

之后利用SDKMAN安装gradle。

> sdk install gradle 5.6.4
> gradle -v

入门项目

创建一个新项目。

mkdir basic-demo
❯ cd basic-demo

利用gradle初始化命令创建一个简单项目。所有选项都默认即可。

> gradle init

创建的项目目录结构为:

├── build.gradle  
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar  
│       └── gradle-wrapper.properties  
├── gradlew  
├── gradlew.bat  
└── settings.gradle  

创建一个新目录,添加一个任意文件

> mkdir src
> echo Hello, world! > src/myfile.txt

编辑build.gradle文件,向里面增加一个新的task。

task copy(type: Copy, group: "Custom", description: "Copies sources to the dest directory") {
    from "src"
    into "dest"
}

接下来用gradlew执行我们新加入的copy命令,它会把src目录下的文件拷贝到dest目录下。

> sh gradlew copy

接下来我们加入一个插件,在https://plugins.gradle.org/能找到许多gradle的插件。

build.gradle文件的首行加入下面内容。

plugins {
    id "base"
}

之后我们加入zip任务,它可以帮助我们打包。

task zip(type: Zip, group: "Archive", description: "Archives sources in a zip file") {
    from "src"
    setArchiveName "basic-demo-1.0.zip"
}

同样,执行以下命令,生成的文件为build/distributions/basic-demo-1.0.zip

> sh gradlew zip

我们可以用tasks任务查看我们现在可以执行的所有任务,包括预置的任务,自定义的任务,以及插件带来的任务。

> sh gradlew tasks

properties任务会告诉你你的项目的属性。

> sh gradlew properties

你可以在build.gralde文件中定义或者修改属性。

description = "A trivial Gradle build"
version = "1.0" 

入门java项目

创建目录。

> mkdir demo
> cd demo

之后初始化项目,这里我们要构建的是java-library。

> gradle init
Select type of project to generate:
  1: basic
  2: application
  3: library
  4: Gradle plugin
Enter selection (default: basic) [1..4] 3

Select implementation language:
  1: C++
  2: Groovy
  3: Java
  4: Kotlin
  5: Scala
  6: Swift
Enter selection (default: Java) [1..6] 3

Select build script DSL:
  1: Groovy
  2: Kotlin
Enter selection (default: Groovy) [1..2]

Select test framework:
  1: JUnit 4
  2: TestNG
  3: Spock
  4: JUnit Jupiter
Project name (default: demo):

init命令首先先执行wrapper任务,wrapper任务会生成gradlewgradlew.bat两个wrapper脚本,之后创建一个新的项目。

项目结构如下。

├── build.gradle
├── gradle
│   └── wrapper 
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
└── src
    ├── main
    │   └── java 
    │       └── demo
    │           └── Library.java
    └── test
        └── java 
            └── demo
                └── LibraryTest.java

build脚本中加入了java-library插件,这个插件是java-base插件的扩展,向其中加入了一些额外的任务来编译java源代码。

Library.java是一个样例源文件,LibraryTest.java是其对应的单元测试文件。这两个文件都是init任务生成的样例。

你可以用gradle来执行命令,也可以用wrapper来中转命令,一般来说,后者会更加好一些。

下面用build命令编译任务。

> sh gradlew build

第一次运行build任务的时候,gradle会检测依赖包是否已经存在本地~/.gradle目录下了,如果不存在,则会去远程仓库下载。

任务完成后,我们可以在build/libs目录下找到文件demo.jar文件。

> jar tf demo.jar

如果你想要JAR文件名称上带上版本号,你可以手动配置build文件中的version属性。

version = '0.1.0'

重新构建后你会发现生成的JAR文件名称变成了demo-0.1.0.jar

另外一个常见的需求就是自定义清单文件,比如加上一些属性。我们可以通过配置jar任务来实现这个能力。

jar {
    manifest {
        attributes('Implementation-Title': project.name,
                   'Implementation-Version': project.version)
    }
}

重新构建后就可以看到改变了。

java-library插件内置了对JAVA的API文档的支持,通过javadoc任务。

> sh gradlew javadoc

生成的javadoc文件位于目录build/docs/javadoc下。

java项目依赖

build文件中的dependencies代码块中声明了项目的依赖。而所有的依赖都会在repositories代码块中声明的仓库中查找。

dependencies {
    implementation 'org.hibernate:hibernate-core:3.6.7.Final'
    api 'com.google.guava:guava:23.0'
    testImplementation 'junit:junit:4.+'
}

依赖的类型三类:

  • implementation:依赖仅用于编译和内部使用。
  • api:依赖用于编译,同时会作为包的api暴露。
  • testImplementation:依赖用于执行测试代码。

gradle在仓库中查找依赖,每个仓库都是一个模块集合,通过groupnameversion进行组织。gradle能够区分不同的仓库类型,比如Maven和Ivy,并且支持以多种协议访问这些仓库。

默认情况下,gradle不会定义任何仓库,你需要在repositories代码块中定义至少一个仓库。你可以直接使用maven的官方仓库。

repositories {
    mavenCentral()
}

你也可以指定本地仓库。

repositories {
    ivy {
        // URL can refer to a local directory
        url "../local-repo"
    }
}

要发布你所编写的库,你需要告诉gradle要发布到哪里,你需要为uploadArchives任务声明仓库信息。

plugins {
    id 'maven'
}

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: "file://localhost/tmp/myRepo/")
        }
    }
}

现在你执行uploadArchives任务,gradle就会构建JAR文件,生成一个.pom文件,并上传到仓库中。

参考资料