Git for Windows(64位)中的Maven classworlds.launcher.Launcher错误

10

我已经在Git Bash (64位)上使用Maven几个月了,突然它停止工作,并且现在在任何maven命令上生成此错误:

myuser@mypc MINGW64 ~ (master *)
$ mvn -v
Error: Could not find or load main class org.codehaus.plexus.classworlds.launcher.Launcher

我看过许多SO上的问题,包括这个问题:Maven error: Could not find or load main class org.codehaus.plexus.classworlds.launcher.Launcher,但是没有解决我的问题。

我已经升级到最新的Git for Windows(2.14.2.windows.2)从2.12,但问题仍然存在。

我的Maven安装在C:\apache-maven-3.5.0\bin,它已在我的PATH变量中:

myuser@mypc MINGW64 ~ (master *)
$ echo $PATH
...:/c/jdk1.7.0_79/bin:/c/apache-maven-3.5.0/bin:...

我也已经正确设置了JAVA_HOME:

myuser@mypc MINGW64 ~ (master *)
$ echo $JAVA_HOME
C:\jdk1.7.0_79

我已经尝试添加/删除MAVEN_HOME,但似乎在Apache Maven启动脚本(C:\ apache-maven-3.5.0 \ bin \ mvn)中没有检测到:

myuser@mypc MINGW64 ~ (master *)
$ echo $MAVEN_HOME
c:\apache-maven-3.5.0

如果我进入Apache Maven启动脚本,并将${MAVEN_HOME}的实例替换为C:\apache-maven-3.5.0,则似乎可以找到Launcher类并正确执行。

像这样进行编辑:

CLASSWORLDS_JAR=`echo "${MAVEN_HOME}"/boot/plexus-classworlds-*.jar`
  to
CLASSWORLDS_JAR=`echo /c/apache-maven-3.5.0/boot/plexus-classworlds-*.jar`

然后生成:

myuser@mypc MINGW64 ~ (master *)
$ mvn -v
Apache Maven 3.5.0 (ff8f5e7444045639af65f6095c62210b5713f426; 2017-04-03T15:39:06-04:00)
Maven home: C:\apache-maven-3.5.0
Java version: 1.7.0_79, vendor: Oracle Corporation
Java home: C:\jdk1.7.0_79\jre
Default locale: en_US, platform encoding: Cp1252
OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows"
这是一个不太优雅的解决方法,我更希望找到合适的解决方案。有哪些环境或配置更改可以尝试,使Maven在没有硬编码路径的情况下运行?
VonC的答案中的步骤/结果:
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\windows\system32>set PATH=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\
C:\windows\system32>set GH=C:\Program Files\Git
C:\windows\system32>set PATH=%GH%\bin;%GH%\usr\bin;%GH%\mingw64\bin;%PATH%
C:\windows\system32>set PATH=%JAVA_HOME%\bin;%MAVEN_HOME%\bin;%PATH%

C:\windows\system32>echo %PATH%
C:\jdk1.7.0_79\bin;c:\apache-maven-3.5.0\bin;C:\Program Files\Git\bin;C:\Program Files\Git\usr\bin;C:\Program Files\Git\mingw64\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\

C:\windows\system32>echo %M2_HOME%
C:\apache-maven-3.5.0

C:\windows\system32>mvn -v
Apache Maven 3.5.0 (ff8f5e7444045639af65f6095c62210b5713f426; 2017-04-03T15:39:06-04:00)
Maven home: c:\apache-maven-3.5.0\bin\..
Java version: 1.7.0_79, vendor: Oracle Corporation
Java home: C:\jdk1.7.0_79\jre
Default locale: en_US, platform encoding: Cp1252
OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows"

C:\Windows\System32>bash

myuser@mypc MINGW64 /c/Windows/System32
$ mvn -v
Error: Could not find or load main class org.codehaus.plexus.classworlds.launcher.Launcher

myuser@mypc MINGW64 /c/Windows/System32
$ echo $M2_HOME
C:\apache-maven-3.5.0

