我正在尝试从 Groovy 脚本中运行 Maven 构建。但似乎找不到 Maven。
\n\n我已经检查了路径变量,它包含正确的路径。如果我专门通过C:/\xe2\x80\xa6/mvn.cmd
它执行 mvn 。
我现在使用System.getenv()
它修复了丢失的 Java_home 变量,但这对 mvn 没有帮助。奇怪的是,命令git \xe2\x80\xa6
甚至不需要指定环境就可以工作。
我也知道我可以通过打开 cmd 并在那里运行命令来解决这个问题,但我不能这样做,因为它也必须在 Mac 或 Linux 机器上运行。
\n\nFile workingDir = new File(*MYWORKINGDIRECTORY*)\ndef mvnbuild = \'mvn package\'.execute(System.getenv().collect { k, v -> "$k=$v" }, workingdir)\n\nmvnbuild.waitForProcessOutput(System.out, System.err)\n
Run Code Online (Sandbox Code Playgroud)\n\n这会产生以下错误消息:
\n\n2019-11-05 13:57:12.631 ERROR *MYSCRIPT* FAILED.\nReason:\njava.io.IOException: Cannot run program "mvn" (in directory "C:\\Users\\*MYWORKINGDIRECTORY*"): CreateProcess error=2, The system cannot find the file specified\n
Run Code Online (Sandbox Code Playgroud)\n\n如果我通过这个运行一些不同的命令,例如where
它工作得很好:
def mvnbuild = \'where mvn\'.execute(System.getenv().collect { k, v -> "$k=$v" }, workingdir)\n\nmvnbuild.waitForProcessOutput(System.out, System.err)\n
Run Code Online (Sandbox Code Playgroud)\n\n产生
\n\nC:\\*THECORRECTMAVENPATH*\\apache-maven-3.6.0\\bin\\mvn\nC:\\*THECORRECTMAVENPATH*\\apache-maven-3.6.0\\bin\\mvn.cmd\n
Run Code Online (Sandbox Code Playgroud)\n\n尽管如果我尝试运行它会产生与上面相同的错误npm
PS:我也检查过System.getenv()
,它包含正确的Maven路径。
您在 Windows 上收到该错误的原因是您没有为其提供全名,包括扩展名。只要包含的目录位于变量中,您就不必为其提供完整路径Path
。
您可以输入mvn
Windows 命令解释器 (cmd.exe),它会起作用,因为它对扩展有点聪明。但 Groovy 和 Java 并没有经历这些。
相反,Groovy 的.execute()
方法委托给 Java 的,后者在 Windows 上调用win32 API 中ProcessBuilder
调用的本机函数。CreateProcess
在此函数中,如果不指定扩展名,它将假定它是一个.exe
文件。这就是为什么where
命令有效(实际上是where.exe
)和git
(实际上是git.exe
)但不能执行其他可执行类型(例如和 )的.bat
原因。.cmd
mvn.cmd
要以与多个平台兼容的方式修复它,我看到的最佳选择是检查使用的平台并相应地更改命令。沿着这些思路:
def mvnFileName = System.properties['os.name'].toLowerCase().contains('windows') ? 'mvn.cmd' : 'mvn'
def mvnbuild = "$mvnFileName package".execute() // ...
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6513 次 |
最近记录: |