Re: Groovy -jar

Per Nyfelt <[email protected]> Sun, 23 Feb 2025 12:40:38 +0100
Newsgroups gmane.comp.lang.groovy.user
Organization Alipsa HB
Message-ID <[email protected]>
Thanks for this!

For the use case you mention it makes perfect sense to do it that way.

Since I don't want to include groovy jars in every jar bundle, I ended 
up with this instead: 
https://github.com/Alipsa/groovyjar/blob/main/groovyjar

I still think something similar would be nice and useful as part of the 
groovy distribution (e.g. when installed by sdkman)

Best regards,

Per

On 2/23/25 01:53, [email protected] wrote:
>
> Hi Per,
>
> I have had (very) good luck with a slightly different approach.
>
> Rather than ‘groovy -jar myapp.jar’ I went with ‘java -jar myapp.jar’.
>
> And this had another, somewhat unexpected, benefit.  Building my app 
> with shadowJar <https://gradleup.com/shadow/> (thanks to the help I 
> received here) it bundled all of groovy, all my library dependencies 
> (database drivers, etc), and my app into my jar file.  As a result, I 
> don’t even need to install groovy on a target machine – just copy the 
> one jar file (myapp.jar) to the target machine and run it via ‘java 
> -jar myapp.jar’ and everything completely works.  Of course this 
> assumes that Java has been installed but that’s pretty ubiquitous 
> these days and a requirement anyway.  And I don’t have to worry about 
> the version of groovy that happens to be installed on that machine as 
> the execution will use the version of groovy that is inside my jar file.
>
> You can review a working example of this at 
> https://github.com/mre-code/groovysql.
>
> Now unfortunately, due to Java’s newer encapsulation direction 
> <https://dev.java/learn/modules/strong-encapsulation/> (which does 
> make a lot of sense) I ended up needing to provide a shell wrapper to 
> provide all of the –add-opens settings required for (older) Java 
> database drivers (which I use for this app).  Now if it weren’t for 
> those older Java database drivers which are using reflection I would 
> not need the little shell wrapper and could just use ‘java -jar 
> groovysql.jar’ (or even the binfmt approach discussed in the groovysql 
> repository where you can just make the jar file executable and run it 
> as ‘groovysql’ after removing the .jar extension from the file).
>
> For background, the little shell wrapper is located in 
> src/main/bin/groovysql in that repository.
>
> So in order to run my app, all that anyone needs to do is to copy my 
> jar file and the little shell wrapper from the Releases and place them 
> somewhere in their PATH and it’s ready to run.  No groovy install, no 
> database driver installs, no configuration, just go.
>
> Hope this helps,
>
> Steve
>
> *From:*Per Nyfelt <[email protected]>
> *Sent:* Saturday, February 22, 2025 2:34 PM
> *To:* users-GSC0n/0aZo1d/SJB6HiN2Ni2O/[email protected]
> *Subject:* Groovy -jar
>
> Hi,
>
> I find myself missing  a way to execute groovy jars e.g: `groovy -jar 
> someapp.jar`.  As a workaround i can do something like the following 
> in bash (error handling etc. omitted)
>
> *#!/usr/bin/env bash*
> *# takes a single parameter (the path to the jar file to execute - it 
> assumes the Main-Class attribute has been set)*
> jarName="$1"
> mainClass=$(unzip -p "$jarName" "META-INF/MANIFEST.MF" | grep 
> 'Main-Class:' | awk '{ print $2 }' | tr -d '\r')
> java -cp $jarName:$GROOVY_HOME/lib/* $mainClass
>
> But it would be nice to support this "natively" in groovy with `groovy 
> -jar`
>
> Has support for this been discussed before?
>
> Best regards,
>
> Per
>