I was trying to copy the output of my gradle war project to a Tomcat webapps directory so I can run it in the debugger.
I defined "tomcathome" in gradle.properties. So far so good.
Then after reading a bunch of confusing stuff about how to define gradle tasks, I came up with this:
task deployTomcat (dependsOn: 'war') {
doLast {
mkdir "${tomcathome}/webapps/${project.name}"
copy {
from zipTree(war)
into "${tomcathome}/webapps/${project.name}"
}
}
}
This task got an error:
Execution failed for task ':deployTomcat'.So it doesn't like 'zipTree(war)'. I modified the code to print 'war' and 'war.outputs'. 'war.outputs' is an instance of org.gradle.api.internal.tasks.DefaultTaskOutputs.
> Cannot convert the provided notation to a File or URI: task ':war'.
The following types/formats are supported:
- A String or CharSequence path, for example 'src/main/java' or '/usr/include'.
- A String or CharSequence URI, for example 'file:/usr/include'.
- A File instance.
- A Path instance.
- A URI or URL instance.
So I googled this, found the source on github, found that DefaultTaskOutputs has a 'files' property of type FileCollection, and FileCollection has a property called 'singleFile'. So I added more prints and found that war.outputs.files.singleFile gives me the name of the war file.
So this is the working task:
task deployTomcat (dependsOn: 'war') {Yay.
doLast {
mkdir "${tomcathome}/webapps/${project.name}"
copy {
from zipTree(war.outputs.files.singleFile)
into "${tomcathome}/webapps/${project.name}"
}
}
}