Search code examples
javaioexceptionprocessbuilder

Cannot run program "C:\Program Files\Java\jdk1.8.0_221\jre\bin\java" Invalid directory name


I have a "slave" program and a "master" program. The master program is executing the slave, and then, the slave is executing another program (an external program). It makes possible the reboot of the master program without ending external programs. But this is my problem : I can run the slave program from the master program using processbuilder, but the slave can't find java with his processbuilder. Made I a mistake ?

I've already tried to change the slave execute directory and the master executing directory. But no changes.

Master's Processbuilder

        final String javaCmd = System.getProperty("java.home") + File.separator + "bin" + File.separator + "java";
        final List<String> bpArgs = new ArrayList<>();
        bpArgs.add(javaCmd);
        bpArgs.add("-jar");
        bpArgs.add(gameServer.getSlavePath());
        bpArgs.add("servers/" + gameServer.getName().toLowerCase() + "/" + serverName);
        bpArgs.add(gameServerVersion.executable);
        final ProcessBuilder pb = new ProcessBuilder(bpArgs);
        pb.directory(new File("").getAbsoluteFile()); // Run into the current directory

        try {
            final Process p = pb.start();
            <...>
        } catch (IOException e) {
            <...>
        }

Slave's Processbuilder

        final String javaCmd = System.getProperty("java.home") + File.separator + "bin" + File.separator + "java";
        List<String> bpArgs = new ArrayList<>();
        bpArgs.add(javaCmd);
        // TODO: Add RAM args
        // Game args
        bpArgs.add("-Dcom.mojang.eula.agree=true");
        bpArgs.add("-DIReallyKnowWhatIAmDoingThisUpdate=true");
        bpArgs.add("-jar");
        bpArgs.add(args[1]); // executable JAR file
        log("Starting with arguments >>> " + bpArgs.toString());
        final ProcessBuilder pb = new ProcessBuilder(bpArgs);
        pb.directory(new File("servers/minecraft/" + args[0])); // Run into the game directory

        try {
            p = pb.start();
            <...>
            p.waitFor();
            log("Server stopped with exit code " + p.exitValue());
        } catch (InterruptedException e) {
            <...>
        } catch (IOException e) {
            <...>
        }

This is my actual output :

java.io.IOException: Cannot run program "C:\Program Files\Java\jdk1.8.0_221\jre\bin\java" (in directory "servers\minecraft\servers\minecraft\Hellow"): CreateProcess error=267, Invalid directory name
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
    at eu.gameinbox.svm.slave.MinecraftSlave.main(MinecraftSlave.java:33)
Caused by: java.io.IOException: CreateProcess error=267, Invalid directory name
    at java.lang.ProcessImpl.create(Native Method)
    at java.lang.ProcessImpl.<init>(ProcessImpl.java:386)
    at java.lang.ProcessImpl.start(ProcessImpl.java:137)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
    ... 1 more

I just want the slave's processbuilder to work. Thanks for your future help !


Solution

  • I've found the problem ! Thanks to VivekRatanSinha !

    The server was in servers/minecraft/Hellow not in server/minecraft/Hellow/minecraft

    In my slave's processbuilder I used

    pb.directory(new File("servers/minecraft/" + args[0]));
    

    But the args 0 was the total path not the server name !

    I just changed it to

    pb.directory(new File(args[0]));
    

    And now it works fine.