White Box技術部

WEB開発のあれこれ(と何か)

【解決済み】MacのGGTS(Grails)がJava8入れたらエラー吐くようになった問題

f:id:seri_wb:20140604233540p:plain

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が悪いのか?』

そういえばMacJAVA_HOMEすら設定していなかったなと思い出し、7に戻そうとしたのですが、これがもう・・・

一通りさらっていきます。

Runtimeの見直し

Macの環境設定にはJavaのruntimeの設定があるので、ここから実行対象のJavaを設定できると、

思いますよね?

f:id:seri_wb:20140604233541p:plain

ユーザータブにもシステムタブにも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の追加

Eclipseeclipse.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より先に指定しないと意味がないので気をつけてください(これも間違えてました。。)。

この後のオペは色々間違えた状態で進めていたので、もしかしたここまでの対応だけでも十分だったかもしれませんが、以下はうまくいっていない体で話を進めています。ご了承ください。


これでいっただろう!と自信満々に起動させてみるもうまくいかず、打ちひしがれながらググってみたところ、

「コンソールから実行すれば、コンソールのJavaEclipse起動するよ」

という内容を見かけ、試したところ確かにエラーが消えました。
いやーやったね、一安心だよ、とは思ったものの、やはりこれも不便なので、もう少し頑張って調べてみました。

Javaの実行許可

なんというか、MacJava、複雑過ぎですね。
調べたところ、以下のサイトに辿り着き、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で切り替えて終わりなものだと・・・
やっぱりMacJavaは相性悪いんですかねー。一度わかってしまうと大丈夫かとは思いますが、こんな設定、普通に触ってても気付けないんじゃないかと。

エラーも取れてさあ次回はまたGrails!といきたいところですが、ちょっとプログラム練り直し中なので、GitHub KaigiかCXFかSwiftあたりの話題にしようかなと思っています。