gradle文件不识别_识别Gradle约定

gradle文件不识别

通过约定进行配置具有许多优点,尤其是在简洁方面,因为开发人员不需要显式配置通过约定隐式配置的内容。 但是,在利用约定进行配置时,需要注意这些约定。 这些约定可能已记录在案,但是当我可以编程方式确定约定时,我总是喜欢它,因为文档可能会过时(代码背后的相同原理始终是正确的,而注释有时是正确的)。 我通过查看如何识别与Gradle Java Plugin关联的特定约定开始本文。 然后,我对该方法进行一般化,以识别与与Gradle构建的根项目相关联的所有任务相关联的所有属性。

Gradle插件上的Gradle文档说明了有关Gradle插件的重要性及其对Gradle构建的补充的以下内容:


Gradle的核心故意为现实世界的自动化提供了很少的有用功能。 插件添加了所有有用的功能,例如编译Java代码的功能。 插件添加新任务(例如JavaCompile),域对象(例如SourceSet),约定(例如主Java源位于src / main / java),以及扩展核心对象和其他插件的对象。

这篇文章介绍了Java插件为Gradle构建带来的一些任务,域对象和约定。 首先,我需要一个非常简单的Gradle构建文件。 它仅包含应用Java插件的一行。 接下来显示在Gradle构建文件build-java-plugin.gradle

build-java-plugin.gradle

apply plugin: 'java'

有了该单行的Gradle构建文件,可以通过运行gradle -b build-java-plugin.gradle tasks命令轻松查看插件提供了哪些Gradle gradle -b build-java-plugin.gradle tasks 。 接下来的两个屏幕快照显示了运行空的Gradle构建文件的输出,以及仅使用Java插件的应用程序运行Gradle构建文件的输出。

emptyGradleBuildTasksOutput

gradleJavaPluginTasksOutput

通过将运行Gradle“任务”的输出与空构建文件的输出与运行Gradle“任务”的构建文件与应用Java插件的输出进行比较,我们可以看到Gradle具有相同的“构建设置任务”集和“帮助任务”,无论是否应用了插件。 更重要的是,我们看到Java插件添加了许多新任务,这些任务分类为“构建任务”(汇编,构建,buildDependents,buildNeeded,类,clean,jar,testClasses),“文档任务”(javadoc),“验证任务”(检查,测试)和“规则”。

我在Gradle 1.10中享受的一项功能是Gradle 1.8 (我使用的较早版本)没有的功能是,可以在命令行中查询特定Gradle任务的详细信息 。 在Java插件任务compileJava , jar和javadoc的下一个屏幕快照中对此进行了演示。 通过使用命令行上的help --task <task_name>命令,所有这三个任务都有写入标准输出的详细信息。 有关Java插件任务的这些详细信息,也可以在Gradle用户指南中找到 。

gradle_1_10_help_task_details

由于Gradle基于Groovy构建,因此使用“蛮力”确定Java插件的特性相当容易。 下一个代码清单,针对build-java-plugin-properties.gradle ,演示了如何使用Groovy确定Gradle属性(可以用-P指定的那些属性,而不是用-D指定的系统属性 ),该属性可在构建脚本之前和之后使用。在应用Java插件后,然后使用Groovy的高度方便的重写减法运算符来查找差异。 Java插件添加到Gradle脚本的所有属性的名称和值(属性“ properties”除外)按字母顺序显示。

// build-java-plugin-properties.gradle
//
// Displays properties that Gradle Java Plugin adds beyond properties already
// specified for any Gradle build.def propertiesBefore = this.propertiesapply plugin: 'java'def propertiesAfter = this.propertiesdef extraProperties = propertiesAfter - propertiesBeforedef extraPropertiesKeys = new TreeSet<String>()
extraProperties.each
{ property ->if (property.key != "properties"){extraPropertiesKeys.add(property.key)}
}extraPropertiesKeys.each
{ key ->println "${key} : ${extraProperties.get(key)}"
}

下图显示了屏幕快照,其中包含运行此脚本的输出。 屏幕快照没有显示完整的输出,但是在图像后的文本中显示了较大的输出(所有属性)。

propertiesJavaPluginAddsToGradleBuild

从Gradle脚本上方运行以查看Java插件属性的输出

