本指南将指导你使用Gradle来构建一个简单的Java项目。
你需要的东西
- 大约15分钟
- 一个喜欢的文本编辑器或IDE
- JDK 6或更高版本
设置项目
首先,你要为Gradle建立一个Java项目来构建。为了保持对Gradle的关注,现在让这个项目尽可能的简单。
创建目录结构
在你选择的项目目录中,创建以下子目录结构;例如,在*nix系统上用mkdir -p src/main/java/hello
。
└── src
└── main
└── java
└── hello
在src/main/java/hello
目录下,你可以创建任何你想要的Java类。为了简单起见以及与本指南的其他部分保持一致,Spring建议你创建两个类:HelloWorld.java
和Greeter.java
。
src/main/java/hello/HelloWorld.java
package hello;
public class HelloWorld {
public static void main(String[] args) {
Greeter greeter = new Greeter();
System.out.println(greeter.sayHello());
}
}
src/main/java/hello/Greeter.java
package hello;
public class Greeter {
public String sayHello() {
return "Hello world!";
}
}
安装Gradle
现在你有了一个可以用Gradle构建的项目,你可以安装Gradle了。
强烈建议使用一个安装程序。
作为最后的手段,如果这些工具都不适合你的需要,你可以从 Gradle | Installation ,下载二进制文件。只有二进制文件是必需的,所以要寻找gradle- version -bin.zip的链接。(你也可以选择gradle- version -all.zip来获得源代码和文档以及二进制文件。)
将文件解压到你的电脑上,并将bin文件夹添加到你的路径中。
为了测试Gradle的安装,从命令行运行Gradle。
gradle
如果一切顺利,你会看到一条欢迎信息。
:help
Welcome to Gradle 6.0.1.
To run a build, run gradle <task> ...
To see a list of available tasks, run gradle tasks
To see a list of command-line options, run gradle --help
To see more detail about a task, run gradle help --task <task>
For troubleshooting, visit https://help.gradle.org
Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.0.1/userguide/command_line_interface.html#sec:command_line_warnings
BUILD SUCCESSFUL in 455ms
1 actionable task: 1 executed
你现在已经安装了Gradle。
了解Gradle能做什么
现在Gradle已经安装完毕,看看它能做什么。在你为项目创建build.gradle文件之前,你可以问它有哪些任务。
gradle tasks
你应该看到一个可用任务的列表。假设你在一个还没有build.gradle文件的文件夹中运行Gradle,你会看到一些非常初级的任务,如:。
:tasks
------------------------------------------------------------
Tasks runnable from root project
------------------------------------------------------------
Build Setup tasks
-----------------
init - Initializes a new Gradle build.
wrapper - Generates Gradle wrapper files.
Help tasks
----------
buildEnvironment - Displays all buildscript dependencies declared in root project 'gs-gradle'.
components - Displays the components produced by root project 'gs-gradle'. [incubating]
dependencies - Displays all dependencies declared in root project 'gs-gradle'.
dependencyInsight - Displays the insight into a specific dependency in root project 'gs-gradle'.
dependentComponents - Displays the dependent components of components in root project 'gs-gradle'. [incubating]
help - Displays a help message.
model - Displays the configuration model of root project 'gs-gradle'. [incubating]
outgoingVariants - Displays the outgoing variants of root project 'gs-gradle'.
projects - Displays the sub-projects of root project 'gs-gradle'.
properties - Displays the properties of root project 'gs-gradle'.
tasks - Displays the tasks runnable from root project 'gs-gradle'.
To see all tasks and more detail, run gradle tasks --all
To see more detail about a task, run gradle help --task <task>
Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.0.1/userguide/command_line_interface.html#sec:command_line_warnings
BUILD SUCCESSFUL in 477ms
1 actionable task: 1 executed
尽管这些任务是可用的,但在没有项目构建配置的情况下,它们并没有提供多少价值。随着你对build.gradle
文件的充实,一些任务将变得更加有用。当你向build.gradle
添加插件时,任务列表会增加,所以你偶尔会想再次运行tasks,看看有哪些任务可用。
说到添加插件,接下来你要添加一个插件来实现基本的Java构建功能。
构建Java代码
从简单的开始,在本指南开始时创建的<project folder>
中创建一个非常基本的build.gradle
文件。只给它一个行。
apply plugin: 'java'
构建配置中的这一行带来了巨大的力量。再次运行gradle tasks,你会看到新的任务加入到列表中,包括构建项目、创建JavaDoc和运行测试的任务。
你会经常使用gradle build任务。这个任务对代码进行编译、测试并组装成一个JAR文件。你可以像这样运行它。
gradle build
几秒钟后,"BUILD SUCCESSFUL "表示构建已经完成。
要看到构建工作的结果,请看一下build文件夹。在那里你会发现几个目录,包括这三个值得注意的文件夹。
- classes 。项目的编译后的.class文件。
- reports 。由构建产生的报告(如测试报告)。
- libs 。汇编的项目库(通常是JAR和/或WAR文件)。
classes文件夹中有编译Java代码时生成的.class文件。具体来说,你应该找到HelloWorld.class和Greeter.class。
在这一点上,该项目没有任何库的依赖,所以在依赖_cache文件夹中没有任何东西。
报告文件夹应该包含一份在项目上运行单元测试的报告。因为该项目还没有任何单元测试,该报告将是无趣的。
libs文件夹应该包含一个以项目的文件夹命名的JAR文件。再往下看,你会看到如何指定JAR的名称和它的版本。
声明依赖
简单的Hello World样本是完全独立的,不依赖任何额外的库。然而,大多数应用程序都依赖外部库来处理常见和/或复杂的功能。
例如,假设除了说 "Hello World!"之外,你还想让应用程序打印出当前的日期和时间。你可以使用本地Java库中的日期和时间设施,但你可以通过使用Joda Time库使事情变得更有趣。
首先,把HelloWorld.java改成这样。
package hello;
import org.joda.time.LocalTime;
public class HelloWorld {
public static void main(String[] args) {
LocalTime currentTime = new LocalTime();
System.out.println("The current local time is: " + currentTime);
Greeter greeter = new Greeter();
System.out.println(greeter.sayHello());
}
}
这里HelloWorld
使用Joda Time的LocalTime
类来获取和打印当前时间。
如果你现在运行gradle build
来构建这个项目,构建会失败,因为你没有在构建中声明Joda Time是一个编译依赖项。
对于初学者来说,你需要为第三方库添加一个源代码。
repositories {
mavenCentral()
}
repositories
块表明,构建应从Maven Central仓库解决其依赖关系。Gradle在很大程度上依赖Maven构建工具建立的许多约定和设施,包括使用Maven Central作为库的依赖源的选项。
现在我们已经为第三方库做好了准备,让我们来声明一些。
sourceCompatibility = 1.8
targetCompatibility = 1.8
dependencies {
implementation "joda-time:joda-time:2.2"
testImplementation "junit:junit:4.12"
}
通过dependencies
块,你为Joda Time声明了一个单一的依赖关系。具体来说,你要求(从右到左)joda-time库的2.2版本,在joda-time组中。
关于这个依赖的另一件事是,它是一个 "编译 "依赖,表明它应该在编译时可用(如果你正在构建一个WAR文件,包括在WAR的/WEB-INF/libs文件夹下)。其他值得注意的依赖关系类型包括。
-
implementation
。编译项目代码所需的依赖,但这些依赖将由运行代码的容器在运行时提供(例如,Java Servlet API)。 -
testImplementation
。用于编译和运行测试的依赖项,但在构建或运行项目的运行时代码时不需要。
最后,让我们为我们的JAR工件指定名称。
jar {
archiveBaseName = 'gs-gradle'
archiveVersion = '0.1.0'
}
jar
块指定了JAR文件的命名方式。在本例中,它将呈现gs-gradle-0.1.0.jar
。
现在,如果你运行gradle build
,Gradle应从Maven Central仓库解决Joda Time的依赖关系,构建就会成功。
用Gradle Wrapper构建你的项目
Gradle Wrapper是启动Gradle构建的首选方式。它包括一个用于Windows的批处理脚本和一个用于OS X和Linux的shell脚本。这些脚本允许你运行Gradle构建,而不需要在你的系统上安装Gradle。这曾经是添加到你的构建文件中的东西,但它已经被折叠到Gradle中,所以不再有任何需要。相反,你只需使用下面的命令。
$ gradle wrapper --gradle-version 6.0.1
这项任务完成后,你会注意到一些新文件。两个脚本在文件夹的根部,而包装器的jar和属性文件则被添加到一个新的gradle/wrapper
文件夹中。
└── <project folder>
└── gradlew
└── gradlew.bat
└── gradle
└── wrapper
└── gradle-wrapper.jar
└── gradle-wrapper.properties
Gradle Wrapper现在可以用来构建你的项目。把它添加到你的版本控制系统中,每个克隆你的项目的人都可以同样地构建它。它的使用方式与安装的Gradle版本完全相同。运行包装器脚本来执行构建任务,就像你之前做的那样。
./gradlew build
当你第一次为指定版本的Gradle运行包装器时,它会下载并缓存该版本的Gradle二进制文件。Gradle包装器文件被设计为提交到源码控制中,这样任何人都可以构建项目,而不必先安装和配置特定版本的Gradle。
在这个阶段,你将已经构建了你的代码。你可以在这里看到结果。
build
├── classes
│ └── main
│ └── hello
│ ├── Greeter.class
│ └── HelloWorld.class
├── dependency-cache
├── libs
│ └── gs-gradle-0.1.0.jar
└── tmp
└── jar
└── MANIFEST.MF
包括两个预期的Greeter
和HelloWorld
的类文件,以及一个JAR文件。快速浏览一下吧。
$ jar tvf build/libs/gs-gradle-0.1.0.jar
0 Fri May 30 16:02:32 CDT 2014 META-INF/
25 Fri May 30 16:02:32 CDT 2014 META-INF/MANIFEST.MF
0 Fri May 30 16:02:32 CDT 2014 hello/
369 Fri May 30 16:02:32 CDT 2014 hello/Greeter.class
988 Fri May 30 16:02:32 CDT 2014 hello/HelloWorld.class
类文件被捆绑起来。值得注意的是,尽管你把joda-time声明为一个依赖项,但这个库并不包括在这里。而且JAR文件也不能运行。
为了使这段代码可以运行,我们可以使用gradle的application
插件。把它添加到你的build.gradle
文件中。
apply plugin: 'application'
mainClassName = 'hello.HelloWorld'
然后你就可以运行该应用程序了
$ ./gradlew run
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:run
The current local time is: 16:16:20.544
Hello world!
BUILD SUCCESSFUL
Total time: 3.798 secs
捆绑依赖性需要更多的思考。例如,如果我们要构建一个WAR文件,这种格式通常与打包第三方依赖关系有关,我们可以使用gradle的WAR插件。如果你使用Spring Boot,并且想要一个可运行的JAR文件,spring-boot-gradle-plugin就相当方便了。在这个阶段,gradle对你的系统没有足够的了解来做出选择。但现在,这应该足以让你开始使用gradle。
为了总结本指南的内容,这里是完成的build.gradle
文件。
build.gradle
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'application'
mainClassName = 'hello.HelloWorld'
// tag::repositories[]
repositories {
mavenCentral()
}
// end::repositories[]
// tag::jar[]
jar {
archiveBaseName = 'gs-gradle'
archiveVersion = '0.1.0'
}
// end::jar[]
// tag::dependencies[]
sourceCompatibility = 1.8
targetCompatibility = 1.8
dependencies {
implementation "joda-time:joda-time:2.2"
testImplementation "junit:junit:4.12"
}
// end::dependencies[]
// tag::wrapper[]
// end::wrapper[]
这里嵌入了许多开始/结束注释。这使得我们有可能将构建文件中的部分内容提取到本指南中,以便进行上述的详细解释。你不需要在你的生产构建文件中使用它们。
总结
祝贺你!你现在已经创建了简单而有效的Gradle构建文件来构建Java项目。你现在已经创建了一个简单而有效的Gradle构建文件来构建Java项目。
另见
下面的指南可能也有帮助。
想写一个新的指南或对现有的指南做出贡献?请查看我们的贡献指南。