AndroidStudioに環境変数を渡す

More than 3 years have passed since last update.

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