apiDocTitle : gradleExample API
archivesBaseName : gradleExample
assemble : task ':assemble'
binaries : [classes 'main', classes 'test']
build : task ':build'
buildDependents : task ':buildDependents'
buildNeeded : task ':buildNeeded'
buildTasks : [build]
check : task ':check'
classes : task ':classes'
clean : task ':clean'
compileJava : task ':compileJava'
compileTestJava : task ':compileTestJava'
defaultArtifacts : org.gradle.api.internal.plugins.DefaultArtifactPublicationSet_Decorated@bc80d8
dependencyCacheDir : C:\java\examples\groovyExamples\gradleExample\build\dependency-cache
dependencyCacheDirName : dependency-cache
distsDir : C:\java\examples\groovyExamples\gradleExample\build\distributions
distsDirName : distributions
docsDir : C:\java\examples\groovyExamples\gradleExample\build\docs
docsDirName : docs
inheritedScope : org.gradle.api.internal.ExtensibleDynamicObject$InheritedDynamicObject@c10304
jar : task ':jar'
javadoc : task ':javadoc'
libsDir : C:\java\examples\groovyExamples\gradleExample\build\libs
libsDirName : libs
manifest : org.gradle.api.java.archives.internal.DefaultManifest@1ad3677
metaInf : []
module : org.gradle.api.internal.artifacts.ProjectBackedModule@d2eead
processResources : task ':processResources'
processTestResources : task ':processTestResources'
rebuildTasks : [clean, build]
reporting : org.gradle.api.reporting.ReportingExtension_Decorated@33ab8f
reportsDir : C:\java\examples\groovyExamples\gradleExample\build\reports
reportsDirName : reports
runtimeClasspath : file collection
sourceCompatibility : 1.7
sourceSets : 
sources : [, ]
status : integration
targetCompatibility : 1.7
test : task ':test'
testClasses : task ':testClasses'
testReportDir : C:\java\examples\groovyExamples\gradleExample\build\reports\tests
testReportDirName : tests
testResultsDir : C:\java\examples\groovyExamples\gradleExample\build\test-results
testResultsDirName : test-results

Gradle使用命令gradle properties可以轻松查看所有Gradle属性,但是此命令行操作将显示所有属性,无论其来源(Gradle本身还是插件)。

Java插件添加到构建中的每个Gradle任务都有其自己的属性集。 这些属性可以在Gradle Build Language Reference中识别。 该文档的“ 任务类型”部分具有指向每种任务类型的链接。 每个任务类型的链接到页面都有该任务类型支持的属性的详细信息。 例如,任务类型JavaCompile在其页面上列出为具有诸如classpath , destinationDir和source之 类的属性。

以下相当广泛的脚本显示了compileJava,jar和javadoc Gradle Java Plugin任务的属性设置。 该脚本演示了将Groovy应用于识别Gradle构建设置的强大功能。 如果使用更多的反射,该脚本可能会更短,但是显式地调用任务的属性在可读性和作为每个任务可用属性的参考方面确实具有优势。

build-java-plugin-metadata.gradle

