[Spring官方教程] - 用Gradle构建Java项目

本指南将指导你使用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.javaGreeter.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

包括两个预期的GreeterHelloWorld的类文件,以及一个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项目。

另见

下面的指南可能也有帮助。

想写一个新的指南或对现有的指南做出贡献?请查看我们的贡献指南


原文:Getting Started | Building Java Projects with Gradle