【问题标题】:running mvn using ProcessBuilder使用 ProcessBuilder 运行 mvn
【发布时间】:2011-11-01 12:09:40
【问题描述】:

我创建了一个使用 ProcessBuilder 创建进程然后启动进程的类

ProcessBuilder pb = new ProcessBuilder("mvn","exec:java","-Dexec.mainClass="+"FunnyClass");

现在,当我在 linux 机器上运行这个类时,它运行良好,但在 windows 上它给我错误,说明找不到 'mvn' 之类的东西,我需要更改为

ProcessBuilder pb = new ProcessBuilder
                       ("mvn.bat","exec:java","-Dexec.mainClass="+"FunnyClass");

但如果我在命令提示符“mvn exec:java -Dexec.mainClass=FunnyClass”上运行命令,它运行良好。那么为什么我需要在 processbuilder 中提供 mvn.bat。

有什么解决办法吗?

我的 java 应用程序将在 windows 和 linux 机器上运行,那么我该怎么办?

【问题讨论】:

    标签: java maven-2


    【解决方案1】:

    发生这种情况是因为 Windows shell (cmd) 有一个功能:它会尝试将扩展名exe、'bat'、'cmd' 添加到您正在运行的命令行中。一旦找到第一个匹配项(即文件系统中确实存在的文件),它就会运行它。

    如果是 maven,你有 unix shell 脚本mvn,不能在 windows 和 windows 批处理文件 '.bat' 上执行。命令提示符将“.bat”添加到您在命令提示符中键入的“mvn”,看到该文件存在并运行它。

    当你从 java 运行进程时,你没有 shell,所以没有人做这个工作。 我建议您检查操作系统并按操作系统保留命令。如果您想要明确的解决方案,请创建资源文件 cmd.properties:

    mvn.windows = mvn.bat
    mvn.unix = mvn
    

    现在使用系统属性os.name 检查操作系统并使用来自cmd.properties 的数据创建命令。

    替代解决方案是在 windows 上使用 cmd /c 运行命令,在 unix 上使用 '/bin/sh -c' 运行命令,但它不会简化任何事情,所以我会避免这种情况。

    【讨论】:

    • 谢谢,我想用 System.getProperty("os.name") 检查操作系统。我不知道 当你从 java 运行进程时你没有 shell。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    相关资源
    最近更新 更多