7.1java插件
正如我们所看到的,它是一个通用的构建工具。它可以建立几乎任何你关心实现在你的构建脚本,然而,它不构建任何东西除非你添加代码来构建脚本这样做。
幸运地, 你不需要。 它 通过使用插件 解决了这个问题, 在某种方式 一个插件是一个扩展的 Gradle 配置项目, 通常通过添加一些预配置的任务一起来做一些有用的事情, Gradle一些插件,你可以很容易地编写自己的和与他人分享, 一个这样的插件是java plugin,这个插件添加一些任务到你的项目中, 将编译和单元测试您的Java源代码, 并将代码打包到一个JAR文件。
Java插件是公约的基础。 这意味着插件定义了默认值对许多方面的项目, 例如,Java本地源文件, 如果你遵循公约在您的项目, 你一般不需要做太多你的构建脚本得到有用的构建,Gradle 允许您定制您的项目如果你不想或不能按照约定在某种方式, 事实上,因为支持Java项目被实现为一个插件, 你不需要使用插件在所有构建一个Java项目,如果你不想。
我们已经说过许多关于java插件的例子, 依赖关系管理和多项目构建在后面的章节, 在这一章中,我们想给你一个初步的想法,如何使用Java插件来构建一个Java项目。
7.2基本的java项目
让我们看一个简单的例子。使用Java插件,将以下内容添加到你的构建文件:
例7.1 使用Java插件
build.gradle
'java'
这是所有您需要定义一个Java项目。这将应用Java插件到你的项目,它添加了一个数量的任务到您的项目。
希望找到你的生产Gradle源代码在src / main / java和您的测试源代码在src / test / java。此外,任何文件在src / main /资源将被包含在JAR文件作为资源,和任何文件在src /test/资源将被包含在类路径中用于运行测试。所有输出文件是构建目录下创建,JAR文件结束了在 build/libs 目录。
7.2.1 构建项目
Java插件添加任务到您的项目,然而,只有少数的任务,您将需要使用来构建项目,最常用的任务是构建任务,这确实完全构建项目,当你运行 gradle build, Gradle将编译和测试您的代码,和创建一个JAR文件,包含你的主要类和资源:
输出 gradle build:
> gradle build
:compileJava
:processResources
:classes
:jar
:assemble
:compileTestJava
:processTestResources
:testClasses
:test
:check
:build
BUILD SUCCESSFUL
Total time: 1 secs
其他一些有用的任务有:
clean
删除构建目录,删除所有建立文件
assemble
编译和测试你的代码,其他插件添加更多的工件来完成这个任务,例如,如果你使用War插件,这个任务还将构建WAR文件的
check
编译和测试你的代码,其他插件添加更多的检查这个任务。例如,如果您使用代码质量插件,这个任务也将运行Checkstyle反对你的源代码。
7.2.2 外部依赖
通常,一个Java项目将有一些依赖于外部JAR文件,引用这些JAR文件的项目,你需要告诉Gradle在哪里可以找到,在Gradle中,构建如JAR文件,在本地 repository中,一个repository可用于获取依赖项的项目,或者发布一个项目的构建, 或两者兼而有之。 对于这个示例,我们将使用公共Maven存储库:
例子7.3.3添加Maven库
build.gradle
repositories {
mavenCentral()
}
让我们添加一些依赖。我们将要声明我们的类有一个compile-time依赖在commons collections,和我们的测试类有一个complie-time依赖
7.4 添加依赖
build.gradle
dependencies {
'commons-collections'
, name:
'commons-collections'
, version:
'3.2'
testCompile group:
'junit'
, name:
'junit'
, version:
'4.+'
}
7.2.3定制项目
java插件为你的项目添加一些属性,这些属性通常是以默认值开始的,如果他们不合适的话,你很容易的改变他们的值,让我们看一下这个例子,对于我们java项目来说,这有一个特殊的版本,随着java版本,我们的资源也被写入,我们已经添加了一些属性为JAR manifest
7.5 定制的MANIFEST.MF
build.gradle
1.5 version =
'1.0'
jar {
manifest {
'Implementation-Title'
:
'Gradle Quickstart'
,
'Implementation-Version'
: version
}
}
7.2.4发布JAR文件
通常JAR文件需要发布到某个地方,你需要告诉Gradle发布的JAR文件在哪,在Gradle中,构建的JAR文件被发布到存储库中,例如,我们将会发布本地目录,
你也能够发布远程位置,或者多个位置
7.7 发布JAR文件
build.gradle
uploadArchives {
repositories {
flatDir {
'repos'
}
}
}
发布JAR文件,运行gradle uploadArchives
7.2.5 创建一个Eclipse项目
导出项目到Eclipse中,你需要在你的build 文件中添加一个插件
7.8 Eclipse plugin
'eclipse'
现在执行gradle eclipse命令来生成Eclipse项目文件,更多关于Eclipse任务中可以找到章38,Eclipse插件。
7.2.6概要
下面是完整的构建文件为示例:
7.9Java示例——完整的构建文件
build.gradle
'java'
'eclipse'
1.5
version =
'1.0'
jar {
manifest {
'Implementation-Title'
:
'Gradle Quickstart'
,
'Implementation-Version'
: version
}
repositories {
mavenCentral()
}
dependencies {
'commons-collections'
, name:
'commons-collections'
,
version:
'3.2'
testCompile group:
'junit'
, name:
'junit'
, version:
'4.+'
}
test {
systemProperties
'property':
'value'
}
uploadArchives {
repositories {
flatDir {
dirs
'repos'
}
}
}
7.3多个项目的java构建
现在让我们来看一个典型的多项目建设,下面是为项目的布局:
7.10 多项目构建——分层布局
Build layout
multiproject/
api/
services/webservice/
shared/
我们有三个项目,API项目是一个jar文件向客户提供一个XML webservice。项目webservice是一个web应用返回XML。项目shared包含api和webservice的代码
7.3.1定义一个多项目建设
我们使用一个简单的层次布局。下面是相应的设置文件:
7.11 多项目构建——设置 gradle文件
settings.gradle
"shared", "api", "services:webservice", "services:shared"
你可以找到更多关于设置文件在56章,构建多项目。
7.3.2常见配置
对于打错书项目构建,在所有项目中有一些常见的配置,例子,在根项目中我们会定义一些常见的配置,使用一个叫做 configuration injection .
技术。根项目就像一个容器和子项目方法遍历这个容器的元素——项目在这个实例,将指定的配置这样我们可以很容易地定义清单内容对所有档案,和一些常见的依赖关系:
7.12多项目构建——常见的配置
build.gradle
subprojects {
'java'
'eclipse-wtp'
repositories {
mavenCentral()
}
dependencies {
'junit:junit:4.11'
}
'1.0'
jar {
'gradle'
}
}
注意,我们的样例应用java插件每个子项目。这意味着任务和配置属性,我们在前一节中看到每个子项目中可用所以,从根项目目录你可以编译,测试盒JAR所有项目通过运行gradle.gradle
7.3.3 项目之间的依赖性
一个项目 的 JAR文件是用来编译另一个项目, 在api构建文件我们将添加一个依赖JAR产生的共享项目。由于这种依赖性, Gradle将确保项目共享总是之前建成项目的api
7.13 多项目构建——项目之间的依赖性
api/build.gradle
dependencies {
':shared'
)
}
7.3.4创建一个分布
我们也添加一个分布,被运送到客户端:
7.14多项目构建——分配文件
api/build.gradle
task dist(type: Zip) {
dependsOn spiJar
'src/dist'
into(
'libs'
) {
from spiJar.archivePath
from configurations.runtime
}
}
artifacts {
archives dist
}