如何用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
相关产品推荐
相关产品推荐

