Maven 没有正确选择 JAVA_HOME
Posted
技术标签:
【中文标题】Maven 没有正确选择 JAVA_HOME【英文标题】:Maven not picking JAVA_HOME correctly 【发布时间】:2012-10-28 15:09:16 【问题描述】:我在 windows 环境下使用 maven 编译我的项目。虽然我刚刚创建了项目并添加了各种库的依赖项。
当我添加它们时,maven 开始抱怨缺少tools.jar
,所以我在下面添加到我的pom.xml
:
<dependency>
<groupId>com.sun</groupId>
<artifactId>tools</artifactId>
<version>1.6</version>
<scope>system</scope>
<systemPath>$java.home/../lib/tools.jar</systemPath>
</dependency>
当我运行 maven 安装时,我收到一个缺少 jar 的错误,如下所示:
[ERROR] Failed to execute goal on project GApp: Could not resolve dependencies for project GApp:GApp:war:0.0.1-SNAPSHOT: Could not find artifact com.sun:tools:jar:1.6 at specified path C:\Program Files\Java\jre6\lib\tools.jar -> [Help 1]
问题是tools.jar
位于“C:\Program Files\Java\jdk1.6.0_26\lib
”中,并且在JAVA_HOME
环境变量中设置正确,但 maven 仍在查看 jre 文件夹,如错误消息“C:\Program Files\Java\jre6\lib\tools.jar
”中所示。
C:\>echo %JAVA_HOME%
C:\Program Files\Java\jdk1.6.0_26
有趣的是:当我设置完整的依赖路径时,它工作得很好。但我不想硬编码。
<dependency>
<groupId>com.sun</groupId>
<artifactId>tools</artifactId>
<version>1.6</version>
<scope>system</scope>
<systemPath>C:\Program Files\Java\jdk1.6.0_26\lib\tools.jar</systemPath>
</dependency>
有人可以为此建议任何动态解决方案吗?
【问题讨论】:
$java.home 的值是多少? 您是从命令行还是在 Eclipse 或 IntelliJ 等 IDE 中运行 Maven? @metalmadz JAVA_HOME 是环境变量 @cuberoot,我在 Eclipse 中运行它 我一直避免将 JDK/JRE 放置在包含空格的目录中(参见“程序文件”),因为这会与 Maven 混淆。也许试试看? 【参考方案1】:检查你是否有一个 .mavenrc 文件,它可能会强制 JAVA_HOME 与环境变量中设置的不同。
【讨论】:
【参考方案2】:还可以查看主目录中的 .mavenrc 文件。 这让我措手不及。
我按照建议更改了所有内容,只是发现我的 .mavenrc 文件将 JAVA_HOME 设置为旧版本。
【讨论】:
【参考方案3】:您可能使用了错误的 Maven 安装。在 Window > Preferences > Maven > Installations 中切换它。我将我的设置为 Fedora Maven 安装;将其更改回默认值(嵌入在 m2e 中的版本)为我解决了这个问题。
我怀疑导致这个问题的原因是 Fedora Maven 安装使用了 Fedora 的 OpenJDK,这可能会将 tools.jar 放在一个奇怪的位置(关于 Fedora 的 OpenJDK 的一切都是奇怪且非标准的),所以 Maven 找不到它。
【讨论】:
【参考方案4】:这是 Eclipse Maven 支持中的一个错误。根据Maven specs,Eclipse 不支持所有全局 Maven 属性。
根据规格:
$java.home 指定当前 JRE_HOME 环境的路径 使用相对路径来获取例如
至少在 Eclipse 4.3.1 中并非如此,这里的java.home
始终指向用于启动 Eclipse 的 JRE,而不是构建 JRE。
要解决这个问题,您需要使用 JDK 中的 JRE 启动 Eclipse,方法是将类似这样的内容添加到 eclipse.ini
(之前 -vmargs
!):
-vm
C:/<your_path_to_jdk170>/jre/bin/server/jvm.dll
【讨论】:
是否有与此相关的 Eclipse Maven 错误的链接? Linux 环境中javaw.exe
的类比是什么? jre/bin/
有一个java
和一个javaws
,但没有javaw
。
在 Mac/Linux 上,路径类似于 /<your_path_to_jdk170>/jre/bin/java
这个问题好像还存在?我今天遇到了同样的错误,你的回答真的很有帮助。那么,即使在 4 年多之后,这个问题是否存在?这个错误到底是什么?
这个答案五年后,这个错误仍然存在(现在是 2019-04-05)。我还想指出,要非常小心路径。 1) 不要在字符串周围使用双引号。 2) 即使在 Windows 中也使用正斜杠。 3) 使用 jvm.dll 4) 确保指向jdk.../jre/...
。 5)正如@Daniel Fernández 指出的那样,在 -vm 之后需要换行(而不是 --vm!)对我来说,获胜的路径是 C:/Program Files/Java/jdk1.8.0_201/jre/bin/server/jvm.dll
【参考方案5】:
Maven $java.home 属性根据你的 Eclipse 执行设置和取自不同的地方:
来自为工作区选择的默认 JRE
Window>Preferences>Java>已安装的 JRE
来自特定的 Eclipse 项目,
Java 构建路径>库>JRE 系统库
来自运行配置。
运行配置> 特定运行配置 > JRE
记住您的 JRE 主路径指向 JDK 或 JDK 下的 JRE
【讨论】:
这个答案在 6 年后仍然准确(对于 Eclipse 2020-09)!就我而言,运行配置设置是错误的。【参考方案6】:添加 JAVA_HOME 环境变量时,如果路径中有空格,则必须将整个内容用引号括起来。
【讨论】:
【参考方案7】:您不应该使用系统范围依赖项。 tools.jar 中的所有代码都可以通过正在运行的 JVM 获得。你应该完全删除这个依赖..
另外,为了检查 Maven 正在使用什么运行时,只需调用
mvn -v
如果您对工具 jar 的依赖仍然存在问题,则您添加的依赖项之一具有该依赖项(而且质量确实很差)。找出它运行的是哪一个
mvn dependency:tree
或者如果失败,只需删除一个又一个依赖项,直到上述命令的问题消失。
然后,当您知道它的来源时,您就可以决定下一步该做什么。一种方法是对引入工具的依赖项使用排除项。
【讨论】:
我知道我永远不应该使用系统范围依赖项,但是正如我在问题中所传达的那样,当我没有提到依赖项中的 tools.jar 时,maven 开始抱怨缺少工件“com.sun:tools:罐子:1.4.2"。 下面是 mvn -v C:\>mvn -v Apache Maven 3.0.3 (r1075438; 2011-02-28 23:01:09+0530) Maven home: C:\自定义程序\apache-maven-3.0.3\bin\.. Java 版本:1.6.0_26,供应商:Sun Microsystems Inc. Java 主页:C:\Program Files\Java\jdk1.6.0_26\jre 默认语言环境:en_US,平台编码:Cp1252 操作系统名称:“windows xp”,版本:“5.1”,arch:“x86”,家族:“windows”【参考方案8】:您的 JAVA_HOME 似乎设置为指向 Eclipse 中的 JRE。
【讨论】:
【参考方案9】:听起来您是在 Eclipse 中运行 Maven。 Eclipse 不咨询 JAVA_HOME。
确保您已将 Eclipse 首选项中的 JRE 设置为所需的 JDK。
【讨论】:
以上是关于Maven 没有正确选择 JAVA_HOME的主要内容,如果未能解决你的问题,请参考以下文章
在pom.xml中的dependencies点击add怎么没有搜索到相关jar包
Maven 构建和 maven-failsafe-plugin - 分叉的虚拟机在没有正确说再见的情况下终止