Issues with implicitly running groovy, @Grab, proxy, and Eclipse

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

Issues with implicitly running groovy, @Grab, proxy, and Eclipse

David M. Karr
I'm trying to write a script that uses CliBuilder.  When I wrote the initial skeleton, I just had the following:
------------
#! env groovy
import groovy.util.CliBuilder
def cli = new CliBuilder(usage: usage())

cli.help(usage())

def options = cli.parse(args)

def usage() {
        "blahblah ..."
}
------------

When I execute this with "groovy ./scriptname.groovy --help", it just immediately returned to the shell prompt.  I also did "chmod +x scriptname.groovy" and then ran "./scriptname.groovy --help".  Curiously, this didn't immediately return to the prompt, and it didn't fail, it just sat there seemingly forever, perhaps waiting for input.  I eventually ^Ced it.  I tried this many times, with the same result.

Note that I'm running this on Cygwin, with groovy 2.4.7.

When I ran this in Eclipse Neon, with the latest groovy-eclipse snapshot, it immediately gave me this:
------------------
Caught: java.lang.NoClassDefFoundError: org/apache/commons/cli/ParseException
java.lang.NoClassDefFoundError: org/apache/commons/cli/ParseException
        at codecloudUserValidation.run(codecloudUserValidation.groovy:8)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.cli.ParseException
        ... 1 more
------------------

This might be a problem with groovy-eclipse, hard to tell.

Despite the difference, it does appear that I need commons-cli, so I changed the file like this:
---------------
#! env groovy
@Grab("commons-cli:commons-cli:1.3.1")
------------

This presented some challenges, as I needed to set the proxy properties, but as far as I can tell, the only way to set those properties is by doing either of these two things:
* Running "groovy -Dhttp.... scriptname args"
* Setting JAVA_OPTS to include "-Dhttp...."

I don't want to do either of those things.

I tried changing the shebang line, adding "-Dhttp..." after "env groovy", which I guess would only be used if I could get the "./scriptname.groovy ..." to work, as opposed to "groovy ./scriptname.groovy ...".

In any case, I did end up manually running it with "groovy -Dhttp... ./scriptname.groovy" (along with setting some grab/ivy verbose properties), and watched it download commons-cli.  I verified the jar ended up in "$HOME/.groovy/grapes/commons-cli/commons-cli/jars/commons-cli-1.3.1.jar".  Unfortunately, this seems to have no effect.  Running it in Eclipse still fails with the same error (do I need some sort of "refresh" in Eclipse to reload that tree?), and running it from the shell prompt still behaves the same as before.

I also tried adding a println right after the last import and also right before the end of the "straight-line" block, before method definitions.  When I run it from the shell with "groovy ./scriptname.groovy ...", it prints both messages, along with my "usage()" return value.  When I run it with "./scriptname.groovy ...", it hangs as before, without printing anything.  When I run it from Eclipse, it prints the "start" message, prints the exception and exits.