// build-java-plugin-metadata.gradle
//
// Displays the properties associated with the Gradle Java Plugin tasks
// of "compileJava", "jar", and "javadoc".import groovy.transform.Fieldapply plugin: 'java'@Field int MAX_COLUMNS = 80
@Field String headerSeparator = "=".multiply(MAX_COLUMNS)printCompileJavaProperties()
printJarProperties()
printJavadocProperties()def printCompileJavaProperties()
{printHeader("compileJava Task")println "compileJava.classpath:\n${extractStringRepresentation(compileJava.classpath)}"println "compileJava.destinationDir:\n${extractStringRepresentation(compileJava.destinationDir)}"println "compileJava.source:\n${extractStringRepresentation(compileJava.source)}"println "compileJava.options:\n${extractStringRepresentation(compileJava.options)}"println "compileJava.includes:\n${extractStringRepresentation(compileJava.includes)}"println "compileJava.excludes:\n${extractStringRepresentation(compileJava.excludes)}"println "compileJava.sourceCompatibility:\n${extractStringRepresentation(compileJava.sourceCompatibility)}"println "compileJava.targetCompatibility:\n${extractStringRepresentation(compileJava.targetCompatibility)}"
}def printJarProperties()
{printHeader("jar Task")println "jar.appendix:\n${extractStringRepresentation(jar.appendix)}"println "jar.archiveName:\n${extractStringRepresentation(jar.archiveName)}"println "jar.archivePath:\n${extractStringRepresentation(jar.archivePath)}"println "jar.baseName:\n${extractStringRepresentation(jar.baseName)}"println "jar.caseSensitive:\n${extractStringRepresentation(jar.caseSensitive)}"println "jar.classifier:\n${extractStringRepresentation(jar.classifier)}"println "jar.destinationDir:\n${extractStringRepresentation(jar.destinationDir)}"println "jar.dirMode:\n${extractStringRepresentation(jar.dirMode)}"println "jar.duplicatesStrategy:\n${extractStringRepresentation(jar.duplicatesStrategy)}"println "jar.entryCompression:\n${extractStringRepresentation(jar.entryCompression)}"println "jar.excludes:\n${extractStringRepresentation(jar.excludes)}"println "jar.extension:\n${extractStringRepresentation(jar.extension)}"println "jar.fileMode:\n${extractStringRepresentation(jar.fileMode)}"println "jar.includeEmptyDirs:\n${extractStringRepresentation(jar.includeEmptyDirs)}"println "jar.includes:\n${extractStringRepresentation(jar.includes)}"println "jar.manifest:\n${extractStringRepresentation(jar.manifest)}"println "jar.source:\n${extractStringRepresentation(jar.source)}"println "jar.version:\n${extractStringRepresentation(jar.version)}"
}def printJavadocProperties()
{printHeader("javadoc Task")println "javadoc.classpath:\n${extractStringRepresentation(javadoc.classpath)}"println "javadoc.destinationDir:\n${extractStringRepresentation(javadoc.destinationDir)}"println "javadoc.excludes:\n${extractStringRepresentation(javadoc.excludes)}"println "javadoc.executable:\n${extractStringRepresentation(javadoc.executable)}"println "javadoc.failOnError:\n${extractStringRepresentation(javadoc.failOnError)}"println "javadoc.includes:\n${extractStringRepresentation(javadoc.includes)}"println "javadoc.maxMemory:\n${extractStringRepresentation(javadoc.maxMemory)}"println "javadoc.options:\n${extractStringRepresentation(javadoc.options)}"println "javadoc.source:\n${extractStringRepresentation(javadoc.source)}"println "javadoc.title:\n${extractStringRepresentation(javadoc.title)}"
}def String extractStringRepresentation(Object object)
{String returnStringif (object in String){returnString = "\t${object}\n"}else if (object in File){returnString = "\t${object.canonicalPath}\n"}else if (object in FileCollection)  // FileTree is a FileCollection{StringBuilder filesStr = new StringBuilder()def files = object.filesfiles.each{ file ->filesStr << "\t" << file.canonicalPath << "\n" }returnString = filesStr.toString()}else if (object in CompileOptions){StringBuilder compileOptionsStr = new StringBuilder()def compileProperties = object.propertiescompileProperties.each{ compileProperty ->if (compileProperty.value in DebugOptions){compileOptionsStr << "\t" << compileProperty.key << ": " << extractStringRepresentation(compileProperty.value) << "\n"}else if (compileProperty.value in DependOptions){compileOptionsStr << "\t" << compileProperty.key << ": " << extractStringRepresentation(compileProperty.value) << "\n"}else if (compileProperty.value in ForkOptions){compileOptionsStr << "\t" << compileProperty.key << ": " << extractStringRepresentation(compileProperty.value) << "\n"}else if (compileProperty.key != "class"){compileOptionsStr << "\t" << compileProperty.key << ": " << compileProperty.value << "\n"} }returnString = compileOptionsStr.toString()}else if (object in DebugOptions){returnString = "\t${object.debugLevel}"}else if (object in DependOptions){returnString = "\t${object.classpath}"}else if (object in ForkOptions){returnString = "\t${object.executable} executable with ${object.tempDir} temp directory" }else if (object in Set || object in Boolean || object in Number || object in Enum){returnString = "\t${object.toString()}\n"}else if (object in Manifest){StringBuilder manifestStr = new StringBuilder()def manifestAttributes = object.getAttributes()manifestAttributes.each{ manifestAttribute ->manifestStr << "\t" << manifestAttribute.key << ": " << manifestAttribute.value << "\n" }returnString = manifestStr.toString()}else if (object in MinimalJavadocOptions){returnString = extractJavadocOptionsAsString(object)}else if (object == null){returnString = "\tnull\n"}else{returnString = "\t${object?.class} was unexpected type.\n"}return returnString
}def String extractJavadocOptionsAsString(MinimalJavadocOptions javadocOptions)
{StringBuilder javadocOptionsStr = new StringBuilder()javadocOptionsStr << "\tjavadoc.bootClasspath:"def bootClasspathFiles = javadocOptions.bootClasspathbootClasspathFiles.each{ bootClasspathFile ->javadocOptionsStr << "\t\t" << bootClasspathFile.canonicalName << "\n" }javadocOptionsStr << "\n"javadocOptionsStr << "\tjavadocOptions.classpath:"def classpathFiles = javadocOptions.classpathclasspathFiles.each{ classpathFile ->javadocOptionsStr << "\t\t" << classpathFile.canonicalName << "\n"}javadocOptionsStr << "\n"javadocOptionsStr << "\tjavadocOptions.destinationDirectory: " << javadocOptions.destinationDirectory?.canonicalName << "\n"javadocOptionsStr << "\tjavadocOptions.doclet: " << javadocOptions.doclet << "\n"javadocOptionsStr << "\tjavadocOptions.docletpath:"def docletpath = javadocOptions.docletpathdocletpath.each{ docletEntry ->javadocOptionsStr << "\t\t" << docletEntry.canonicalName << "\n"}javadocOptionsStr << "\n"javadocOptionsStr << "\tjavadocOptions.encoding: " << javadocOptions.encoding << "\n"javadocOptionsStr << "\tjavadocOptions.extDirs:"def extDirs = javadocOptions.extDirsextDirs.each{ extDir ->javadocOptionsStr << "\t\t" << extDir.canonicalName << "\n"}javadocOptionsStr << "\n"javadocOptionsStr << "\tjavadocOptions.header: " << javadocOptions.header << "\n"javadocOptionsStr << "\tjavadocOptions.JFlags:"def jflags = javadocOptions.JFlagsjflags.each{ jflag ->javadocOptionsStr << "\t\t" << jflag << "\n"}javadocOptionsStr << "\n"javadocOptionsStr << "\tjavadocOptions.locale: " << javadocOptions.locale << "\n"javadocOptionsStr << "\tjavadocOptions.memberLevel: " << javadocOptions.memberLevel << "\n"javadocOptionsStr << "\tjavadocOptions.optionFiles:"def optionFiles = javadocOptions.optionFilesoptionFiles.each{ optionFile ->javadocOptionsStr << "\t\t" << optionFile.canonicalName << "\n"}javadocOptionsStr << "\n"javadocOptionsStr << "\tjavadocOptions.outputLevel: " << javadocOptions.outputLevel << "\n"javadocOptionsStr << "\tjavadocOptions.overview: " << javadocOptions.overview << "\n"javadocOptionsStr << "\tjavadocOptions.source: " << javadocOptions.source << "\n"javadocOptionsStr << "\tjavadocOptions.sourceNames:"def sourceNames = javadocOptions.sourceNamessourceNames.each{ sourceName ->javadocOptionsStr << "\t\t" << sourceName << "\n"}javadocOptionsStr << "\n"javadocOptionsStr << "\tjavadocOptions.windowTitle: " << javadocOptions.windowTitle << "\n"return javadocOptionsStr.toString()
}def printHeader(String headerText)
{println headerSeparatorprintln "= ${headerText.center(MAX_COLUMNS-4)} ="println headerSeparator
}

