正如我在“ 用Gradle构建Java的初步了解”一文中所展示的那样,当人们使用Java插件并将文件和目录放置在该插件期望的位置时, Gradle尤其适用于构建Java应用程序的基础知识(惯例-基于项目的布局 )。 但是,并非总是有一种结构(尤其是在旧系统中)可以满足Gradle的预期约定。 在本文中,我将介绍重写Gradle Java插件的一些约定,以允许简单的Gradle构建与不同的目录结构一起使用。

以下代码清单包含构建build.gradle的Gradle代码。 我在构建代码中添加了注释,以帮助解释每种类型的定制正在做什么。

build.gradle

// build.gradle
//
// This simple example of a Gradle build file exists primarily to demonstrate
// approaches to overriding Gradle's default conventions related to use of the
// Java plugin.

// The 'java' plugin must be applied before attempting to access the sourceSets
// and other properties defined by the Java plugin to avoid an error message
// similar to the following: "Could not find method sourceSets() for arguments..."
apply plugin: 'java'

// Redefine where Gradle should expect Java source files (*.java)
sourceSets {
    main {
        java {
            srcDirs 'java'
        }
        resources {
            srcDir 'resources'
        }
    }
}

// Redefine where .class files are written
sourceSets.main.output.classesDir = file("dist/classes")

// Redefine where 'jar' task should place generated JAR file.
jar {
   destinationDir = file('dist/jar')
}

// Fully qualified directory/JAR for Guava Release 16 JAR file:
//    C:\\guava16\\guava-16.0-rc1.jar
repositories { 
  flatDir{
    dirs 'C:\\guava16'
  } 
}

dependencies {
   compile 'guava:guava:16.0-rc1'
}

defaultTasks 'clean', 'jar'

上面显示的Gradle构建文件首先应用Java插件。 然后,它覆盖Java源文件的Gradle常规位置(子目录代表软件包和文件具有.jar扩展名的最高级目录),将此目录从默认的src/main/java更改为简单的java 。 同样,生产资源的默认src/main/resources位置更改为简单的resources

然后,通过指定sourceSets.main.output.classesDir现在为dist/classes sourceSets.main.output.classesDirbuild/classes/main是常规默认值),上面显示的构建文件然后更改* .class文件(具有表示其包结构的适当子目录)的放置位置。 同样, jar任务的destinationDir被覆盖以指向dist/jarbuild/libs是约定),这是jar任务生成的JAR文件的写入位置。

上面显示的简单Gradle构建脚本中显示的最终定制是使我的应用程序可以使用Guava Release 16 JAR的“存储库”和“依赖项”的规范(碰巧取决于Guava Release 16)。 Gradle为使用MavenIvy存储库提供了复杂的支持,包括Maven Central的特殊语法,但是此特定示例从我的本地文件系统(C:\ guava16)获取了Guava Release 16 JAR。 依赖项本身用“ guava:guava:16.0-rc1”表示,因为该指定存储库目录中的JAR被称为“ guava-16.0-rc1.jar”。

为了使这些自定义的测试更加容易,我将defaultTasks显式指定为cleanjar因此只要与上述build.gradle文件位于同一目录中,我就需要在命令行上键入gradle ,并且只要在该级别上有一个“ java”子目录,其相应的基于包的目录中便包含.java源文件。

当遵循Gradle的约定时,Gradle的构建最简洁,最容易编写和阅读。 但是,覆盖这些约定并指定自定义配置以匹配旧系统并不是很困难。



参考:来自我们的JCG合作伙伴 Dustin Marx的Simple Gradle Java插件定制,来自Inspired by Actual Events博客。



翻译自: https://www.javacodegeeks.com/2014/01/simple-gradle-java-plugin-customization.html