groovyshでgrapeを使ってlibraryを使いたい時がありました。
1 2 3 4 5 6 7 |
|
versionも文字列でないとならないのに気を付けます。 いつもの'mysql:mysql-connector-java:8.0.11'
の形式はダメでした。
@GrabConfig(systemClassLoader=true)
はどうやってもダメっぽいので、 結局groovyshからのMySQL accessは諦めましたが。
groovyshでgrapeを使ってlibraryを使いたい時がありました。
1 2 3 4 5 6 7 |
|
versionも文字列でないとならないのに気を付けます。 いつもの'mysql:mysql-connector-java:8.0.11'
の形式はダメでした。
@GrabConfig(systemClassLoader=true)
はどうやってもダメっぽいので、 結局groovyshからのMySQL accessは諦めましたが。
今まで、「画像を読み込んで線や図形を描く」というのはGroovyFXでやってたんですが、 JavaFXってheadlessで出来ないんですね!? びっくりポンです。 java.awt.headless=true
もそういやAWTなんですね。 うーむ、流石は廃止されるJavaFX、と思ったんですが、 どうせim4java
使ってるなら、なんだImageMagickだけで出来るじゃーん、 ということに遅ればせながら気付きました。 ImageMagickってdrawも出来るんですね。
大体、以下の要領です。
import org.im4java.core.*
op = new IMOperation()
op.addImage(...)
で画像fileを読み込むop.fill('rgba(255,100,0,0.5)')
等と塗り潰す色を指定op.stroke('white')
等と線の色を指定op.draw('rectangle 0,10,30,30')
で長方形を描画op.draw('text 0,10 ABCD')
で文字を描画op.quality(80)
で圧縮率(品質)指定op.addImage(...)
で出力画像の名前と形式を指定new ConvertCmd().run(op)
で実行公式pageにありますけどね。
groovyでcommand executionの結果を拾った('command args'.execute().text
)ところ改行がついてたので、除去しようと.replace('\n', '')
としてたんですが、そっか、.trim()
でいいんですね。勿論目的にもよりますが。
時々、「全く同じgroovy scriptなのにあるマシンでだけ 起動に失敗する」ことがあります。 error messageはcaseによりますが、例えば直近では以下のようなものでした。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
要するに「guava-19.0.jarのdownloadに失敗した」と。 ~/.groovy/grapes/com.google.guava/guava/
を見ると、 確かに他のlibrariesのようにjars
directoryがありませんし、 当然jar fileもありません。 じゃぁっていうんで、自分でguava-19.0.jar
を落としてきて、 jars/
作ってその下に置いても、同じ結果です。 Groovyが悪いのかJavaが悪いのかGrapeが悪いのか設定が悪いのか versionが悪いのか、何なのか全然分かりません。 普通に動くマシンでのJava/Groovyとversionを合わせてもダメ、 Grapeする各libraryのversionを上げてもダメ、 Guava 19.0を明示的に@Grab
に入れてもダメ、 Groovy - Grab - download failedを見て~/.groovy
以下や~/.groovy/grapes
を削除してもダメ、 と途方に暮れました。 いつもは面倒なので諦めて、 その動くマシンでやっていつのですけれども、 今回は粘って原因究明してみました。
結局、以下のどちらかの方法で立ち上がるようになりました。
~/.groovy/grapes/com.google.guava/guava/jars
ではなく~/.groovy/grapes/com.google.guava/guava/bundles
にして、その下に落としてきたguava-19.0.jar
を置く~/.groovy/grapes/com.google.guava/guava/jars
に落としてきたguava-19.0.jar
を置き、~/.groovy/grapes/com.google.guava/guava/ivy-19.0.xml
の<publications>
下の<artifact name="guava" type="bundle" ext="jar" conf="master"/>
のtype
attributeをbundle
からjar
にする上手く行っていたマシンでは、 ~/.groovy/grapes/com.google.guava/guava/bundles
が出来ており、 その下にguava-19.0.jar
もフツーにありました。 上手く行かないマシンではなぜbundles
が出来ないのか、は未だ不明ですが、 取り敢えず前に進める方法がわかったので記しています。
あぁ、あと、このようにGrapeに失敗すると、 ~/.groovy/grapes/
以下にresolved-caller-all-caller-working73.properties
とresolved-caller-all-caller-working73.xml
といったfilesが澱のように溜まっていくので、都度削除した方がいいです。
SwingからJavaのGUIの座を引き継いだとはいえ、 Java11ではJava本体から削除され、 OpenJFXとなるJavaFX、 でもGUI作るならJavaFXだろうなぁ、 簡単に描けるようにGroovyでないかなー、 と思ったら、ありましたGroovyFX。 早速試してみると、 本家に書いてある「Hello, World」すら以下のように失敗しました。
1 2 3 4 5 6 7 8 9 10 11 |
|
色々試すと、以下のような最低限のscriptでもaaaを出力もせず 全く同じerror messageを出すので、 もうGrapeでgroovyfxを読み込んでいる時点でダメなんでしょう。
1 2 3 |
|
scriptに何を書いても無視される(そこまで到達しない)わけなので、 事前にnew javafx.embed.swing.JFXPanel()
して JavaFX environmentを初期化する、ということも当然効きません。 Grapeに拘っていたので、 古いversion(@Grab('org.codehaus.groovyfx:groovyfx:0.4.0')
)に してnew javafx.embed.swing.JFXPanel()
しておけば、 start{...}
が動くことがわかりversion落としてやってましたが、 今改めて試してみると、 Grapeじゃなくてgroovy -cp groovyfx-8.0.0.jar test.groovy
と Class Pathを指定すれば、 new javafx.embed.swing.JFXPanel()
もなしに 「Hello World」もその通り動くことが確認できました。 そっかー、Grape諦めればよかったのかー。 -cp
を指定しても足りないところはGrapeも効くので、 そぃでよかったでもんそ。
あと、MySQLからdata読む必要があったので、
1 2 3 4 5 6 7 8 |
|
とすればよいと。
今回の目的は、画像を読み込んで、それにDBから読み込んだ値で四角形を描き、 そぃを画像fileとして出力する、ちゅうもんじゃった。 scene.snapshot()
してからSwingFXUtils.fromFXImage(scene, null)
で 描画画像をbitmap化出来ます。 それをImageIO.write()
で一発でfileに書けるがじゃっどん、 そぃだと何か出来た画像が赤みがかっちゃっちょるんですよね。 どげんしたもんか、試行錯誤の挙句、ImageMagickのfrontend、 im4javaを通すとうまく行きました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
最後、stage.close()
すればwindowは開かずに済みます。