web-dev-qa-db-ja.com

Maven:Java_HOMEが正しく定義されていません

MavenとJavaをインストールして構成しました。 正常に実行できます

mvn spring-boot:run

しかし、私が走るとき

Sudo mvn spring-boot:run

Maven: Java_HOME is not defined correctlyを取得しています

私がする時

$ echo $Java_HOME
/home/ubuntu/jdk1.8.0_26

ここに何かが足りませんか?

2
kranthi117

sudoersファイルをSudo visudoで編集し、Defaults env_resetの行を見つけて、その下にDefaults env_keep = "Java_HOME"の行を追加します。説明、詳細、および代替案については、以下を参照してください。

SudoJava_HOMEをクリアする理由

Sudoを指定してコマンドを実行すると、デフォルトでは、環境はnotそのまま渡されます。セキュリティのために、ほとんどの環境変数は削除されています。これは通常望ましいことです。 man sudoers が言うように、「コマンド環境」のセクションで:

環境変数はプログラムの動作に影響を与える可能性があるため、sudoersは、実行するコマンドによってユーザーの環境のどの変数が継承されるかを制限する手段を提供します。 sudoersが環境変数を処理する方法は2つあります。

デフォルトでは、env_resetオプションが有効になっています。これにより、新しい最小限の環境でコマンドが実行されます。 AIX(およびPAMのないLinuxシステム)では、/etc/environmentファイルの内容で環境が初期化されます。新しい環境には、env_checkおよびenv_keepオプションで許可された呼び出しプロセスからの変数に加えて、TERM、PATH、HOME、MAIL、Shell、LOGNAME、USER、USERNAME、およびSudo_ *変数が含まれます。これは事実上、環境変数のホワイトリストです。

ただし、env_resetオプションが無効になっている場合、明示的に拒否されていない変数....

Java_HOMEを1回通過させる

ルートとしてmvn spring-boot:runをめったに実行せず、設定をまったく変更したくない場合の1つのオプションは、単にJava_HOMEの値を手動で渡すことです。

Sudo Java_HOME="$Java_HOME" mvn spring-boot:run

それを実行すると:

  1. シェルは、 パラメーター展開 および 引用符の削除 を実行し、"$Java_HOME"Java_HOMEの値(つまり、内容)に置き換えます。空白が含まれていない場合、引用符は不要です(ここでの目的は、 単語の分割 を防ぐことです)。
  2. Sudoは3つの引数で呼び出されます:Java_HOME=...、ここで...はコマンドを実行したときのJava_HOMEの値です。 mvn、およびspring-boot:run
  3. Sudovariable=value構文を認識し、Java_HOMEを指定された値に設定してmvnを実行することを知っています。 (spring-boot:runmvnの最初のコマンドライン引数として渡されます)。

環境変数をallに渡すには、Sudo -E mvn spring-boot:runを実行できますが、Java_HOMEが値を保持する必要がある唯一の変数であるため(これ以外にも安全ではない可能性があります) env_resetを使用しても値が自動的に保持される変数。

毎回Java_HOMEを通過させる

sudoersファイルでenv_resetを無効にすることもできますが、これはSudoが実行されるたびにほとんどすべてのユーザーの環境変数を通過させるため、推奨されません。

代わりに、sudoersファイルを編集し、env_keep行の後に適切なenv_reset行を追加することをお勧めします。

実行:

Sudo visudo

これは、デフォルトのコマンドラインテキストエディターを使用します。別のエディターを使用する場合は、visudo環境変数に割り当てられたVISUALを実行できます。例えば:

  • Sudo VISUAL=nano visudo
  • Sudo VISUAL=gedit visudo

VISUALは、visudoの「vis」にちなんで命名されません。代わりに、デフォルトのテキストエディタを指定するための環境変数です。EDITOR変数を使用することもできますが、VISUALが優先されます。)

visudoを実行すると、テキストエディターでsudoersファイルの一時コピーが開きます。終了時に、このコピーに加えられた変更は/etc/sudoersに書き込まれます。

次の行を見つけます。

Defaults        env_reset

そのすぐ下に次の行を追加します。

Defaults        env_keep = "Java_HOME"

(既にenv_keep行がある場合、許可された変数の引用符付きリストにJava_HOMEを追加します。変数名はスペースで互いに区切られています。)

ファイルを保存し、テキストエディターを終了します。これで、ユーザーがSudoを使用してコマンドを実行すると、Java_HOME環境変数が保持されます。

4
Eliah Kagan