我已经安装并配置了 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
我这里遗漏了什么吗?
答案1
您可能希望使用 编辑sudoers
文件sudo visudo
,找到该行Defaults env_reset
并在其下方添加一行Defaults env_keep = "JAVA_HOME"
。请参阅下文了解解释、详细信息和替代方案。
为什么sudo
要清算JAVA_HOME
当你使用以下命令运行命令时sudo
,默认情况下你的环境是不是完整传递。大多数环境变量被删除,出于安全考虑,这通常是可取的。man sudoers
在“命令环境”部分中说:
由于环境变量会影响程序行为,因此
sudoers
提供了一种方法来限制用户环境中的哪些变量会被要运行的命令继承。有两种不同的方法sudoers
可以处理环境变量。默认情况下,此
env_reset
选项处于启用状态。这将导致使用新的最小环境执行命令。在 AIX(以及没有 PAM 的 Linux 系统)上,使用文件的内容初始化环境/etc/environment
。除了和选项允许的调用进程变量之外,新环境还包含 TERM、PATH、HOME、MAIL、SHELL、LOGNAME、USER、USERNAME 和 SUDO_* 变量env_check
。env_keep
这实际上是环境变量的白名单。但是,如果 env_reset 选项被禁用,则任何未明确拒绝的变量....
让JAVA_HOME
行一次
如果您很少以 root 身份运行并且根本不想更改配置,那么一个选择mvn spring-boot:run
就是简单地手动传递值JAVA_HOME
:
sudo JAVA_HOME="$JAVA_HOME" mvn spring-boot:run
当你运行该命令时:
- 外壳执行参数扩展和删除引文,
"$JAVA_HOME"
用 的值(即内容)替换JAVA_HOME
。如果 不包含空格,则不需要引号(它们的目的是防止单词拆分)。 sudo
被调用时有三个参数:JAVA_HOME=...
,其中是运行命令时...
的值; ,和。JAVA_HOME
mvn
spring-boot:run
sudo
识别variable=value
语法,并知道使用设置为指定值来运行mvn
。JAVA_HOME
(spring-boot:run
作为第一个命令行参数传递给mvn
)。
通过全部通过您的环境变量,您可以运行sudo -E mvn spring-boot:run
,但这可能不太安全并且不理想,因为JAVA_HOME
是唯一需要保留其值的变量(除了即使使用也会自动保留其值的少数变量env_reset
)。
JAVA_HOME
每次都让路
虽然您可以env_reset
在sudoers
文件中禁用,但这会在每次运行时传递几乎所有用户的环境变量sudo
,因此不建议这样做。
相反,我建议你编辑你的sudoers
文件并添加适当的env_keep
行在该env_reset
行之后。
- 请不要
/etc/sudoers
直接编辑。相反,你应该始终使用visudo
命令会检查以确保语法正确(防止创建无效sudoers
文件,从而锁定sudo
直至修复)。
跑步:
sudo visudo
这将使用您的默认命令行文本编辑器。如果您想使用其他编辑器,您可以visudo
将其分配给VISUAL
环境变量来运行。例如:
sudo VISUAL=nano visudo
sudo VISUAL=gedit visudo
(VISUAL
不是根据 中的“vis”命名的visudo
;而是用于指定默认文本编辑器的环境变量。您也可以使用变量EDITOR
,但VISUAL
如果设置则优先。)
运行会在文本编辑器中visudo
打开sudoers
文件的临时副本;退出时,对此副本所做的更改将写入/etc/sudoers
。
找到以下行:
Defaults env_reset
在其下方添加一行,内容如下:
Defaults env_keep = "JAVA_HOME"
(如果如果您已经有env_keep
一行,请将其添加JAVA_HOME
到允许变量的引用列表中。变量名称之间用空格分隔。
保存文件并退出文本编辑器。现在,当用户使用 运行命令时sudo
,JAVA_HOME
环境变量将被保留。