Hi guys,
I’m new to both Gradle and Groovy but have been working with them for a couple of months so far. I’m also new to scripting languages and have experienced a number of pitfalls while writing Gradle plugins and tasks. It seems that Groovy Eclipse plugin is not reporting all the warnings/errors in the script as Eclipse JDT does (or it might be the case that I have not configured it properly). However, I think that Gradle could improve a bit its exception handling since from time to time I get those “Build aborted because of an unexpected internal error” messages which are very hard to investigate because even with the --stacktrace option there is no exception printed.
Here is one example that demonstrates the most common problem I have experienced during my learning phase:
class BrokenTask extends DefaultTask {
String destination
public BrokenTask() { }
@Input
public File getDestination() { return destination }
}
class BrokenPlugin implements Plugin<Project> {
def void apply(final Project project) {
BrokenTask task = project.tasks.add('brokenTask', BrokenTask)
task.conventionMapping.destination = { "$project.buildDir/broken" }
}
}
apply plugin: BrokenPlugin
defaultTasks 'brokenTask'
In the above example the getDestination() method is defined to return a File while the property is defined as a String.
Running this reports the mentioned internal error message without any stacktrace. Debugging it shows that the original exception is caught by Gradle’s launcher:
java.lang.ClassCastException: org.codehaus.groovy.runtime.GStringImpl cannot be cast to java.io.File
However it seems that DefaultExceptionAnalyser#findDeepest returns null instead of the original exception.
I’m currently using Gradle 1.0-m3 but checked the trunk and the above method still does same thing.
I guess I could write a custom build listener, however it would be great if this is fixed in Gradle.
Regards,
Detelin