GroovyScriptとしてファイルに書いたのをそのままgroovyコマンドで実行するときのTips
多分オーソドックスなのは「共通コードはライブラリ化してjarにするだろJK」なのだろうけど、どうせ1-2つのクラスだけなんだろうし、それだけのためにjar作ってclasspathいじるのメンドイ、という時に、groovycでコンパイルしたクラスをそのまま同じディレクトリに放置しておくのもアリだなと思ってこんな感じにしました。
ライブラリ側:lib.groovy
@Grapes([
@Grab(group='org.slf4j', module='slf4j-api', version='1.7.2'),
@Grab(group='ch.qos.logback', module='logback-classic', version='1.0.9'),
])
import groovy.util.logging.*
@Slf4j
class C1 {
static void m1() {
println 'from m1:'
log.trace 'trace2'
log.debug 'debug1'
log.info 'info1'
log.warn 'warn1'
log.error 'error1'
}
}
@Slf4j
class C2 {
static void m2() {
println 'from m2:'
log.trace 'trace2'
log.debug 'debug2'
log.info 'info2'
log.warn 'warn2'
log.error 'error2'
}
}
これをコンパイルしておきます。
$ groovyc lib.groovy $ ls C1.class C2.class lib.groovy
groovycが"@Grape"も見てくれるのか、依存jarを指定する必要がないのがちょっと感動的です。
で、同じディレクトリにC1, C2を使うメインとなるGroovy Scriptを置きます。
main.groovy:
$ cat main.groovy @GrabConfig(systemClassLoader=true) @Grapes([ @Grab(group='org.slf4j', module='slf4j-api', version='1.7.2'), @Grab(group='ch.qos.logback', module='logback-classic', version='1.0.9'), ]) import groovy.* // dummy C1.m1() C2.m2()
"@Grapes"と本体コードの間にダミーの"import"を入れてますが、これが無いといきなり"C1"で始まるのが、何がイケないのかわかりませんがsyntaxエラーで怒られました。
こっちでも同じ"@Grab"が必要なのと、こちらは実行側なので"@GrabConfig"の調整が必要だったりします。
あとはgroovyでもGroovyServのgroovyclientでも好きな方で実行してください。
$ groovy main.groovy from m1: 00:38:33.909 [main] DEBUG C1 - debug1 00:38:33.913 [main] INFO C1 - info1 00:38:33.914 [main] WARN C1 - warn1 00:38:33.914 [main] ERROR C1 - error1 from m2: 00:38:34.030 [main] DEBUG C2 - debug2 00:38:34.030 [main] INFO C2 - info2 00:38:34.030 [main] WARN C2 - warn2 00:38:34.030 [main] ERROR C2 - error2
共通コードを変更した時はgroovycで再コンパイルが必要だったり、共通コードのファイル名を
xxxx.groovy
としたら、その中で
class Xxxx {
とするとなんかうまく全体として動いてくれないなど微妙な地雷臭はあったりしましたが、一応これはこれでアリといえばアリかなと。