我有一个本地Groovy AST转换,我在类级别应用。此转换为目标类添加了一种方法。
一旦我尝试在我正在作为构建的一部分导入的jar中使用转换代码中的类,我就会遇到“无法解析类”的异常。在下面的例子中,它是org.apache.commons.math3.analysis.function.Abs。
当我检查sourceUnit classLoader的url(URLClassLoader.getURLs())时,我只找到了编译源代码的路径,并没有看到编译所引入的jar列表(其中包括公共数学jar)。 / p>
本地AST转换是否可以在编译期间使用jar中的类?如果是这样,我如何获得转换来解决类(我尝试显式添加到sourceUnit classLoader的url而没有成功)?如果没有,全局AST转换会改变吗?
void visit(ASTNode[] astNodes, SourceUnit sourceUnit) {
try {
ClassNode annotatedClass = (ClassNode) astNodes[1]
MethodNode newMethod = makeMethod(annotatedClass)
annotatedClass.addMethod(newMethod)
} catch (Exception e) {
println 'Failed to apply transform'
e.printStackTrace()
}
}
MethodNode makeMethod(ClassNode source) {
def ast = new AstBuilder().buildFromString(CompilePhase.INSTRUCTION_SELECTION, false, '''
def added() {
println new org.apache.commons.math3.analysis.function.Abs().value(-3.0)
println 'Added'
}
'''
)
return (MethodNode) ast[1].methods.find { it.name == 'added' }
}
完整示例适用于构建文件in a Github repository here