我在此构建文件中使用了Groovy @Field批注 ,以使应用于该变量的变量可用于构建文件中的方法。 @Field批注直到Groovy 1.8才可用,这使我想起了有关Gradle和Groovy的其他重要信息:Gradle使用其自己的预包装Groovy,而不是可能在自己的计算机上安装的任何其他版本的Groovy。 您可以使用gradle --version命令确定哪个版本的Groovy。 下一个屏幕快照展示了我的Groovy版本( 2.1.6 ) 与我的Gradle安装(版本1.10)使用的Groovy版本(1.8.6)不同。 因为Gradle 1.10随Groovy 1.8.6一起提供 ,所以我可以使用@Field注释 。

gradleGroovyVersionDiffFromOwnGroovyVersion

由于最后一个脚本的输出太长了,因此我在这里将其显示为文本而不是图像。

在build-java-plugin-metadata.gradle上运行Running Gradle的输出

================================================================================
=                               compileJava Task                               =
================================================================================
compileJava.classpath:compileJava.destinationDir:C:\java\examples\groovyExamples\gradleExample\build\classes\maincompileJava.source:C:\java\examples\groovyExamples\gradleExample\src\main\java\dustin\examples\Main.javaC:\java\examples\groovyExamples\gradleExample\src\main\java\dustin\examples\Main2.javaC:\java\examples\groovyExamples\gradleExample\src\main\java\dustin\examples\Main3.javaC:\java\examples\groovyExamples\gradleExample\src\main\java\dustin\examples\Main4.javaC:\java\examples\groovyExamples\gradleExample\src\main\java\dustin\examples\Temperature.javaC:\java\examples\groovyExamples\gradleExample\src\main\java\dustin\examples\TemperatureScale.javaC:\java\examples\groovyExamples\gradleExample\src\main\java\dustin\examples\TemperatureUnit.javaC:\java\examples\groovyExamples\gradleExample\src\main\java\dustin\examples\TemperatureUnit2.javaC:\java\examples\groovyExamples\gradleExample\src\main\java\dustin\examples\TemperatureUnit3.javacompileJava.options:bootClasspath: nullfork: falseencoding: nulldeprecation: falsewarnings: trueforkOptions:  null executable with null temp directoryfailOnError: trueuseDepend: falseincludeJavaRuntime: falseuseAnt: falsecompilerArgs: []debug: trueextensionDirs: nullcompiler: nulldebugOptions:  nullverbose: falseoptimize: falsedependOptions:  listFiles: falsecompileJava.includes:[]compileJava.excludes:[]compileJava.sourceCompatibility:1.7compileJava.targetCompatibility:1.7================================================================================
=                                   jar Task                                   =
================================================================================
jar.appendix:nulljar.archiveName:gradleExample.jarjar.archivePath:C:\java\examples\groovyExamples\gradleExample\build\libs\gradleExample.jarjar.baseName:gradleExamplejar.caseSensitive:truejar.classifier:jar.destinationDir:C:\java\examples\groovyExamples\gradleExample\build\libsjar.dirMode:nulljar.duplicatesStrategy:INCLUDEjar.entryCompression:DEFLATEDjar.excludes:[]jar.extension:jarjar.fileMode:nulljar.includeEmptyDirs:truejar.includes:[]jar.manifest:Manifest-Version: 1.0jar.source:C:\java\examples\groovyExamples\gradleExample\build\tmp\jar\MANIFEST.MFjar.version:null================================================================================
=                                 javadoc Task                                 =
================================================================================
javadoc.classpath:C:\java\examples\groovyExamples\gradleExample\build\classes\mainC:\java\examples\groovyExamples\gradleExample\build\resources\mainjavadoc.destinationDir:C:\java\examples\groovyExamples\gradleExample\build\docs\javadocjavadoc.excludes:[]javadoc.executable:nulljavadoc.failOnError:truejavadoc.includes:[]javadoc.maxMemory:nulljavadoc.options:javadoc.bootClasspath:javadocOptions.classpath:javadocOptions.destinationDirectory: nulljavadocOptions.doclet: nulljavadocOptions.docletpath:javadocOptions.encoding: nulljavadocOptions.extDirs:javadocOptions.header: nulljavadocOptions.JFlags:javadocOptions.locale: nulljavadocOptions.memberLevel: nulljavadocOptions.optionFiles:javadocOptions.outputLevel: QUIETjavadocOptions.overview: nulljavadocOptions.source: nulljavadocOptions.sourceNames:javadocOptions.windowTitle: nulljavadoc.source:C:\java\examples\groovyExamples\gradleExample\src\main\java\dustin\examples\Main.javaC:\java\examples\groovyExamples\gradleExample\src\main\java\dustin\examples\Main2.javaC:\java\examples\groovyExamples\gradleExample\src\main\java\dustin\examples\Main3.javaC:\java\examples\groovyExamples\gradleExample\src\main\java\dustin\examples\Main4.javaC:\java\examples\groovyExamples\gradleExample\src\main\java\dustin\examples\Temperature.javaC:\java\examples\groovyExamples\gradleExample\src\main\java\dustin\examples\TemperatureScale.javaC:\java\examples\groovyExamples\gradleExample\src\main\java\dustin\examples\TemperatureUnit.javaC:\java\examples\groovyExamples\gradleExample\src\main\java\dustin\examples\TemperatureUnit2.javaC:\java\examples\groovyExamples\gradleExample\src\main\java\dustin\examples\TemperatureUnit3.javajavadoc.title:gradleExample API:helpWelcome to Gradle 1.10.To run a build, run gradle  ...To see a list of available tasks, run gradle tasksTo see a list of command-line options, run gradle --helpBUILD SUCCESSFULTotal time: 14.041 secs

