基于JDK17的JAR调用需JRE<1.8的外部JAR失败求助
解决JDK17项目中启动依赖JRE6的JAR文件问题
问题根源
你之前的尝试没成功,核心原因是:
- 依赖
JAVA_HOME环境变量切换JRE不可靠,子进程可能仍继承父进程的Java环境,或者PATH里的系统默认Java优先级更高。 - ProcessBuilder代码里的路径转义错误(
env.put的路径多了一个结尾引号),且用cmd.exe /c执行原有命令时,命令里的set JAVA_HOME会覆盖你设置的环境变量。
可行解决方案:直接指定JRE6的java.exe路径
最稳妥的方式是跳过环境变量,直接调用JRE6目录下的java.exe运行目标JAR,彻底隔离父进程的JDK17环境。
代码示例(ProcessBuilder版)
ProcessBuilder processBuilder = new ProcessBuilder(); try { // 直接指定JRE6的java.exe绝对路径,拆分传入所有启动参数 processBuilder.command( "C:\\ExtensieImpoziteYCS\\duk\\jre6\\bin\\java.exe", "-jar", "duk/DUKIntegrator.jar", "-s", "P2000", "duk/P2000.xml", "duk/P2000-err.txt", "0", "0", "$", "$", "aladdin", "5" ); // 可选:如果目标JAR依赖相对路径,设置正确的工作目录 // processBuilder.directory(new File("你的项目根目录路径")); // 合并错误流到标准输出,避免进程因缓冲区满阻塞 processBuilder.redirectErrorStream(true); Process process = processBuilder.start(); StringBuilder output = new StringBuilder(); BufferedReader reader = new BufferedReader( new InputStreamReader(process.getInputStream()) ); String line; while ((line = reader.readLine()) != null) { output.append(line).append("\n"); } int exitVal = process.waitFor(); if (exitVal == 0) { System.out.println("执行成功!"); System.out.println(output); } else { System.err.println("执行失败,错误输出:"); System.err.println(output); } } catch (IOException | InterruptedException e) { e.printStackTrace(); }
关键说明
- 直接指定java.exe路径:彻底绕开环境变量干扰,确保用JRE6运行目标JAR。
- 拆分命令参数:ProcessBuilder的
command方法单独传入每个参数,避免字符串拼接带来的引号转义错误。 - 合并错误流:
redirectErrorStream(true)将错误输出合并到标准输出,统一读取防止进程阻塞。 - 工作目录检查:如果目标JAR使用的相对路径(如
duk/xxx)基于特定目录,通过processBuilder.directory()设置对应路径。
为什么之前的方法失效?
Runtime.getRuntime().exec(cmd)里的set JAVA_HOME & java -jar:Windows CMD中set仅在当前进程生效,但java可能优先调用PATH里的系统默认Java,而非指定的JRE6。- ProcessBuilder代码中,先设置
JAVA_HOME后又用cmd.exe /c执行原有命令,命令内的set JAVA_HOME会覆盖通过env.put设置的变量,且路径末尾多引号导致环境变量设置错误。
内容的提问来源于stack exchange,提问作者AurysVrV
相关产品推荐
相关产品推荐