S279887@P2025774 MINGW64 /c/Windows/System32
$ echo $MAVEN_HOME
c:\apache-maven-3.5.0
在进一步调试后,我发现我的问题与MINGW Git bash中的Maven错误: Could not find or load main class org.codehaus.plexus.classworlds.launcher.Launcher相同,其中MAVEN_HOME变量在代码的这个部分被清除:
# For MinGW, ensure paths are in Unix format before anything is touched
if $mingw ; then
  [ -n "$MAVEN_HOME" ] &&
    MAVEN_HOME=`(cd "$MAVEN_HOME"; pwd)`
  [ -n "$JAVA_HOME" ] &&
    JAVA_HOME=`(cd "$JAVA_HOME"; pwd)`
  # TODO classpath?
fi

如果我在bash会话中运行有问题的代码[[ -n "$MAVEN_HOME" ]] && MAVEN_HOME=`(cd "$MAVEN_HOME"; pwd)`,我可以在最新的Git for Windows中重现该行为:

myuser@mypc MINGW64 ~ (master *)
$ git --version
git version 2.14.2.windows.3

myuser@mypc MINGW64 ~ (master *)
$ echo $MAVEN_HOME
c:\apache-maven-3.5.0

myuser@mypc MINGW64 ~ (master *)
$ [[ -n "$MAVEN_HOME" ]] && MAVEN_HOME=`(cd "$MAVEN_HOME"; pwd)`

myuser@mypc MINGW64 ~ (master *)
$ echo $MAVEN_HOME


myuser@mypc MINGW64 ~ (master *) 
$
当我直接执行这个命令时,返回的是当前目录而不是我期望得到的MAVEN_HOME。假设这是因为该命令在子shell中执行所致,对吗?
myuser@mypc MINGW64 ~ (master *)
$ echo `(cd "$MAVEN_HOME"; pwd)`
/c/home

myuser@mypc MINGW64 ~ (master *)
$ `(cd "$MAVEN_HOME"; pwd)`
bash: /c/home: Is a directory

请详细分享JAVA_HOME和MAVEN_HOME的配置以及正在使用的git bash版本。 - Naman
@nullpointer 谢谢 - 已经加入到问题中,如果您需要更多信息,请告诉我。 - mcknz
1
只是想说我将 MAVEN_HOME=\(cd "$MAVEN_HOME" ; pwd)`更改为MAVEN_HOME=$(cd "$MAVEN_HOME" ;pwd),现在它按照我的预期工作。我不是一个很好的 bash 脚本编写者,所以我不知道这两种符号($() vs \`) 的确切区别,但它们确实有所不同,这就是我会这样做的原因。 - MaxouMask
1个回答

1

首先需要测试的是 %PATH% 变量:在 CMD 会话中,设置一个简化PATH

set PATH=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\
set GH=C:\path\to\git
set PATH=%GH%\bin;%GH%\usr\bin;%GH%\mingw64\bin;%PATH%

请注意,C:\WINDOWS\...路径被保留在PATH的末尾:这很重要。
然后在%JAVA_HOME%\bin<maven>\bin的路径之前加上。
确保将M2_HOME设置为C:\apache-maven-3.5.0
最后,在当前CMD或(在同一Windows中)git bash会话中(只需键入“bash”),测试您的mvn命令。
最后,根据您的程序和操作系统品牌,请不要忘记使用Windows 10,您现在拥有WSL和完整的Linux bash。 这可以是一个可能的替代方案。

谢谢 - 不幸的是,我在这个问题上卡住了,使用的是Win7。我已经将我的结果添加到了问题中。这是否意味着我需要重新排列我的路径? - mcknz
是的,请按照我描述的方式设置您的路径,切掉不必要的部分。 - VonC
@mcknz 当您键入 echo $M2_HOME 时,您看到什么?在您的bash会话中尝试:export M2_HOME=/c/‌​apache-maven-3.5.0(没有尾随的 bin/,如 https://dev59.com/oWgu5IYBdhLWcg3wuJWF#18155226 所示) - VonC
@mcknz,我猜最新的https://github.com/git-for-windows/git/releases? (2.14.2(3))仍然存在问题。 - VonC
1
是的,我刚刚升级到了2.14.2.windows.3版本,但问题仍然存在。我已经在我的问题描述中添加了更多细节,以便准确描述我的经历。我可能会尝试将Git for Windows降级到早期版本,以查看是否存在问题。或者我可能只需注释掉mvn的那一部分即可。 - mcknz
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接