上面显示的示例可以很好地识别与Java Gradle插件关联的特定属性。 这可以很好地工作,但是它的局限性包括需要为每个需要其值的属性编写显式代码。 这意味着没有必要知道所有可用属性的进一步限制(我使用文档在上面的示例中显式打印了值)。 进一步暗示的限制是,上面的脚本将来将不会显示添加到这些任务的任何属性值。 下一个Gradle构建示例基于先前的示例,但是此示例未明确声明要显示的任务和属性。 而是查找与根项目关联的所有任务,然后打印与每个任务关联的所有属性。

构建java插件元数据反射.gradle

// build-java-plugin-metadata-reflection.gradle
//
// Displays the properties associated with the tasks associated with the Gradle
// root project.
//import groovy.transform.Fieldapply plugin: 'java'@Field int MAX_COLUMNS = 80
@Field String headerSeparator = "=".multiply(MAX_COLUMNS)def rootProject = getRootProject()
def tasks = rootProject.tasks
tasks.each
{ task ->printTaskProperties(task)
}def printTaskProperties(Task task)
{printHeader("Task " + task.name)def taskProperties = task.propertiestaskProperties.each{ taskProperty ->println "${task.name}.${taskProperty.key}=${extractStringRepresentation(taskProperty.value)}"}
}def String extractStringRepresentation(Object object)
{String returnStringif (object in String){returnString = "\t${object}\n"}else if (object in File){returnString = "\t${object.canonicalPath}\n"}else if (object in FileCollection)  // FileTree is a FileCollection{StringBuilder filesStr = new StringBuilder()def files = object.filesfiles.each{ file ->filesStr << "\t" << file.canonicalPath << "\n" }returnString = filesStr.toString()}else if (object in CompileOptions){StringBuilder compileOptionsStr = new StringBuilder()def compileProperties = object.propertiescompileProperties.each{ compileProperty ->if (compileProperty.value in DebugOptions){compileOptionsStr << "\t" << compileProperty.key << ": " << extractStringRepresentation(compileProperty.value) << "\n"}else if (compileProperty.value in DependOptions){compileOptionsStr << "\t" << compileProperty.key << ": " << extractStringRepresentation(compileProperty.value) << "\n"}else if (compileProperty.value in ForkOptions){compileOptionsStr << "\t" << compileProperty.key << ": " << extractStringRepresentation(compileProperty.value) << "\n"}else if (compileProperty.key != "class"){compileOptionsStr << "\t" << compileProperty.key << ": " << compileProperty.value << "\n"} }returnString = compileOptionsStr.toString()}else if (object in DebugOptions){returnString = "\t${object.debugLevel}"}else if (object in DependOptions){returnString = "\t${object.classpath}"}else if (object in ForkOptions){returnString = "\t${object.executable} executable with ${object.tempDir} temp directory" }else if (object in Set || object in List || object in Boolean || object in Number || object in Enum || object in Class){returnString = "\t${object.toString()}\n"}else if (object in Manifest){StringBuilder manifestStr = new StringBuilder()def manifestAttributes = object.getAttributes()manifestAttributes.each{ manifestAttribute ->manifestStr << "\t" << manifestAttribute.key << ": " << manifestAttribute.value << "\n" }returnString = manifestStr.toString()}else if (object in MinimalJavadocOptions){returnString = extractJavadocOptionsAsString(object)}else if (object in Convention){StringBuilder conventionStr = new StringBuilder()object.plugins.each?.keyset{ plugin ->conventionStr << "\t" << plugin << "\n"}returnString = conventionStr.toString()}else if (object in LoggingManager){returnString = "\n\tCurrent Log Level: ${object.level}\n\tStandard Error: ${object.standardErrorCaptureLevel}\n\tStandard Output: ${object.standardOutputCaptureLevel}\n"}else if (object == null){returnString = "\tnull\n"}else{returnString = "\t${object?.class} was unexpected type with value of ${object}.\n"}return returnString
}def String extractJavadocOptionsAsString(MinimalJavadocOptions javadocOptions)
{StringBuilder javadocOptionsStr = new StringBuilder()javadocOptionsStr << "\tjavadoc.bootClasspath:"def bootClasspathFiles = javadocOptions.bootClasspathbootClasspathFiles.each{ bootClasspathFile ->javadocOptionsStr << "\t\t" << bootClasspathFile.canonicalName << "\n" }javadocOptionsStr << "\n"javadocOptionsStr << "\tjavadocOptions.classpath:"def classpathFiles = javadocOptions.classpathclasspathFiles.each{ classpathFile ->javadocOptionsStr << "\t\t" << classpathFile.canonicalName << "\n"}javadocOptionsStr << "\n"javadocOptionsStr << "\tjavadocOptions.destinationDirectory: " << javadocOptions.destinationDirectory?.canonicalName << "\n"javadocOptionsStr << "\tjavadocOptions.doclet: " << javadocOptions.doclet << "\n"javadocOptionsStr << "\tjavadocOptions.docletpath:"def docletpath = javadocOptions.docletpathdocletpath.each{ docletEntry ->javadocOptionsStr << "\t\t" << docletEntry.canonicalName << "\n"}javadocOptionsStr << "\n"javadocOptionsStr << "\tjavadocOptions.encoding: " << javadocOptions.encoding << "\n"javadocOptionsStr << "\tjavadocOptions.extDirs:"def extDirs = javadocOptions.extDirsextDirs.each{ extDir ->javadocOptionsStr << "\t\t" << extDir.canonicalName << "\n"}javadocOptionsStr << "\n"javadocOptionsStr << "\tjavadocOptions.header: " << javadocOptions.header << "\n"javadocOptionsStr << "\tjavadocOptions.JFlags:"def jflags = javadocOptions.JFlagsjflags.each{ jflag ->javadocOptionsStr << "\t\t" << jflag << "\n"}javadocOptionsStr << "\n"javadocOptionsStr << "\tjavadocOptions.locale: " << javadocOptions.locale << "\n"javadocOptionsStr << "\tjavadocOptions.memberLevel: " << javadocOptions.memberLevel << "\n"javadocOptionsStr << "\tjavadocOptions.optionFiles:"def optionFiles = javadocOptions.optionFilesoptionFiles.each{ optionFile ->javadocOptionsStr << "\t\t" << optionFile.canonicalName << "\n"}javadocOptionsStr << "\n"javadocOptionsStr << "\tjavadocOptions.outputLevel: " << javadocOptions.outputLevel << "\n"javadocOptionsStr << "\tjavadocOptions.overview: " << javadocOptions.overview << "\n"javadocOptionsStr << "\tjavadocOptions.source: " << javadocOptions.source << "\n"javadocOptionsStr << "\tjavadocOptions.sourceNames:"def sourceNames = javadocOptions.sourceNamessourceNames.each{ sourceName ->javadocOptionsStr << "\t\t" << sourceName << "\n"}javadocOptionsStr << "\n"javadocOptionsStr << "\tjavadocOptions.windowTitle: " << javadocOptions.windowTitle << "\n"return javadocOptionsStr.toString()
}def printHeader(String headerText)
{println headerSeparatorprintln "= ${headerText.center(MAX_COLUMNS-4)} ="println headerSeparator
}

