一个基本 Java 项目

来看一下下面这个小例子,想用 Java 插件,只需增加如下代码到你的脚本里。

采用 Java 插件

  1. build.gradle
  2. apply plugin: 'java'

备注:示例代码可以在 Gralde 发行包中的 samples/java/quickstart 下找到。
定义一个 Java 项目只需如此而已。这将会为你添加 Java 插件及其一些内置任务。

添加了哪些任务? 你可以运行 gradle tasks 列出任务列表。这样便可以看到 Java 插件为你添加了哪些任务。

标准目录结构如下:

  1. project
  2. +build
  3. +src/main/java
  4. +src/main/resources
  5. +src/test/java
  6. +src/test/resources


Gradle 默认会从 src/main/java 搜寻打包源码,在 src/test/java 下搜寻测试源码。并且 src/main/resources 下的所有文件按都会被打包,所有 src/test/resources 下的文件 都会被添加到类路径用以执行测试。所有文件都输出到 build 下,打包的文件输出到 build/libs 下。

构建项目

Java 插件为你添加了众多任务。但是它们只是在你需要构建项目的时候才能发挥作用。最常用的就是 build 任务,这会构建整个项目。当你执行 gradle build 时,Gralde 会编译并执行单元测试,并且将 src/main/* 下面 class 和资源文件打包。

构建 Java 项目

运行 gradle build 的输出结果

  1. Output of gradle build
  2. > gradle build
  3. :compileJava
  4. :processResources
  5. :classes
  6. :jar
  7. :assemble
  8. :compileTestJava
  9. :processTestResources
  10. :testClasses
  11. :test
  12. :check
  13. :build
  14. BUILD SUCCESSFUL
  15. Total time: 1 secs

其余一些较常用的任务有如下几个:

clean

删除 build 目录以及所有构建完成的文件。

assemble

编译并打包 jar 文件,但不会执行单元测试。一些其他插件可能会增强这个任务的功能。例如,如果采用了 War 插件,这个任务便会为你的项目打出 War 包。

check

编译并测试代码。一些其他插件也可能会增强这个任务的功能。例如,如果采用了 Code-quality 插件,这个任务会额外执行 Checkstyle。

外部依赖

通常,一个 Java 项目拥有许多外部依赖。你需要告诉 Gradle 如何找到并引用这些外部文件。在 Gradle 中通常 Jar 包都存在于仓库中。仓库可以用来搜寻依赖或发布项目产物。下面是一个采用 Maven 仓库的例子。

添加 Maven 仓库

  1. repositories {
  2. mavenCentral()
  3. }

添加依赖

  1. dependencies {
  2. compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
  3. testCompile group: 'junit', name: 'junit', version: '4.+'
  4. }

自定义 MANIFEST.MF

为 Java 项目指定了版本号以及所用的 JDK 版本,并且添加一些属性到 mainfest 中。

  1. sourceCompatibility = 1.8
  2. version = '1.0'
  3. jar {
  4. manifest {
  5. attributes 'Implementation-Title': 'Gradle Quickstart', 'Implementation-Version': version
  6. }
  7. }

可以执行 gradle propertie s来得到项目的属性列表。用这条命令可以看到插件添加的属性以及默认值。

为 test 添加系统属性

  1. test {
  2. systemProperties 'property': 'value'
  3. }

发布 jar 包

如何发布 jar 包?你需要告诉 Gradle 发布到到哪。在 Gradle 中 jar 包通常被发布到某个仓库中

  1. uploadArchives {
  2. repositories {
  3. flatDir {
  4. dirs 'repos'
  5. }
  6. }
  7. }

执行 gradle uploadArchives 以发布 jar 包。

示例汇总

这是示例代码汇总得到的一个完整脚本:

Java 示例 - 一个完整构建脚本

  1. apply plugin: 'java'
  2. apply plugin: 'eclipse'
  3. sourceCompatibility = 1.8
  4. version = '1.0'
  5. jar {
  6. manifest {
  7. attributes 'Implementation-Title': 'Gradle Quickstart', 'Implementation-Version': version
  8. }
  9. }
  10. repositories {
  11. mavenCentral()
  12. }
  13. dependencies {
  14. compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
  15. testCompile group: 'junit', name: 'junit', version: '4.+'
  16. }
  17. test {
  18. systemProperties 'property': 'value'
  19. }
  20. uploadArchives {
  21. repositories {
  22. flatDir {
  23. dirs 'repos'
  24. }
  25. }
  26. }

多项目构建

项目结构如下:

多项目构建-项目结构

multiproject/
  api/
  services/webservice/
  shared/

多项目构建定义

定义一个多项目构建工程需要在根目录(本例中与 multiproject 同级)创建一个setting 配置文件来指明构建包含哪些项目。并且这个文件必需叫 settings.gradle 本例的配置文件如下:

多项目构建中的 settings.gradle

include "shared", "api", "services:webservice", "services:shared"

公共配置

对多项目构建而言,总有一些共同的配置.在本例中,我们会在根项目上采用配置注入的方式定义一些公共配置。根项目就像一个容器,子项目会迭代访问它的配置并注入到自己的配置中。这样我们就可以简单的为所有工程定义主配置单了:

多项目构建-公共配置

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'
    }
}

工程依赖

同一个构建中可以建立工程依赖,一个工程的 jar 包可以提供给另外一个工程使用。例如我们可以让 api 工程以依赖于 shared 工程的 jar 包。这样 Gradle 在构建 api 之前总是会先构建 shared 工程。

多项目构建-工程依赖

api/build.gradle

dependencies {
    compile project(':shared')
}

打包发布

多项目构建-发布

api/build.gradle

task dist(type: Zip) {
    dependsOn spiJar
    from 'src/dist'
    into('libs') {
        from spiJar.archivePath
        from configurations.runtime
    }
}
artifacts {
   archives dist
}