groovy 无法通过ProcessBuilder.start()运行进程,因为找不到命令

kxxlusnw  于 2023-05-16  发布在  其他
关注(0)|答案(1)|浏览(151)

我试图通过Groovy运行mvn ...命令。
这是我写的:

def mvnPath = System.getenv("MAVEN_HOME") + "/bin/mvn"
def pomPath = new File("./pom.xml").getAbsolutePath()
Process mavenPrimaryPackagingProcess = new ProcessBuilder(
        "${mvnPath} primary-package -Pfull-release -f ${pomPath}"
    )
    .directory(new File("."))
    .redirectOutput(ProcessBuilder.Redirect.INHERIT)
    .start()

然而,当我运行上面的代码时,我得到了以下异常:
线程“main”出现异常java.io.IOException:无法运行程序“c:\Maven\maven-3.8.4/bin/mvn primary-package -Pfull-release -f D:\projectRoot.\pom.xml”(在目录“.”中):CreateProcess error=2,Le fichier spécifié est introuvable
(The“Le fichier spécifié est introuvable”是法语,意思是“系统找不到指定的文件”)。
从异常消息中可以看到,mvn可执行文件和pom.xml都是完全限定的,所以我真的不明白哪个是找不到的文件。
这段代码是通过java -jar ...在命令行上调用来运行的,终端设置在D:\projectRoot上(与我在new File(".")上打印的文件夹相同)。

yhuiod9q

yhuiod9q1#

它看起来像你已经省略了正确的文件扩展名为MVN命令在Windows上“.CMD”,并需要追加,使路径名解析正确-使用System.getenv("MAVEN_HOME") +"/bin/mvn.cmd"
Java不像CMD / Powershell,如果提供的路径名不存在,它会检查PATHEXT后缀。
根据@daggett的评论,您还需要拆分参数以使用ProcessBuilder(String... command),它的工作方式与容易出错的参数拆分调用Runtime.getRuntime.exec(String)不同。
如果您拆分参数,但没有为MVN命令指定正确的文件扩展名,则应该看到不同的错误:

new ProcessBuilder(System.getenv("MAVEN_HOME") + "/bin/mvn", "your", "other", "arguments ...").start()
=> Exception java.io.IOException: Cannot run program "C:\whatever\apache-maven-3.9.1/bin/mvn": 
   CreateProcess error=193, %1 is not a valid Win32 application

相关问题