因为此输出是针对与Gradle构建的根项目相关联的所有Tasks相关的所有属性,所以输出太长而无法在此处包含。 并非所有的属性值实例都具有extractStringRepresentation(Object object)方法准备处理的类,但是可以将这些情况添加到该方法的if-else if结构中以进行处理。 此版本的Gradle构建比早期版本更通用,并打印出与Task关联的属性,这些属性按Task分组。

由于Gradle构建与Groovy紧密耦合,因此可以使用Groovy语法和功能来了解有关Gradle构建的更多信息。 本文中的示例利用了许多Groovy的优点。 上面的Gradle构建代码之所以如此冗长,是因为大多数用于属性值的Gradle类都没有重写toString()方法,因此,如果没有特殊的代码来调用特定的方法来获得有用的表示形式,就不会显示出真正有用的输出 。 我没有在本文的示例中进行此操作,但是要解决缺少缺少的toString()方法的另一种方法是使用Groovy的拦截功能 ( metaClass.invokeMethod )拦截对toString()调用并提供覆盖的版本。 那基本上是与上面使用的相同的代码,但是将被封装在拦截对象中,而不是包含在脚本代码中。

结论

Gradle有非常好的文档(尤其是Gradle用户指南和Gradle构建语言参考 ),并且可以从该文档中轻松访问与Java Plugin for Gradle(和其他插件)相关的大多数任务和属性。 但是,我想知道如何以编程方式识别重要的约定,以防万一文档被弄错了或者我使用的版本与文档所支持的版本不同。 这篇文章的另一个目的是演示与Gradle合作时了解Groovy的有用性。 出于这个原因,我相信Gradle日益重要的地位不免会增加对Groovy的兴趣。

