在Jenkins Windows从节点上,“mvn”命令未被识别。

3

我正在试图在Jenkins Windows从节点上构建一个Java项目,但当我尝试从Jenkins服务运行任何mvn命令时,我会收到一个错误,提示无法找到该命令:

java.io.IOException: Cannot run program "mvn": CreateProcess error=2, The system cannot find the file specified
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
at java.lang.Runtime.exec(Runtime.java:620)
...

注意: 如果我直接登录机器,运行任何 mvn 命令都可以正常工作。

Windows 从节点设置

Maven 安装在目录 D:\Apache\Maven 中。

设置系统环境变量:

  • JAVA_HOME = C:\Program Files\Java\jdk1.8.0_40
  • M2 = %M2_HOME%\bin
  • M2_HOME = D:\Apache\Maven

PATH 系统环境变量设置为 %M2%;...

从 Jenkins 主页面,如果我在 Windows 从节点上运行 Groovy 脚本 println System.getenv("PATH"),我可以看到 Maven 的 bin 目录的正确扩展路径。

我还可以通过运行以下命令来验证 Maven 的 bin 目录是否可见:

Groovy Script: println "ls -al D:/Apache/Maven/bin".execute().text

total 14
drwxr-xr-x    8 D-AUN-00 Administ     4096 Apr 20 12:35 .
drwxr-xr-x    9 D-AUN-00 Administ     4096 Mar 31 11:46 ..
-rw-r--r--    1 D-AUN-00 Administ      230 Mar 31 11:46 m2.conf
-rwxr-xr-x    1 D-AUN-00 Administ     7085 Apr 20 11:49 mvn
-rw-r--r--    1 D-AUN-00 Administ     6007 Mar 31 11:46 mvn.cmd
-rwxr-xr-x    1 D-AUN-00 Administ     1796 Mar 31 11:46 mvnDebug
-rw-r--r--    1 D-AUN-00 Administ     1513 Mar 31 11:46 mvnDebug.cmd
-rwxr-xr-x    1 D-AUN-00 Administ     1843 Mar 31 11:46 mvnyjp

有趣的是,如果我使用mvn.cmd运行Maven,则Maven可以正常运行:

Groovy Script: println "mvn.cmd --version".execute().text

Apache Maven 3.3.1 (cab6659f9874fa96462afef40fcf6bc033d58c1c; 2015-03-13T15:10:27-05:00)
Maven home: D:\Apache\Maven
Java version: 1.8.0_40, vendor: Oracle Corporation
Java home: C:\Program Files\Java\jdk1.8.0_40\jre
Default locale: en_US, platform encoding: Cp1252
OS name: "windows 8.1", version: "6.3", arch: "amd64", family: "dos"

问题: 有什么我遗漏或设置不当的地方会导致mvn命令无法被识别吗?


编辑: 我运行的构建使用一个自定义的Python bash脚本来调用Maven。该脚本还设置为运行其他语言项目的构建(PHP、Ruby、.NET、Node),这些构建的工具都可以正常工作(composerbundledevenv.com)。但是,如果脚本控制台在尝试运行mvn命令时返回相同的错误,那么我认为执行构建的方式并不重要。


编辑2: 我越看越觉得这与Jenkins没有任何关系,而是与在Windows上执行shell脚本的方式有关。当我使用脚本控制台在从节点上调用Groovy脚本时,Jenkins只是将其写入从节点上的临时文件,并使用sh -xe <script>来调用它。当我直接在Windows机器上尝试类似的方法时,每个基于脚本的命令(例如mvncomposer)都无法在shell脚本中运行,除非我在命令前加上sh。这很不幸,因为我运行的脚本在未来可能会在Linux或Mac节点上运行,我不想用Windows特定的命令来污染它。我已经尝试了Git Bash和Msysgit,并得到了相同的结果。接下来,我将尝试Cygwin看看是否可行...


