Groovy:Repetitive method name/signature for method 'java.lang.Object withFormat(groovy.lang.Closure)' in class 'grails.plugin.databasemigration.DbdocController'.
「あれ?なんか変なエラー出てる・・・」
ある日MacでGGTSを使おうとしたら上記のようなエラーメッセージが複数出て動作しなくなりました。
簡単に原因を書いてしまうと、利用しているGrails(2.3.7)およびGGTSが先頃入れたJava8に対応していないせいだったのですが、普段Eclipse使う系の開発はJStyleの使えるWindowsでやっているので、エラーが出た当時はあまりまじめに対処する気もなく、必要になったらJava7に換えればいいんでしょ?ぐらいの感じでいました。
#英語で使ってたりカスタマイズしてないのからやる気のなさが伺えるというもの
ええ、今回記事にしたのは案の定詰まったからです。そろそろかっこいいコードを書いてドヤ顔の記事を書きたい・・・
しかし、書こうと思って早半月。そろそろ根本的な解決(GrailsのJava8対応)がきてるかもしれないので、これからGrails使う人は最新バージョンをチェックしてみるといいかもしれません。どうもGroovyはJava8でだいぶ高速化の恩恵を受けているようですし。
いきなり脱線、STS・GGTSの更新での注意
バージョン原因だとなればとりあえず最新を探してみるのが人情ですが、Mac版のGGTSは更新なんぞきておらず、早々に希望は絶たれました。
ところでGGTSもEclipseの一種なので更新はHelpメニューの「Check for Updates」から実行する訳ですが、今日会社のWindows環境でEclipseをUpdateしようとして、どうもGGTSと同じ系列のSTSプラグインの更新がうまくいかない問題にぶち当たりました。
更新対象として表示はされるのに、いざ始めるとタイムアウトしてしまうといった具合です。
プロキシ通してるせいかといろいろ疑ってはみたのですが・・・
マーケットプレイスからSTSを探し、更新ボタンを押下したら更新できました。
もし同じように更新がうまくいかなくなったときは、マーケットプレイスからの更新も試してみてください。
Javaの設定
『WindowsではJava8入れた後も問題なく動く、じゃあPathが悪いのか?』
そういえばMacはJAVA_HOMEすら設定していなかったなと思い出し、7に戻そうとしたのですが、これがもう・・・
一通りさらっていきます。
Runtimeの見直し
Macの環境設定にはJavaのruntimeの設定があるので、ここから実行対象のJavaを設定できると、
思いますよね?
ユーザータブにもシステムタブにもJava8しかありません。試しにJava7のdmgを再度実行してみても、Java7が現れることはありませんでした。
この環境設定は何のためにあるんですかね?
JAVA_HOMEの設定
GUIからはどうにもできなそうなので、コンソールを立ち上げ、.bashrcにJAVA_HOMEを追加します。
#もともとgrailsのパスは通していたので、それより先に読ませるようにしています。
export JAVA_HOME=`/System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/java_home -v "1.7"` export PATH=$JAVA_HOME/bin:$PATH:/usr/local/bin/grails-2.3.7/bin
※path設定はここを参考にしました。
保存後は以下のコマンドを叩くとJava7になっているのが確認できるかと思います。
source .bashrc java -version
さあどうだ!とGGTSを起動してみるも状況は変わらず、次の方策に移ります。
GGTS.iniに-vmの追加
Eclipseにeclipse.iniという起動設定ファイルがあるのと同様に、GGTSにも以下にGGTS.iniがあります。
インストール先などは適時読み替えてください。ポイントはGGTS.appの下の階層にiniファイルが存在しているところです。
/Users/ユーザー名/springsource/ggts-3.4.0.RELEASE/GGTS.app/Contents/MacOS/GGTS
GGTS.iniを適当なエディタで開いたら、-vmargsの上に-vmを追加します。
・・・ openFile -vm /Library/Java/JavaVirtualMachines/jdk1.7.0_XX.jdk/Contents/Home/bin/java -vmargs ・・・
WindowsだとVMを指定するときはjavaw.exeなので間違えやすいですが(実際自分は間違えてました)、Macにはjavawがないため、javaを指定します。パスのXXは自端末のバージョンに置き換えてください。 また-vmは-vmargsより先に指定しないと意味がないので気をつけてください(これも間違えてました。。)。
この後のオペは色々間違えた状態で進めていたので、もしかしたここまでの対応だけでも十分だったかもしれませんが、以下はうまくいっていない体で話を進めています。ご了承ください。
これでいっただろう!と自信満々に起動させてみるもうまくいかず、打ちひしがれながらググってみたところ、
「コンソールから実行すれば、コンソールのJavaでEclipse起動するよ」
という内容を見かけ、試したところ確かにエラーが消えました。
いやーやったね、一安心だよ、とは思ったものの、やはりこれも不便なので、もう少し頑張って調べてみました。
Javaの実行許可
なんというか、MacのJava、複雑過ぎですね。
調べたところ、以下のサイトに辿り着き、Javaの実行場所を許容する設定があることを知りました。
jdk1.7.0_XX.jdkのXXはインストールしているバージョンに読み替えてください。 Info.plistの実行がsudoなのは、ユーザ権限では読み取り専用になっているからです。
cd /Library/Java/JavaVirtualMachines/jdk1.7.0_XX.jdk/Contents sudo vim Info.plist
すると以下のような箇所があるので
<dict> <key>JVMCapabilities</key> <array> <string>CommandLine</string> </array> <key>JVMMinimumFrameworkVersion</key> <string>13.2.9</string> <key>JVMMinimumSystemVersion</key> <string>10.6.0</string> <key>JVMPlatformVersion</key> <string>1.7</string> <key>JVMVendor</key> <string>Oracle Corporation</string> <key>JVMVersion</key> <string>1.7.0_XX</string> </dict>
CommandLineの下に以下のようにBundledAppを追加してください。
<key>JVMCapabilities</key> <array> <string>CommandLine</string> <string>BundledApp</string> </array>
ファイルを保存したら一度Macを再起動して、GGTSを起動すると・・・
おめでとうございます。無事起動しましたね!お疲れ様でした。
しかしまさかこれほどMacでのJavaの設定が面倒だとは思いもしませんでした。てっきりGUIで切り替えて終わりなものだと・・・
やっぱりMacとJavaは相性悪いんですかねー。一度わかってしまうと大丈夫かとは思いますが、こんな設定、普通に触ってても気付けないんじゃないかと。
エラーも取れてさあ次回はまたGrails!といきたいところですが、ちょっとプログラム練り直し中なので、GitHub KaigiかCXFかSwiftあたりの話題にしようかなと思っています。