【问题标题】:Does intellij run maven as a different user?intellij 是否以其他用户身份运行 maven?
【发布时间】:2012-02-05 22:56:56
【问题描述】:

我已将强制执行器配置为检查某些属性。这些在我的主目录中的.profile 文件中作为环境变量导出。从控制台构建运行良好。

从 intellij 构建(双击 maven 菜单中的目标)失败,因为执行器找不到属性...这里出了什么问题以及如何解决?

我的第一个猜测是 intellij 以不同的用户身份运行 maven,但我不确定如何验证它或如何处理它。

注意:我不是要求解决方法。一是在intellij的maven Runner设置中设置属性,二是在/etc/profile中设置属性。但我想避开它们。

编辑:我尝试重新启动 intellij、X 服务器和机器 - 对执行器没有影响。 printenv 在新控制台中按预期显示我的变量。从同一个控制台启动 intellij 会导致同样的构建失败。

谢谢。

【问题讨论】:

  • 我不相信有任何方法可以将 maven 或任何其他插件或程序配置为在 IntelliJ 中以不同用户身份运行。
  • 我认为它类似于 jenkins 服务器,它以 jenkins 用户身份运行 maven - 我找不到其他解释

标签: java maven intellij-idea environment-variables


【解决方案1】:

每个程序都有自己的环境。如果您更改.profile 等中的环境设置,它不会更改运行程序的设置。当一个程序运行另一个程序时,它会继承其父程序的设置/环境。它不会再次加载设置。

您可能会发现,您在 IntelliJ 启动后所做的更改对 IntelliJ 运行的程序没有影响。如果您打开命令窗口、更改设置并运行新程序(shell 将保留启动时的设置),也会发生同样的事情。要解决此问题,您需要重新启动 IntelliJ。如果从命令行运行它,请确保它是一个新窗口。


这个单元测试应该转储环境。

@Test
public void dumpEnv() {
    for (Map.Entry<String, String> entry : new TreeMap<String, String>(System.getenv()).entrySet()) {
        System.out.println(entry);
    }
}

【讨论】:

  • 感谢您的回答。不幸的是,我已经尝试了低挂的果实——重新启动 intellij、x 服务器或机器没有效果。我不是手动导出变量,而是通过我的.profile,因此所有应用程序的环境应该相同。已编辑问题以反映这一点。
  • 在这种情况下,我会检查从命令行运行的相同版本的 maven 是否执行相同的操作。
  • 已经尝试过 - “从控制台构建运行良好。” Intellij 使用与控制台构建相同的二进制/M2_HOME。 Jenkins 也使用它,但对于 CI,我使用 injectEnv 插件来避免更改全局配置文件
  • 您可以尝试在命令行(完整路径名)和 intelliJ 中明确设置它以进行检查。
  • 经过测试,从 intellij 运行测试 - 使用 System.getenv() 的 env vars 应该是这样。感谢您对我的包容:)
【解决方案2】:

.profile 仅在您使用 KSH 登录时执行。如果使用 BASH,则没有效果。

.bashrc (if you use BASH) 是一个更合适的位置,因为它会在您每次启动 shell(shell 脚本、新终端窗口等)时执行。

对于 KSH,.kshrc has the same effect

要确保变量存在,请使用set(无选项)列出所有变量或使用set|greppattern 进行搜索。一旦它们出现在新的终端窗口中,它们也应该在您的 IDE 中出现。

[编辑] 如果set 可以看到它们,那么 IntelliJ 也可以。唯一剩下的就是 IntelliJ 可以在启动 Maven 时清理环境。

要对此进行测试,请将 mvn 重命名为 mvn.orig 并使用以下内容创建一个新脚本 mvn

#!/bin/bash
set > $HOME/mvn_env.log
mvn.orig "$@"

这个脚本将mvn 看到的环境转储到$HOME/mvn_env.log。如果缺少变量,则 IntelliJ 会清理环境。

【讨论】:

  • 嗯,很有趣。我正在使用 bash(说echo $0)并在.profile 中设置变量。它们在我重新启动时设置并且可用 - 通过setprintenv、`System.getenv()' 进行检查。我将它们迁移到 .bashrc - 似乎没有任何改变
  • 如果set 可以看到它们,那么 IntelliJ 也可以。唯一剩下的就是 IntelliJ 可以在启动 Maven 时清理环境。查看我的编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-06
  • 2010-11-13
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-09
相关资源
最近更新 更多