正如我在“ 用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.classesDir
( build/classes/main
是常规默认值),上面显示的构建文件然后更改* .class文件(具有表示其包结构的适当子目录)的放置位置。 同样, jar任务的destinationDir
被覆盖以指向dist/jar
( build/libs
是约定),这是jar任务生成的JAR文件的写入位置。
上面显示的简单Gradle构建脚本中显示的最终定制是使我的应用程序可以使用Guava Release 16 JAR的“存储库”和“依赖项”的规范(碰巧取决于Guava Release 16)。 Gradle为使用Maven或Ivy存储库提供了复杂的支持,包括Maven Central的特殊语法,但是此特定示例从我的本地文件系统(C:\ guava16)获取了Guava Release 16 JAR。 依赖项本身用“ guava:guava:16.0-rc1”表示,因为该指定存储库目录中的JAR被称为“ guava-16.0-rc1.jar”。
为了使这些自定义的测试更加容易,我将defaultTasks
显式指定为clean
和jar
因此只要与上述build.gradle
文件位于同一目录中,我就需要在命令行上键入gradle
,并且只要在该级别上有一个“ java”子目录,其相应的基于包的目录中便包含.java源文件。
当遵循Gradle的约定时,Gradle的构建最简洁,最容易编写和阅读。 但是,覆盖这些约定并指定自定义配置以匹配旧系统并不是很困难。
翻译自: https://www.javacodegeeks.com/2014/01/simple-gradle-java-plugin-customization.html