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
ここに何かが足りませんか?
sudoers
ファイルをSudo visudo
で編集し、Defaults env_reset
の行を見つけて、その下にDefaults env_keep = "Java_HOME"
の行を追加します。説明、詳細、および代替案については、以下を参照してください。
Sudo
がJava_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
それを実行すると:
"$Java_HOME"
をJava_HOME
の値(つまり、内容)に置き換えます。空白が含まれていない場合、引用符は不要です(ここでの目的は、 単語の分割 を防ぐことです)。Sudo
は3つの引数で呼び出されます:Java_HOME=...
、ここで...
はコマンドを実行したときのJava_HOME
の値です。 mvn
、およびspring-boot:run
。Sudo
はvariable=value
構文を認識し、Java_HOME
を指定された値に設定してmvn
を実行することを知っています。 (spring-boot:run
はmvn
の最初のコマンドライン引数として渡されます)。環境変数をallに渡すには、Sudo -E mvn spring-boot:run
を実行できますが、Java_HOME
が値を保持する必要がある唯一の変数であるため(これ以外にも安全ではない可能性があります) env_reset
を使用しても値が自動的に保持される変数。
Java_HOME
を通過させるsudoers
ファイルでenv_reset
を無効にすることもできますが、これはSudo
が実行されるたびにほとんどすべてのユーザーの環境変数を通過させるため、推奨されません。
代わりに、sudoers
ファイルを編集し、env_keep
行の後に適切なenv_reset
行を追加することをお勧めします。
/etc/sudoers
を直接編集しないでください。代わりに、常に visudo
コマンドを使用して、構文が正しいことを確認する必要があります(無効になるsudoers
ファイルの作成を防止します 修正されるまでSudo
をロックダウンします ) 。実行:
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
環境変数が保持されます。