Well, I just spent a couple of hours last night trying to get the Cargo Maven2 plugin to work the way I wanted it to, which was to be able to control an already-installed local Tomcat by saying "mvn cargo:start" and then having that process exit.
Now the whole motivation was to try to get CruiseControl to redeploy the latest version of our webapp after a successful build. Due to various undeploy/deploy cycle PermGen memory leaks, and because it's on a shared server, I essentially wanted to just have CC do a "mvn cargo:undeploy cargo:stop cargo:deploy cargo:start". Unfortunately, it looked like this process would hang.
When I took a step back, I realized I could do that with a pretty short shell script, something like:
#!/bin/sh # ... config variables here curl --user $TOMCAT_ADMIN:$TOMCAT_PASSWD --url http://localhost:$TOMCAT_PORT/manager/html/undeploy?path=/ (cd $CATALINA_HOME; bin/shutdown.sh) scp $MAVEN_REPO/webapp-1.2.3-SNAPSHOT.war $CATALINA_HOME/webapps/ROOT.war (cd $CATALINA_HOME; bin/startup.sh)
Ok, a little more error checking, and you're basically done, and then just use an <exec> CC task conditionally off the normal continuous integration task.
Moral of the story: don't try too hard to do things in a fancy, snazzy way when a simple way works just fine. Incidentally, this is why some of my favorite phone screen questions to ask folks who are interviewing are (more or less):
- what programming languages do you know/use?
- do you know your way around a Unix command prompt?
If I didn't know enough Unix commands or shell scripting to do what I did above, I probably would have either given up or had to spend a ton more hours digging through the source code to the maven plugin to figure out why it wasn't doing what I wanted it to do.