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;同比减少…

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

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

创建您的第一个servlet

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

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

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

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

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

markov chain, MRP MDP

在强化学习中&#xff0c;马尔科夫决策过程&#xff08;Markov decision process, MDP&#xff09;是对完全可观测的环境进行描述的&#xff0c;也就是说观测到的状态内容完整地决定了决策的需要的特征。几乎所有的强化学习问题都可以转化为MDP。本讲是理解强化学习问题的理论基…

(网络)流和会话

流:指具有相同五元组(源IP,源端口,目的IP,目的端口,协议)的所有包 会话:指由双向流组成的所有包(源和目的互换)

Filtration, σ-algebras

1. Filtration filtration在钱敏平老师和龚光鲁老师的《随机过程论》中直接称其为非降的KaTeX parse error: Undefined control sequence: \sigmma at position 1: \̲s̲i̲g̲m̲m̲a̲代数族。如图。 一般叫σ\sigmaσ-代数流或σ\sigmaσ-域流 在鞅论中的花体FtF_tFt​&…

gradle 命令行_Gradle命令行便利

gradle 命令行在我的《用Gradle构建Java的gradle tasks 》一文中&#xff0c;我简要提到了使用Gradle的“ gradle tasks ”命令来查看特定Gradle构建的可用任务。 在这篇文章中&#xff0c;我将对这一简短提及进行更多的扩展&#xff0c;并查看一些相关的Gradle命令行便利。 Gr…

怎样更好地理解并记忆泰勒展开式

本段的核心思想是仿造。当我们想要仿造一个东西的时候&#xff0c;无形之中都会按照上文提到的思路&#xff0c;即先保证大体上相似&#xff0c;再保证局部相似&#xff0c;再保证细节相似&#xff0c;再保证更细微的地方相似……不断地细化下去&#xff0c;无穷次细化以后&…

新的DMN编辑器预览

Workbench 7.13.0.Final于10月16日星期二发布&#xff0c;此版本带来了许多有趣的功能和重要的修复程序。 亮点之一是作为技术预览功能的新DMN编辑器&#xff0c;该功能仍在开发中&#xff0c;但您可以开始使用。 在本文中&#xff0c;您将学习如何启用DMN编辑器预览&#xff…

指数矩阵(exponential matrix)

类似于指数ex……e^x……ex……的本质是一种近似&#xff0c;eAt……e^{At}……eAt……是同样原理。 http://www.mashangxue123.com/%E7%BA%BF%E6%80%A7%E4%BB%A3%E6%95%B0/1756604500.html

Boole‘s,Doob‘s inequality,中心极限定理Central Limit Theorem,Kolmogorov extension theorem, Lebesgue‘s domin

1. Boole’s inequality In probability theory, Boole’s inequality, also known as the union bound, says that for any finite or countable set of events, the probability that at least one of the events happens is no greater than the sum of the probabilities …

秩为 1 的矩阵的一些性质

前言 从上面的分析和例题看到&#xff0c;对于秩为1的n阶矩阵&#xff0c;零是其n重或n-1重特征值&#xff0c;如果是n-1重&#xff0c;则非零特征值是矩阵的主对角线元素之和;另外还看到&#xff0c;秩为1的矩阵可以分解为一个非零列向量与另一个非零列向量的转置的乘积&#…

probability space 概率空间,Filtration,σ-algebras

1. probability space 概率空间 1.1 概率基础 1.2 概率空间 2. Filtration filtration在钱敏平老师和龚光鲁老师的《随机过程论》中直接称其为非降的KaTeX parse error: Undefined control sequence: \sigmma at position 1: \̲s̲i̲g̲m̲m̲a̲代数族。如图。 一般叫σ\…

概率论中PDF、PMF和CDF的区别与联系

在概率论中&#xff0c;经常出现PDF、PMF和CDF&#xff0c;那么这三者有什么区别与联系呢&#xff1f; 1. 概念解释 PDF&#xff1a;概率密度函数&#xff08;probability density function&#xff09;, 在数学中&#xff0c;连续型随机变量的概率密度函数&#xff08;在不至…

随机游走 Random Walk

随机游走&#xff08;英语&#xff1a;Random Walk&#xff0c;缩写为 RW&#xff09;&#xff0c;是一种数学统计模型&#xff0c;它是一连串的轨迹所组成&#xff0c;其中每一次都是随机的。[1][2]它能用来表示不规则的变动形式&#xff0c;如同一个人酒后乱步&#xff0c;所…

wald

1. Wald’s equation Let (Xn)n∈N(X_n)_{n∈ℕ}(Xn​)n∈N​ be a sequence of real-valued, independent and identically distributed (i.i.d.) random variables and let NNN be a nonnegative integer-value random variable that is independent of the sequence (Xn)n∈…