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_checkenv_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 

当你运行:

  1. shell执行参数扩展和引用删除 ,将"$JAVA_HOME"替换"$JAVA_HOME"的值(即内容)。 如果它不包含空格,则引号不是必需的(这里的目的是防止分词 )。
  2. 使用三个参数调用sudoJAVA_HOME=... ,其中...是运行命令时JAVA_HOME的值; mvnspring-boot:run
  3. 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

VISUALvisudo的“vis”之后没有这么命名;相反,它是用于指定默认文本编辑器的环境变量。您也可以使用EDITOR变量,但是如果设置则VISUAL优先。)

运行visudo在文本编辑器中打开sudoers文件的临时副本; 退出时,对此副本所做的更改将写入/etc/sudoers

找到说:

 Defaults env_reset 

在它下面添加一行,说:

 Defaults env_keep = "JAVA_HOME" 

如果您已经有一个env_keep行,请将JAVA_HOME添加到引用的允许变量列表中。变量名称之间用空格分隔。)

保存文件并退出文本编辑器。 现在,当用户使用sudo运行命令时,将保留JAVA_HOME环境变量。