如何在 Gradle 任务中使用应用程序类路径

Kęs*_*tis 1 java groovy classpath gradle

这个想法很简单,我想直接在我的构建脚本中访问项目类。

我第一次尝试:

apply plugin: 'java'

tasks.create(name: 'randomTask', type: SourceTask) {
    source.each {
        println it
    }
}
Run Code Online (Sandbox Code Playgroud)

遗憾的是得到了零个文件。

然后我决定尝试 compileJava:

apply plugin: 'java'

compileJava {
    source.each {
        println it
    }
}
Run Code Online (Sandbox Code Playgroud)

虽然我确实得到了一个将被编译的文件列表,但它并不是我真正需要的。我想获取文件的 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'))
}
Run Code Online (Sandbox Code Playgroud)

PS:我使用的是 Gradle 2.5 和 Java 8

Mar*_*her 6

我尝试在项目中获取类并实例化它们。这是我设法得到的,它并不漂亮,但它完成了获取 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 }
    }
}
Run Code Online (Sandbox Code Playgroud)

它创建一个新的类加载器,添加默认输出类目录和compile配置中的所有依赖类,然后从 classesDir 构建文件列表,将它们从路径转换为格式为“abYourClass”的字符串,然后加载它in 并转储出类上的方法。

您可以为您需要的方法中的哪些属性添加您自己的逻辑,但这应该可以帮助您。