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