Maven:JAVA_HOME 定义不正确

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

我这里遗漏了什么吗?

答案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_checkenv_keep这实际上是环境变量的白名单。

但是,如果 env_reset 选项被禁用,则任何未明确拒绝的变量....

JAVA_HOME行一次

如果您很少以 root 身份运行并且根本不想更改配置,那么一个选择mvn spring-boot:run就是简单地手动传递值JAVA_HOME

sudo JAVA_HOME="$JAVA_HOME" mvn spring-boot:run

当你运行该命令时:

  1. 外壳执行参数扩展删除引文"$JAVA_HOME"用 的值(即内容)替换JAVA_HOME。如果 不包含空格,则不需要引号(它们的目的是防止单词拆分)。
  2. sudo被调用时有三个参数:JAVA_HOME=...,其中是运行命令时...的值; ,和。JAVA_HOMEmvnspring-boot:run
  3. sudo识别variable=value语法,并知道使用设置为指定值来运行mvnJAVA_HOMEspring-boot:run作为第一个命令行参数传递给mvn)。

通过全部通过您的环境变量,您可以运行sudo -E mvn spring-boot:run,但这可能不太安全并且不理想,因为JAVA_HOME是唯一需要保留其值的变量(除了即使使用也会自动保留其值的少数变量env_reset)。

JAVA_HOME每次都让路

虽然您可以env_resetsudoers文件中禁用,但这会在每次运行时传递几乎所有用户的环境变量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到允许变量的引用列表中。变量名称之间用空格分隔。

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

相关内容