如何在 Gradle 任务中使用应用程序类路径
How to use application classpath in Gradle task
想法很简单,我想直接在我的构建脚本中访问项目类。
我第一次尝试:
apply plugin: 'java'
tasks.create(name: 'randomTask', type: SourceTask) {
source.each {
println it
}
}
遗憾的是只有零个文件。
然后我决定尝试编译Java:
apply plugin: 'java'
compileJava {
source.each {
println it
}
}
虽然我确实得到了将要编译的文件列表,但这并不是我真正需要的。我想获取文件的 Class 个对象。
例如,如果我有 com.example.SomeClass
,我希望得到 Class<com.example.SomeClass>
,这样我就可以在那些 类.
上使用反射
这是我想要的一个无效示例:
apply plugin: 'java'
tasks.create(name: 'randomTask', type: SomeMagicalType) {
UMLBuilder builder = UMLBuilder.builder()
classes.each { clazz ->
clazz.methods.each { method ->
builder.addMethod(method)
}
}
builder.build().writeToFile(file('out/application.uml'))
}
P.S.: 我正在使用 Gradle 2.5 和 Java 8
我尝试在项目中获取 classes 并实例化它们。这是我设法得到的,它不是很漂亮,但它完成了获取 Class 对象
的原始工作
task allMethods(dependsOn: classes) << {
def ncl = new GroovyClassLoader()
ncl.addClasspath("${sourceSets.main.output.classesDir}")
configurations.compile.each { ncl.addClasspath(it.path) }
def cTree = fileTree(dir: sourceSets.main.output.classesDir)
def cFiles = cTree.matching {
include '**/*.class'
exclude '**/*$*.class'
}
cFiles.each { f ->
def c = f.path - (sourceSets.main.output.classesDir.path + "/")
def cname = c.replaceAll('/', '\.') - ".class"
def cz = Class.forName(cname, false, ncl)
cz.methods.each { println it }
}
}
它创建一个新的 class 加载器,添加默认输出 classes 目录,以及来自 compile
配置的所有依赖项 classes,然后构建一个列表classesDir 中的文件,将它们从路径转换为格式为 'a.b.YourClass' 的字符串,然后将其加载并转储 classes 中的方法。
您可以为您需要的方法的哪些属性添加您自己的逻辑,但这应该让您继续。
想法很简单,我想直接在我的构建脚本中访问项目类。
我第一次尝试:
apply plugin: 'java'
tasks.create(name: 'randomTask', type: SourceTask) {
source.each {
println it
}
}
遗憾的是只有零个文件。
然后我决定尝试编译Java:
apply plugin: 'java'
compileJava {
source.each {
println it
}
}
虽然我确实得到了将要编译的文件列表,但这并不是我真正需要的。我想获取文件的 Class 个对象。
例如,如果我有 com.example.SomeClass
,我希望得到 Class<com.example.SomeClass>
,这样我就可以在那些 类.
这是我想要的一个无效示例:
apply plugin: 'java'
tasks.create(name: 'randomTask', type: SomeMagicalType) {
UMLBuilder builder = UMLBuilder.builder()
classes.each { clazz ->
clazz.methods.each { method ->
builder.addMethod(method)
}
}
builder.build().writeToFile(file('out/application.uml'))
}
P.S.: 我正在使用 Gradle 2.5 和 Java 8
我尝试在项目中获取 classes 并实例化它们。这是我设法得到的,它不是很漂亮,但它完成了获取 Class 对象
的原始工作task allMethods(dependsOn: classes) << {
def ncl = new GroovyClassLoader()
ncl.addClasspath("${sourceSets.main.output.classesDir}")
configurations.compile.each { ncl.addClasspath(it.path) }
def cTree = fileTree(dir: sourceSets.main.output.classesDir)
def cFiles = cTree.matching {
include '**/*.class'
exclude '**/*$*.class'
}
cFiles.each { f ->
def c = f.path - (sourceSets.main.output.classesDir.path + "/")
def cname = c.replaceAll('/', '\.') - ".class"
def cz = Class.forName(cname, false, ncl)
cz.methods.each { println it }
}
}
它创建一个新的 class 加载器,添加默认输出 classes 目录,以及来自 compile
配置的所有依赖项 classes,然后构建一个列表classesDir 中的文件,将它们从路径转换为格式为 'a.b.YourClass' 的字符串,然后将其加载并转储 classes 中的方法。
您可以为您需要的方法的哪些属性添加您自己的逻辑,但这应该让您继续。