参考:从我们的JCG合作伙伴 Dustin Marx在“ 实际事件的启发”博客中确定Gradle约定 。

翻译自: https://www.javacodegeeks.com/2014/01/identifying-gradle-conventions.html

gradle文件不识别

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/345618.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Telesat、OneWeb及SpaceX三个全球宽带低轨卫星星座系统的技术对比

编者按&#xff1a;本文来自微信公众号“卫星与网络”&#xff08;ID&#xff1a;satnetdy&#xff09;&#xff0c;作者Inigo del Portilloa,*, Bruce G. Cameronb, Edward F. Crawleyc&#xff0c;编译 刘帅军、胡月梅&#xff08;中科院软件所&#xff09;&#xff0c;36氪经…

腾讯人均每月薪酬成本超8万元,员工总数首次超10万

11月10日&#xff0c;腾讯在23岁“生日”即将到来之际发布2021年第三季度业绩报告。财报显示&#xff0c;第三季度腾讯总收入为人民币1424亿元&#xff08;220亿美元 &#xff09;&#xff0c;同比增长13%&#xff1b;净利润(Non-IFRS&#xff09;317.5亿元&#xff0c;同比减少…

Spring State Machine:它是什么,您需要它吗?

状态机是基于有限状态的计算模型 &#xff0c;正如Wikipedia非常明确地说的那样。 通常&#xff0c;工作流会与状态一起使用&#xff0c;这意味着您不能仅从任何状态进入任何其他状态&#xff1a;应遵循一些规则。 这些状态之间的转换受规则限制。 Spring框架具有一个称为Spri…

【渝粤题库】国家开放大学2021春2097民法学(1)题目

试卷代号&#xff1a;2097 2021年春季学期期末统一考试 民法学(1) 试题 2021年7月 一、单项选择题&#xff08;每小题有四个备选答案&#xff0c;有一个正确的&#xff0c;请将正确答案的序号填在题干的括号内。每小题3分&#xff0c;共15分&#xff09; 1.我国法律规定&#x…

信关站、关口站、earth station、gatway

卫星通信系统上行站一般建设在电信港里&#xff08;teleport&#xff09;里&#xff0c;这种上行站规模庞大&#xff0c;一般称为earth station&#xff0c;他是通过SCPC, VSAT或者MESH等多种卫星通讯系统为用户提供服务的核心站点&#xff0c;一般我们称为主站。远端用户使用的…

【渝粤题库】国家开放大学2021春2542行政组织学题目

试卷代号&#xff1a;2542 2021年春季学期期末统一考试 行政组织学试题 2021年7月 一、单项选择题&#xff08;每小题2分&#xff0c;共10分&#xff0c;每小题只有一项答案正确&#xff0c;请将正确答案的序号填在括号内&#xff09; 1.规范而言&#xff0c;行政组织是追求( )…

低轨卫星通信系统发展综述

最近几年低轨移动通信领域风起云涌&#xff0c;Iridium、OneWeb、Boeing、SpaceX 这些商业航天的 独角兽 都先后实施或宣布自己在这一领域雄心勃勃的计划。 通信、导航和遥感是卫星应用领域的三驾马车&#xff0c;简称 通导遥。鉴于任务特性&#xff0c;通信卫星和导航卫星通常…

【渝粤题库】国家开放大学2021春1425调剂学(本)题目

试卷代号&#xff1a;1425 2021年春季学期期末统一考试 调剂学&#xff08;本&#xff09; 试题 2021年7月 一、单项选择题&#xff08;每题2分&#xff0c;共60分&#xff09; 1.以下名词的英文缩写不正确的是&#xff08; &#xff09;。 A.世界卫生组织WHO B.中国药学会医院…

【渝粤题库】国家开放大学2021春2109刑事诉讼法学题目

