I\'m trying to write a Gradle task which copies generated war files to my local tomcat instance:
This isn\'t working and I\'m not sure how to debug it:
Please, make sure the war archive is getting bundled before deploylocal
is executed.
Maybe, you could define a dependency:
task deploylocal(dependsOn: build) << {
NB There is a convention property in java plugin named libsDir
. It allows you to reference build/libs directory in better way:
task deploylocal(dependsOn: build) << {
println "Copy from ${libsDir.getPath()} into ${tomcatHome}/webapps"
copy{
from libsDir
into "${tomcatHome}/webapps"
include '*.war'
}
}
First, attempting to debug. Check the order of task execution; see if it it being run after the war file is produced. Also whether or not it says UP-TO-DATE.
The problem could be the lack of any dependencies between the this task and the output you want to copy.
Try replacing this general task with an instance of a Copy task, and make it dependent on the war file you're trying to copy.
Something like this:
task deployLocal(type: Copy) {
dependsOn configurations.archives.buildArtifacts
from configurations.archives.allArtifacts*.file
into("$tomcatHome/webapps")
}
If you already have the war plugin you can also just add
war.doLast {
copy {
from war.archiveFile
into "${tomcatHome}/webapps"
}
}
Then you will always automatically deploy each time you build the war file.
Actually later a replaced this functionality with cargo plugin for gradle and runn the deploy by
gradle cargoRunLocal
You could give the Gradle Cargo plugin a shot. It lets you deploy a WAR file to a local as well as a remote Tomcat.
You could of-course use the tomcat plugin. My setup prevents me from using/modify the out of the box war & tomcat option.
I personally like the following flavor (copied from my build.gradle).
tomcat_home='tomcat_location'
tomcat_bin=tomcat_home + '/bin'
tomcat_start=tomcat_bin + '/startup.sh'
tomcat_stop=tomcat_bin + '/shutdown.sh'
tomcat_webapps = tomcat_home + '/webapps'
task tom << {
if (project.hasProperty('start')) {
startTom()
} else if (project.hasProperty('stop')) {
stopTom()
} else if (project.hasProperty('deployNstart')) {
stopTom()
webappsCopy()
startTom()
} else {
throw new RuntimeException('unrecognized option')
}
}
def stopTom() {
executeCmd(tomcat_stop)
}
def startTom() {
executeCmd(tomcat_start)
}
def executeCmd(command) {
proc = command.execute()
proc.waitFor()
}
def webappsCopy() {
copy {
from 'war file location' // could be exploded or war itself
into tomcat_webapps
}
}
-- you call the various options you include in the 'tom' task from the command line --
$ gradle tom -Pstart
$ gradle tom -Pstop
$ gradle tom -PdeployNstart
this could potentially grow further, as I add more commands/options related to Tomcat. Few pointers:
this limited version works for me right now :-)