You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Java程序执行带参数的Jar文件?执行失败退出码1求助

问题:Java调用OpenAPI Generator CLI返回退出码1无预期输出

目标执行命令

预期在命令行执行的有效命令:

java -jar openapi-generator-cli.jar generate -g spring -i petstore.yml --skip-validate-spec -o output/

编写的Java代码

public static void main(String[] args) throws InterruptedException, IOException {
    
    String filePath = "C:\\swagger-to-code-poc\\swagger-to-code\\src\\main\\resources\\";
    String jarFileName = "openapi-generator-cli.jar";
    Process process = exec(filePath, jarFileName);
    System.out.println(process.info());
    BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
    //BufferedInputStream errorBufferedInputStream = new BufferedInputStream(process.getErrorStream());
    synchronized (process) {
        process.waitFor(120, TimeUnit.SECONDS);
    }
    String line;
    while((line = reader.readLine()) != null) {
        System.out.println(line);
    }

    int exitCode = process.waitFor();
    System.out.println("ExitCode : "+exitCode);

    reader.close();
}

public static Process exec(String path, String filename) throws IOException {
    String javaHome = System.getProperty("java.home");
    String javaBin = javaHome +
            File.separator + "bin" +
            File.separator + "java";

    ProcessBuilder pb = new ProcessBuilder(javaBin, "-jar", path+filename, "generate",
            "-i C:\\swagger-to-code-poc\\swagger-to-code\\src\\main\\resources\\petstore.yml", "-g spring",
            "-o C:\\swagger-to-code-poc\\swagger-to-code\\src\\main\\resources\\output\\");

    System.out.println("Command : "+pb.command());
    return pb.start();
}

说明:petstore.yml与openapi-generator-cli.jar均存在于/src/main/resources/目录下

控制台输出

Command : [C:\Eclipse_2020-06\jdk-11.0.7+10\bin\java, -jar, C:\swagger-to-code-poc\swagger-to-code\src\main\resources\openapi-generator-cli.jar, generate, -i C:\swagger-to-code-poc\swagger-to-code\src\main\resources\petstore.yml, -g spring, -o C:\swagger-to-code-poc\run-using-cli\output\]
[cmd: C:\Eclipse_2020-06\jdk-11.0.7+10\bin\java.exe, startTime: Optional[2023-06-25T18:19:21.457Z], totalTime: Optional[PT0.015625S]]
ExitCode : 1

Process finished with exit code 0

问题原因与解决方法

1. 命令参数拆分错误

ProcessBuilder要求每个命令参数必须单独拆分,不能将选项(如-i)和对应值合并成一个字符串。你当前的写法会让OpenAPI Generator把"-i C:\\xxx\\petstore.yml"整个字符串当作-i的参数值,导致无法识别正确的文件路径。

修正后的exec方法参数写法:

public static Process exec(String path, String filename) throws IOException {
    String javaHome = System.getProperty("java.home");
    String javaBin = javaHome +
            File.separator + "bin" +
            File.separator + "java";

    // 每个选项和值拆分独立参数,同时补上原命令中的--skip-validate-spec
    ProcessBuilder pb = new ProcessBuilder(javaBin, "-jar", path+filename, "generate",
            "-i", "C:\\swagger-to-code-poc\\swagger-to-code\\src\\main\\resources\\petstore.yml", 
            "-g", "spring",
            "-o", "C:\\swagger-to-code-poc\\swagger-to-code\\src\\main\\resources\\output\\",
            "--skip-validate-spec");

    System.out.println("Command : "+pb.command());
    return pb.start();
}

2. 未读取错误输出流

程序仅读取了标准输出流,但命令执行失败的核心原因通常会输出到错误输出流。如果错误流缓冲区被占满,进程会被阻塞并提前退出,导致无法获取失败原因。需要异步读取错误输出流:

修正后的main方法:

public static void main(String[] args) throws InterruptedException, IOException {
    
    String filePath = "C:\\swagger-to-code-poc\\swagger-to-code\\src\\main\\resources\\";
    String jarFileName = "openapi-generator-cli.jar";
    Process process = exec(filePath, jarFileName);
    System.out.println(process.info());

    // 读取标准输出
    BufferedReader stdoutReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
    // 读取错误输出
    BufferedReader stderrReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));

    // 异步读取错误输出,避免阻塞进程
    new Thread(() -> {
        String line;
        try {
            while((line = stderrReader.readLine()) != null) {
                System.err.println("错误输出: " + line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                stderrReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }).start();

    // 读取标准输出
    String line;
    while((line = stdoutReader.readLine()) != null) {
        System.out.println(line);
    }

    int exitCode = process.waitFor();
    System.out.println("ExitCode : "+exitCode);

    stdoutReader.close();
}

3. 额外注意事项

  • 确认输出目录output\已存在,或确保OpenAPI Generator版本支持自动创建目录
  • 检查文件路径是否包含空格或特殊字符,避免转义错误
  • 确保当前Java进程拥有访问目标文件和目录的权限

内容的提问来源于stack exchange,提问作者Ranjit Soni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 18:24:53