好的,那就不要管它了,之前有效的composerbundlenpm或其他基于脚本的命令都返回相同的错误。最近我们的Jenkins主服务器已经升级了,所以我想这可能与升级有关。我将尝试卸载从(现在已升级的)主服务器安装的从服务器服务并重新安装。 - Jason Z
1
请确保如果您正在运行Windows从机,请使用“执行Windows批处理命令”来启动Python脚本,而不是“执行shell”(这是针对Linux节点的)。您是否尝试过,在“执行Windows批处理命令”构建步骤中,只需键入mvn,而不是Python脚本? - Slav
@Slav 非常有趣!我尝试了一下,批处理脚本可以完美运行 mvn 命令。为什么批处理可以运行而 shell 执行不了呢?还有,我要运行的 shell 命令使用的是已安装在从设备上的路径 #!D:\msysgit\bin\sh.exe --login -i。难道 shell 脚本会以与批处理脚本不同的权限运行吗? - Jason Z
1
我觉得这不是权限问题,而是环境继承的问题。老实说,我不知道如何在Windows环境下运行shell。你是否尝试过(而不是尝试在Windows上运行sh)在Windows上运行Python?然后你只需要使用“执行批处理”来启动Python脚本。 - Slav
我刚试了最新的Maven二进制压缩包,你说得对,没有.bat文件。相反,它们有一个名为mvn.cmd的批处理文件,只是扩展名不同而已。因此,如果你从“执行批处理”或Windows命令提示符中运行mvn,它会自动执行mvn.cmd。但是,由于你是从sh中运行的,所以没有这样的自动操作。就像我说的,我没有运行sh.exe的经验。 - Slav
显示剩余4条评论
3个回答

0

在Jenkins主节点和客户端上,Maven安装文件夹应该是相同的。请检查主节点和从节点上的文件夹位置是否相同。

除此之外,您的环境属性是正确的,但请检查您是否已将属性添加到用户或系统属性下。如果您已将属性添加到用户下,并且正在将Jenkins从节点作为Windows服务启动,则我认为Jenkins不会获取这些值。


主服务器是Linux系统,从服务器是Windows系统,因此我认为不可能在同一目录中同时安装Maven。我还应该指出,我没有使用Jenkins来运行Maven,而是从脚本中调用Maven(我会添加这个注释)。无论如何,我希望能够直接从从节点的脚本控制台中调用mvn命令。关于环境变量,由于Jenkins从节点服务作为本地系统配置文件帐户运行(或类似帐户),因此所有内容都在系统属性下完成。 - Jason Z
好的,我以为您已将Jenkins作业配置为“构建maven2 / 3项目”项目,并直接从构建步骤调用maven命令。你说的从脚本中调用maven是什么意思? Jenkins中是“执行Windows批处理命令”还是“执行Apache Ant”或其他内容。 此外,在Jenkins中,单击从节点->配置->节点属性,并检查是否为“环境变量”和“工具位置”设置了正确的值。 - Ashay Batwal
是的,抱歉,我正在使用“执行 shell”来执行 Python 脚本,并尝试从那里运行命令。然而,我越看越觉得这甚至与 Jenkins 无关。似乎除非在命令前面添加 sh,否则在 shell 脚本中运行任何 shell 脚本都会失败。当我在节点上使用脚本控制台时,Jenkins 将 Groovy 脚本转换为 shell 脚本文件,并在节点上使用 sh ... 调用它。 - Jason Z

0
原来这与在不同工具上调用Windows上的Shell命令有关。
Jenkins脚本控制台和Groovy
在Jenkins中,当使用Windows节点的“脚本控制台”时,Groovy脚本将调用脚本命令,就好像它们是Win32应用程序或BATCH脚本调用(例如,“mvn --version”。execute()将不起作用,因为mvn是一个shell脚本 - “mvn.cmd --version”。execute()将起作用,因为mvn.cmd是一个BATCH脚本)。
在Windows节点上运行Groovy脚本命令时,需要在命令之前加上sh以明确表示使用Shell脚本。这假设您的Windows节点在其PATH系统环境变量中具有指向Shell可执行文件的路径。
可以使用以下示例Groovy脚本,在Windows节点上调用时可以正常工作:
println "sh mvn --version".execute().text

Windows 上的 Python

我也意识到我的 Python 构建脚本存在类似的问题。如果你在 Windows 上尝试运行调用 shell 脚本的 Python 脚本,它将无法工作,除非在调用中包含 shell=True。或者,你可以在命令前加上 sh 来显式地调用 shell。

注意:这对于一些像 Ruby 的 bundle 这样的工具不起作用 - 对于这些命令,只有使用 shell=True 才能正常工作。

示例 Python 脚本,在 Windows 的 shell 环境中调用时可以正常工作:

#!/usr/bin/env python
import subprocess
subprocess.call("mvn --version", shell=True)

0
我解决了这个问题,只需在“执行Shell”窗口标题中添加“#!/usr/bin/env zsh --login”即可。非常简单。

我使用的是MAC电脑而不是Windows。 - yingjun liu

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