第7章 Java Quickstart 快速开始 Java

最后更新于:2022-04-01 02:32:36

## 7.1\. The Java plugin 关于 Java 插件 Gradle 是一个通用的构建工具,它能构建任何基于你的构建脚本的东西。开箱即用,当然除非你添加代码到你的构建脚本里,不然它不会构建任何东西。 很多 Java 项目都有类似的基本流程:编译 Java 源文件,运行单元测试,创建 JAR 文件。如果你不是把代码从头写到尾,那还能接受。现在有了 Gradle 就不用忍受这些。解决问题的方法就是 插件。插件是 Gradle 配置的扩展,通常是添加配置前的 task。Gradle 装载很多插件,这样可以方便共享。其中,Java 插件 就是添加 task 到 project ,会编译、单元测试你的 Java 代码,并构建进一个 JAR 文件。 Java 插件 是基于约定的。这意味着,该插件定义了 项目 许多方面的的默认值,如 Java 源文件所在的位置。如果你跟随你的项目的约定,你一般不需要在你的构建脚本做太多。Gradle 允许您自定义您的项目,如果你不想或不遵循某种公约。事实上,因为 Java 项目的支持作为一个插件来实现的,你不需要使用所有的插件来构建一个Java项目,如果你不想。 后续章节,我们有许多案例关于 Java 插件、依赖管理、多 project。在这一章中,我们想给你一个初始的想法关于如何使用 Java 插件来构建一个 Java 项目。 ## [](https://github.com/waylau/Gradle-2-User-Guide/blob/master/Chapter%2007.%20Java%20Quickstart%20%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B%20Java.md#72-a-basic-java-project-基本的-java-项目)7.2\. A basic Java project 基本的 Java 项目 为了使用 Java 插件,添加下面代码到构建文件: Example 7.1\. Using the Java plugin build.gradle ~~~ apply plugin: 'java' ~~~ *注意,完整的项目源码见[https://github.com/waylau/Gradle-2-User-Guide-Demos](https://github.com/waylau/Gradle-2-User-Guide-Demos) 中 java/quickstart* 这个就是 定义一个 Java 项目的全部。它会将 Java 插件应用到项目中,并且添加很多 task。 Gradle 会在 src/main/java 目录下寻找产品代码,在 src/test/java 寻找测试代码 。 另外在 src/main/resources 包含了资源的 JAR 文件, src/test/resources 包含了运行测试。所有的输出都在 build 目录下,JAR 在 build/libs 目录下 ### [](https://github.com/waylau/Gradle-2-User-Guide/blob/master/Chapter%2007.%20Java%20Quickstart%20%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B%20Java.md#721-building-the-project-构建项目)7.2.1\. Building the project 构建项目 在 Java 插件增添了相当多的 task 在 project 中。然而,只有少数的task 是需要在 构建 project 时需要的。最常用的任务是 build task,这就能构建一个完整的 project 。当你运行 gradle build,Gradle 将编译和测试您的代码,并创建一个包含您的主要类和资源的 JAR 文件。 Example 7.2\. Building a Java project 执行 gradle build 输出 ~~~ > gradle build :compileJava :processResources :classes :jar :assemble :compileTestJava :processTestResources :testClasses :test :check :build BUILD SUCCESSFUL Total time: 1 secs ~~~ 其他有用的 task 有: **clean** 删除 build 目录,移除所有构建的文件 **assemble** 编译打包代码,但不运行单元测试。其他插件带给这个 task 更多特性,比如如果你使用 War 插件,task 将给 project 构建 WAR 文件 **check** 编译测试你的代码。其他插件带给这个 task 提供更多检查类型。比如,你使用 checkstyle 插件, 这个 task 建辉在你的代码中 执行 Checkstyle ### [](https://github.com/waylau/Gradle-2-User-Guide/blob/master/Chapter%2007.%20Java%20Quickstart%20%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B%20Java.md#722-external-dependencies-外部依赖)7.2.2\. External dependencies 外部依赖 Java 项目经常会有一些外部 JAR 的依赖。为了引用这些 JAR 文件,需要在 Gradle 里面配置。在 Gradle,类似与 JAR 文件将会放在 repository 中。一个 repository 可以被依赖的项目获取到,或者提交项目的拷贝到 repository 中,或者两者都可。比如,我们使用 Maven repository : Example 7.3\. Adding Maven repository build.gradle ~~~ repositories { mavenCentral() } ~~~ 我们添加一些依赖,声明了 编译时 需要的依赖和测试时需要的依赖 Example 7.4\. Adding dependencies build.gradle ~~~ dependencies { compile group: 'commons-collections', name: 'commons-collections', version: '3.2' testCompile group: 'junit', name: 'junit', version: '4.+' } ~~~ 详见[Chapter 8\. Dependency Management Basics 依赖管理的基础知识](https://github.com/waylau/Gradle-2-User-Guide/blob/master/Chapter%2008.%20Dependency%20Management%20Basics%20%E4%BE%9D%E8%B5%96%E7%AE%A1%E7%90%86%E7%9A%84%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86.md) ### [](https://github.com/waylau/Gradle-2-User-Guide/blob/master/Chapter%2007.%20Java%20Quickstart%20%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B%20Java.md#723-customizing-the-project-自定义-项目)7.2.3\. Customizing the project 自定义 项目 在 Java 插件添加属性到您的项目。这些属性通常足在启动时使用默认值。如果他们不适合你,你很容易改他们。让我们看一看我们的示例。在这里,我们将说明我们的 Java 项目的版本号,包括 Java 的版本号。我们也添加一些属性的 JAR 文件清单。 Example 7.5\. Customization of MANIFEST.MF build.gradle ~~~ sourceCompatibility = 1.5 version = '1.0' jar { manifest { attributes 'Implementation-Title': 'Gradle Quickstart', 'Implementation-Version': version } } ~~~ Java 插件添加的 task 和 平常的 task 完全一样,在构建文件中声明。这意味着你可以使用任何在前面的章节中自定义这些 task 的机制。例如,您可以设置 task 的性能,添加行为的一个任务,更改 task 的依赖,或替换完全的 task 。在我们的示例,我们将配置测试 task ,这是类型 [Test](http://www.gradle.org/docs/current/dsl/org.gradle.api.tasks.testing.Test.html) ,增加一个系统属性,当执行测试时: Example 7.6\. Adding a test system property build.gradle ~~~ test { systemProperties 'property': 'value' } ~~~ *有哪些属性存在?* *执行 gradle properties 可以列出 project 的属性,你可以看到 Java 插件添加的属性和他们的默认值* ### [](https://github.com/waylau/Gradle-2-User-Guide/blob/master/Chapter%2007.%20Java%20Quickstart%20%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B%20Java.md#724-publishing-the-jar-file-发布-jar-文件)7.2.4\. Publishing the JAR file 发布 JAR 文件 需要告诉 Gradle 要发布 JAR 的位置。在 Gradle 中, 产物 比如 JAR 文件等是发布到库中的。我们的例子中是发布到了本地路径。你也可以发布到 远程位置或者多个位置。 Example 7.7\. Publishing the JAR file build.gradle ~~~ uploadArchives { repositories { flatDir { dirs 'repos' } } } ~~~ 执行 gradle uploadArchives 来发布 ### [](https://github.com/waylau/Gradle-2-User-Guide/blob/master/Chapter%2007.%20Java%20Quickstart%20%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B%20Java.md#725-creating-an-eclipse-project-创建一个-eclipse-project)7.2.5\. Creating an Eclipse project 创建一个 Eclipse project 创建 Eclipse 特点的描述文件,比如 .project,需要添加插件 Example 7.8\. Eclipse plugin build.gradle ~~~ apply plugin: 'eclipse' ~~~ 执行 gradle eclipse 来生产 Eclipse project 文件。更多 eclipse task 相关内容详见 [Chapter 38\. The Eclipse Plugin 关于 Eclipse 插件](https://github.com/waylau/Gradle-2-User-Guide/blob/master/Chapter%2038.%20The%20Eclipse%20Plugin%20%E5%85%B3%E4%BA%8E%20Eclipse%20%E6%8F%92%E4%BB%B6.md) ### [](https://github.com/waylau/Gradle-2-User-Guide/blob/master/Chapter%2007.%20Java%20Quickstart%20%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B%20Java.md#726-summary-总结)7.2.6\. Summary 总结 下面是完整的示例 build 文件 Example 7.9\. Java example - complete build file build.gradle ~~~ apply plugin: 'java' apply plugin: 'eclipse' sourceCompatibility = 1.5 version = '1.0' jar { manifest { attributes 'Implementation-Title': 'Gradle Quickstart', 'Implementation-Version': version } } repositories { mavenCentral() } dependencies { compile group: 'commons-collections', name: 'commons-collections', version: '3.2' testCompile group: 'junit', name: 'junit', version: '4.+' } test { systemProperties 'property': 'value' } uploadArchives { repositories { flatDir { dirs 'repos' } } } ~~~ ## [](https://github.com/waylau/Gradle-2-User-Guide/blob/master/Chapter%2007.%20Java%20Quickstart%20%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B%20Java.md#73-multi-project-java-build-多-project-的-java-构建)7.3\. Multi-project Java build 多 project 的 Java 构建 下面是一个 多 project 构建的 项目结构: Example 7.10\. Multi-project build - hierarchical layout ~~~ multiproject/ api/ services/webservice/ shared/ services/shared/ ~~~ *注意,完整的项目源码见[https://github.com/waylau/Gradle-2-User-Guide-Demos](https://github.com/waylau/Gradle-2-User-Guide-Demos) 中 java/multiproject* 里面包含 4 个 project。 `api` 是产生出 JAR 文件 给客户端加载提供给 Java 客户端需要的 XML webservice。 `webservice`是一个 web 应用返回 XML 。`shared` 包含了 `api`、`webservice` 使用的代码。项目 `services/shared` 包含了 依赖`shared` 的代码。 ### [](https://github.com/waylau/Gradle-2-User-Guide/blob/master/Chapter%2007.%20Java%20Quickstart%20%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B%20Java.md#731-defining-a-multi-project-build-定义-build-文件)7.3.1\. Defining a multi-project build 定义 build 文件 配置文件的名字叫 settings.gradle,如下 Example 7.11\. Multi-project build - settings.gradle file settings.gradle ~~~ include "shared", "api", "services:webservice", "services:shared" ~~~ 详见 [Chapter 57\. Multi-project Builds 多项目构建](https://github.com/waylau/Gradle-2-User-Guide/blob/master/Chapter%2057.%20Multi-project%20Builds%20%E5%A4%9A%E9%A1%B9%E7%9B%AE%E6%9E%84%E5%BB%BA.md) ## [](https://github.com/waylau/Gradle-2-User-Guide/blob/master/Chapter%2007.%20Java%20Quickstart%20%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B%20Java.md#732-common-configuration-常见配置)7.3.2\. Common configuration 常见配置 有很多常见的配置。我们的示例中使用了 configuration injection (配置注入)。在这里,根项目就像一个容器,subprojects 方法遍历容器中的元素(实例中的 project ),并将指定的配置。这样我们可以很容易地定义所有档案的 manifest 的内容,和一些常见的依赖关系: Example 7.12\. Multi-project build - common configuration build.gradle ~~~ subprojects { apply plugin: 'java' apply plugin: 'eclipse-wtp' repositories { mavenCentral() } dependencies { testCompile 'junit:junit:4.11' } version = '1.0' jar { manifest.attributes provider: 'gradle' } } ~~~ 注意,示例中 在 所有 子 project 中应用了 Java 插件。意思是 task 和配置属性将会出现在虽偶有 子 project 中。所以,你可以 在根 project 目录中,运行 gradle build 来编译、测试、将所有 project 打包成 JAR 。 注意,插件只应用在 subprojects 包含的区域,其他根级别的将不适用。 ### [](https://github.com/waylau/Gradle-2-User-Guide/blob/master/Chapter%2007.%20Java%20Quickstart%20%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B%20Java.md#733-dependencies-between-projects-项目间的依赖)7.3.3\. Dependencies between projects 项目间的依赖 在相同的构建里,您可以添加项目之间的依存关系,这样,例如,一个项目的 JAR 文件可以用来编译另外一个项目。在`api` 构建文件中我们将添加对`shared`项目的依赖。由于这种依赖,Gradle 将确保 `shared`在`api` 之前获得构建。 Example 7.13\. Multi-project build - dependencies between projects api/build.gradle ~~~ dependencies { compile project(':shared') } ~~~ 详见 [Chapter 57\. Multi-project Builds 多项目构建](https://github.com/waylau/Gradle-2-User-Guide/blob/master/Chapter%2057.%20Multi-project%20Builds%20%E5%A4%9A%E9%A1%B9%E7%9B%AE%E6%9E%84%E5%BB%BA.md) 中 Section 57.7.1, “Disabling the build of dependency projects” 如何禁用这个功能 ### [](https://github.com/waylau/Gradle-2-User-Guide/blob/master/Chapter%2007.%20Java%20Quickstart%20%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B%20Java.md#734-creating-a-distribution-创建发布包)7.3.4\. Creating a distribution 创建发布包 添加发布包,提供给客户端装载 Example 7.14\. Multi-project build - distribution file api/build.gradle ~~~ task dist(type: Zip) { dependsOn spiJar from 'src/dist' into('libs') { from spiJar.archivePath from configurations.runtime } } artifacts { archives dist } ~~~ ## [](https://github.com/waylau/Gradle-2-User-Guide/blob/master/Chapter%2007.%20Java%20Quickstart%20%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B%20Java.md#74-where-to-next-下步工作)7.4\. Where to next? 下步工作 你可以查看更多关于 Java 插件 ,见[Chapter 23\. The Java Plugin 关于 Java 插件](https://github.com/waylau/Gradle-2-User-Guide/blob/master/Chapter%2023.%20The%20Java%20Plugin%20%E5%85%B3%E4%BA%8E%20Java%20%E6%8F%92%E4%BB%B6.md)。也可以在[https://github.com/waylau/Gradle-2-User-Guide-Demos](https://github.com/waylau/Gradle-2-User-Guide-Demos) 中 java 目录下,看到更多 Java 的示例 继续 [Chapter 8\. Dependency Management Basics 依赖管理的基础知识](https://github.com/waylau/Gradle-2-User-Guide/blob/master/Chapter%2008.%20Dependency%20Management%20Basics%20%E4%BE%9D%E8%B5%96%E7%AE%A1%E7%90%86%E7%9A%84%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86.md)
';