【问题标题】:How to use application classpath in Gradle task如何在 Gradle 任务中使用应用程序类路径
【发布时间】:2015-07-13 13:22:31
【问题描述】:

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

我第一次尝试:

apply plugin: 'java'

tasks.create(name: 'randomTask', type: SourceTask) {
    source.each {
        println it
    }
}

不幸的是,文件完全为零。

然后我决定试试compileJava:

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

【问题讨论】:

  • 你需要编译类?
  • 好吧,除非我可以在不编译的情况下获得 Class 对象,否则我确实可以。但是使用类加载器就可以了,所以现在一切都很好。

标签: java groovy gradle classpath


【解决方案1】:

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

它创建一个新的类加载器,添加默认输出类目录,以及来自compile 配置的所有依赖类,然后从 classesDir 构建文件列表,将它们从路径转换为格式为 'a.b. YourClass',然后将其加载并转储出类上的方法。

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

【讨论】:

  • 谢谢,这几乎是完美的。我实际上考虑过使用URLClassLoader 并简单地将sourceSets.main.output.classesDir 添加为构造函数参数,但这仅在从compileJava 派生我的方法时才有效,这很好,但使用您的方法实际上甚至不需要dependsOn。很好的例子。
  • @Kęstutis 很高兴我能帮上忙!
猜你喜欢
  • 1970-01-01
  • 2022-11-10
  • 1970-01-01
  • 2015-12-10
  • 2010-10-14
  • 2015-08-10
  • 1970-01-01
  • 2010-10-10
  • 2020-03-09
相关资源
最近更新 更多