我正在试图在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),这些构建的工具都可以正常工作(composer
、bundle
、devenv.com
)。但是,如果脚本控制台在尝试运行mvn
命令时返回相同的错误,那么我认为执行构建的方式并不重要。
编辑2: 我越看越觉得这与Jenkins没有任何关系,而是与在Windows上执行shell脚本的方式有关。当我使用脚本控制台在从节点上调用Groovy脚本时,Jenkins只是将其写入从节点上的临时文件,并使用sh -xe <script>
来调用它。当我直接在Windows机器上尝试类似的方法时,每个基于脚本的命令(例如mvn
、composer
)都无法在shell脚本中运行,除非我在命令前加上sh
。这很不幸,因为我运行的脚本在未来可能会在Linux或Mac节点上运行,我不想用Windows特定的命令来污染它。我已经尝试了Git Bash和Msysgit,并得到了相同的结果。接下来,我将尝试Cygwin看看是否可行...
composer
、bundle
、npm
或其他基于脚本的命令都返回相同的错误。最近我们的Jenkins主服务器已经升级了,所以我想这可能与升级有关。我将尝试卸载从(现在已升级的)主服务器安装的从服务器服务并重新安装。 - Jason Zmvn
,而不是Python脚本? - Slavmvn
命令。为什么批处理可以运行而 shell 执行不了呢?还有,我要运行的 shell 命令使用的是已安装在从设备上的路径#!D:\msysgit\bin\sh.exe --login -i
。难道 shell 脚本会以与批处理脚本不同的权限运行吗? - Jason Zshell
。你是否尝试过(而不是尝试在Windows上运行sh
)在Windows上运行Python?然后你只需要使用“执行批处理”来启动Python脚本。 - Slav.bat
文件。相反,它们有一个名为mvn.cmd
的批处理文件,只是扩展名不同而已。因此,如果你从“执行批处理”或Windows命令提示符中运行mvn
,它会自动执行mvn.cmd
。但是,由于你是从sh
中运行的,所以没有这样的自动操作。就像我说的,我没有运行sh.exe
的经验。 - Slav