Java 解决 Process 执行命令行命令报【CreateProcess error=2, 系统找不到指定的文件。】错误问题

文章讲述了在Java程序中使用ProcessBuilder执行命令时,IDEA环境中遇到CreateProcess错误的问题。作者提供了解决方案,即根据操作系统(Windows/Linux)启动相应的shell(cmd.exe/bash),并在代码中动态判断系统并添加相应参数。
摘要由CSDN通过智能技术生成

目录

问题

问题代码

解决方案

判断操作系统


问题

使用 Process 执行命令行命令时,报 CreateProcess error=2, 系统找不到指定的文件。但明明指定的文件是存在的。而且这种错误只在 IDEA 中运行会报错,打包后直接 java -jar 运行就能正常运行,不会报错。

问题代码

public class MyTest {

    public static void main(String[] args) throws Exception {
        Path dirPath = Paths.get("D:\\workspace\\funcproject");
        ProcessBuilder pb = new ProcessBuilder();
        pb.directory(dirPath.toFile());
        pb.command("fn", "version");

        Process process = pb.start();

        try (BufferedReader reader1 = new BufferedReader(new InputStreamReader(process.getInputStream()));
             BufferedReader reader2 = new BufferedReader(new InputStreamReader(process.getErrorStream()))) {
            String line;
            while ((line = reader1.readLine()) != null) {
                System.out.println(line);
            }

            while ((line = reader2.readLine()) != null) {
                System.out.println(line);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }

        process.waitFor();

    }

}

解决方案

以上面的问题代码为例,执行的命令行命令 fn 不是有效的可执行文件,而是由命令行 shell ( cmd.exe) 提供的命令。为了从其他进程运行此命令,必须启动cmd.exe并将参数传递给它。

在 Windows 开发环境下,需要在命令参数前面增加两个参数:"cmd.exe", "/C"

pb.command("cmd.exe", "/C", "fn", "version"); 

在 Linux 开发环境下,则新增两个参数为:"bash", "-c"

pb.command("bash", "-c", "fn", "version"); 

判断操作系统

打包后其实能正常运行,代码其实无需做调整。调试时可以在 IDEA 中将代码先改成可以正常运行的(先传入cmd.exe),然后在提交代码时再重新改回来。不过这样显然很麻烦,直接在通过代码来判断,先获取获取当前操作系统,然后根据不同的操作系统传入不同的 shell 名字。

public class MyTest {

    public void execute(String Command) throws Exception {
        ProcessBuilder pb = new ProcessBuilder();

        List<String> cmd = new ArrayList<>();
		String shell = getShellBySystem();
		cmd.add(shell);
		cmd.add(shell.equals("bash") ? "-c" : "/C");
        cmd.addAll(Arrays.asList(command.split(" ")));
        pb.command(cmd);

        Process process = pb.start();
        process.getInputStream();
        process.waitFor();
    }

    private String getShellBySystem() {
		String system = System.getProperty("os.name").toLowerCase();
		if (system.contains("win")) {
			return "cmd.exe";
		} else if (system.contains("linux")) {
			return "bash";
		} else {
			throw new RuntimeException(String.format("未知系统 %s", system));
		}
	}

}

当在使用docker-compose命令时,出现"docker compose idea createprocess error=2 系统不到指定文件"的错误提示时,通常是因为系统不到docker-compose文件的路径。 解决问题的方法有以下几种: 1.确认docker-compose已正确安装:首先要确保已在系统上正确安装了docker-compose。可以通过在命令行窗口中输入"docker-compose version"来验证。如果输出版本信息,则表示已正确安装;如果没有,则需要安装docker-compose。 2.检查docker-compose文件路径:在使用docker-compose命令时,需要确保docker-compose文件的路径正确。可以通过在命令行中输入"path"命令来查看系统的环境变量路径是否包含docker-compose的路径。如果没有,可以手动将docker-compose的路径添加到系统的环境变量中。 3.确认docker-compose文件是否存在:在使用docker-compose命令时,系统需要到docker-compose文件。要确保docker-compose文件存在于系统的路径中。可以尝试在命令行中直接输入docker-compose来验证是否能文件。如果不能到,则可以尝试重新安装docker-compose。 4.重启电脑:有时候,系统环境变量的改动需要重启电脑才能生效。如果以上方法都尝试过后仍然没有解决问题,可以尝试重启电脑来刷新系统的环境变量。 总结:出现"docker compose idea createprocess error=2 系统不到指定文件"的错误提示时,可能是因为docker-compose文件的路径未正确设置或文件不存在导致的。需要确认docker-compose是否正确安装,并检查docker-compose文件的位置是否正确。如果仍然无法解决问题,可以尝试重新安装docker-compose或重启电脑。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值