试卷代号&#xff1a;2109 2021年春季学期期末统一考试 刑事诉讼法学 试题 2021年7月 一、单项选择题&#xff08;每题1分&#xff0c;共10分&#xff0c;每题只有一项答案正确&#xff0c;请将正确答案的序号填在括号内&#xff09; 1_在我国刑事诉讼中&#xff0c;犯罪嫌疑人…

【渝粤题库】国家开放大学2021春2180办公室管理题目

试卷代号&#xff1a;2180 2021年春季学期期末统一考试 办公室管理 试题 2021年7月 一、单项选择题&#xff08;请将正确答案的字母序号填在括号内&#xff0c;每小题3分&#xff0c;共15分&#xff09; 1.加强对办公用品的库存控制与监督&#xff0c;要求保证进货卡、库存卡和…

java运行时参数_运行时的Java 8参数名称

java运行时参数Java 8将引入一种更容易的方法来发现方法和构造函数的参数名称。 在Java 8之前&#xff0c;找到参数名称的方法是在编译阶段打开调试符号&#xff0c;这会在生成的类文件中添加有关参数名称的元信息&#xff0c;然后提取复杂的信息&#xff0c;需要处理字节码。…

天地一体化信息网络发展与拟态技术应用构想

天地一体化信息网络发展与拟态技术应用构想 2019-07-20 08:00 作者: 梁浩, 陈福才, 季新生, 吕平, 高彦钊 国家数字交换系统工程技术研究中心 摘要: 天地一体化信息网络是国家面向2030的重大科技工程, 现有的基础架构及由此构建的技术体系在其节点高性能处理、网络高效互联…

【渝粤题库】国家开放大学2021春2224物业管理法规题目

试卷代号&#xff1a;2224 2021年春季学期期末统一考试 物业管理法规 试题&#xff08;开卷&#xff09; 2021年7月 一、选择题&#xff08;在所给出的四个选择项中选出一个以上的正确答案&#xff0c;然后将其序号填写在题中的括号内。少选、多选、错选均不得分。每小题4分&am…

【渝粤题库】国家开放大学2021春2247社会工作政策法规题目

试卷代号&#xff1a;2247 2021年春季学期期末统一考试 社会工作政策法规 试题 2021年7月 一、单项选择题&#xff08;每题2分&#xff0c;共20分&#xff09; 1-社会工作服务购买的主体是( )。 A.国家 B.社会 C.社区 D.政府 2.夫妻双方自愿、并就离婚的相关问题的处理达成了合…

创建您的第一个servlet

在本教程中&#xff0c;我们将学习如何使用Servlet创建非常基本的Web应用程序。 Servlet是一类&#xff0c;扩展了服务器拦截和响应传入请求的功能。 Servlet是一个Web组件&#xff0c;可在服务器上进行编写&#xff0c;构建和部署&#xff0c;以创建动态Web页面。 首先&…

【渝粤题库】国家开放大学2021春2332高等数学基础题目

试卷代号&#xff1a;2332 2021年春季学期期末统一考试 高等数学基础 试题 2021年7月 导数基本公式&#xff1a; 积分基本公式&#xff1a; &#xff08;c&#xff09;′0 (xa)′axa-1 &#xff08;ax&#xff09;′axlna(a&#xff1e;0且a≠1) (ex)′ex (logax)′ (lnx)′ (…

StarLink星座最新动态及星间组网动态路由探讨

StarLink星座最新动态及星间组网动态路由探讨 2020-06-24 11:50 StarLink星座最新动态及星间组网动态路由探讨 作者 | 刘帅军、徐帆江、刘立祥、范媛媛、王大鹏 &#xff08;中国科学院软件研究所&#xff0c;天基综合信息系统重点实验室&#xff09; 一 概述 自2020年6月开…

【渝粤题库】国家开放大学2021春2411中国现代文学题目

试卷代号&#xff1a;2411 2021年春季学期期末统一考试 中国现代文学 试题&#xff08;开卷&#xff09; 2021年7月 一、单项选择题&#xff08;每题2分&#xff0c;共20分&#xff09; 要求&#xff1a;将正确答案的序号填在括号内。每题只有一个正确答案&#xff0c;错选或多…

【渝粤题库】国家开放大学2021春2503学前儿童健康教育题目

试卷代号&#xff1a;2503 2021年春季学期期末统一考试 学前儿童健康教育 试题 2021年7月 一、判断题&#xff08;每小题3分&#xff0c;共30分。要求先判断正误&#xff0c;错误的要予以改正&#xff09; 1.无机物能使骨具有韧性和弹性。( ) 2.婴儿的前囟出生时已闭合。( ) 3.…

累计分布函数CDF、互补累计分布函数CCDF、期望Expection

1 CDF 累积分布函数(Cumulative Distribution Function&#xff0c;CDF)&#xff0c;又叫分布函数&#xff0c;是概率密度函数的积分&#xff0c;能完整描述一个实随机变量X的概率分布。一般以大写CDF标记,&#xff0c;与概率密度函数probability density function&#xff08…