Retrolambdaの設定とかで環境変数から参照する例が沢山あるけど、具体的なやりかたについてです。Macでの話。
問題となる設定
build.gradleのこんなやつです。
retrolambda {
jdk System.getenv("JAVA8_HOME")
oldJdk System.getenv("JAVA7_HOME")
javaVersion JavaVersion.VERSION_1_7
}
android-best-practiceにも載ってますね。
環境変数のJAVA7_HOMEとJAVA8_HOMEを参照しています。
しかしこのまま貼り付けてAndroid Studioを起動しビルドしようとすると
Error:Execution failed for task ':lib:patchAndroidJar'.
> Retrolambda: null/jre/lib/rt.jar does not exist, make sure that the environment variable JAVA_HOME or JAVA8_HOME, or the gradle property retrolambda.jdk points to a valid version of java8.
というエラーに遭遇します。
JAVA8_HOMEなどの環境変数が読めずにnullと解釈し、結果期待するpathが取得できてないために起こるエラーっぽいですね。
定義を見るとJAVA7_HOMEも必要そうです。
retrolambda.jdkにpathを直接指定しても行けそうですが、環境依存になるのもんなんだかなあ、ということで環境変数を参照する解決方法を探しました。
ターミナルから起動
JAVA7_HOMEとJAVA8_HOMEが環境変数として定義された状態で、
open -a Android\ Studio
でとりあえずは渡せますが、Alfred等を普段から使っているとこれもだるい。
ということで他の方法を検討します。
lanunchctlを使う
Android Studioに限らずMacのアプリケーションは環境変数を指定できます。
定義
僕の場合はjenvを使っているのでこんな感じです。
launchctl setenv JAVA_HOME /Users/tmiyamon/.jenv/versions/1.7
launchctl setenv JAVA7_HOME /Users/tmiyamon/.jenv/versions/1.7
launchctl setenv JAVA8_HOME /Users/tmiyamon/.jenv/versions/1.8
確認
launchctl getenv JAVA_HOME
launchctl getenv JAVA7_HOME
launchctl getenv JAVA8_HOME
これでAlfredから起動した時もちゃんと参照してくれます。
tmuxを使っているときは一度tmuxからexitしてから定義してやる必要があります。
削除
削除したいときは
launchctl unsetenv JAVA_HOME
launchctl unsetenv JAVA7_HOME
launchctl unsetenv JAVA8_HOME
まとめ
launchctl setenv JAVA7_HOME path
launchctl setenv JAVA8_HOME path