Почему я получаю java.lang.Error: Неразрешенная проблема компиляции, когда я выполняю свой main через Process в другом классе, но не когда я запускаю его сам? - PullRequest
0 голосов
/ 12 декабря 2018

Я использую Java, разрабатываю в Eclipse студенческий проект, в котором мне нужно построить простую распределенную систему.Я решил смоделировать это на одном компьютере с помощью нескольких процессов, однако, похоже, что-то делаю не так.

Итак, у меня есть класс Test, в котором я пытаюсь использовать ProcessBuilder для создания и выполнения трех процессов, выполняющихОсновным игроком другого класса.Когда я запускаю основной Player (с 3 аргументами) сам по себе, он, кажется, работает нормально (хотя он не прогрессирует, потому что ожидает 2 других игроков), но когда я пытаюсь запустить его через Test, я просто получаю следующий вывод:

Working dir: C:\Users\Jeremy Canning\git\cs-3700\cs-3700
Enter number of games to play: 
10
[java, -cp, bin, Player, 228.5.6.7, 6789, 10]
Exception in thread "main" Exception in thread "main" Exception in thread "main" 
java.lang.Error: Unresolved compilation problem: 

java.lang.Error: Unresolved compilation problem: 

at Player.main(Player.java:164)
at Player.main(Player.java:164)
java.lang.Error: Unresolved compilation problem: 

at Player.main(Player.java:164)

Каждый процесс выдает одну и ту же ошибку: Exception in thread "main" java.lang.Error: Unresolved compilation problem: at Player.main(Player.java:164) Поскольку эта ошибка возникает только тогда, когда я запускаю ее через Test.main, кажется, что проблема компиляции лежит в этом методе.Я полагаю, что я неправильно строю свои процессы, но я не смог диагностировать то, что я делаю, с какой-то определенностью в своем собственном исследовании.Если кто-то может заметить мою ошибку в Test.main, вы будете мне очень полезны.

public class Test {
    public static String programName = "/cs-3700/src/rockPaperScissors/Player.java";
    public static String arg0 = "228.5.6.7";
    public static String arg1 = "6789";

public static void main(String[] args) {
    String workingDir = System.getProperty("user.dir");
    System.out.println("Working dir: " + System.getProperty("user.dir"));
    Scanner kb = new Scanner(System.in);
    System.out.println("Enter number of games to play: ");
    String arg2 = String.valueOf(kb.nextInt());
    String[] exec_cmd = {"java", "-cp", "bin", "Player", arg0, arg1, arg2};

    try {
        String[] cmd = {"javac.exe", "Player.java"};
        ProcessBuilder compile = new ProcessBuilder(cmd);
        compile.directory(new File(workingDir));
        //System.out.println(compile.directory().getAbsolutePath());
        Process p = compile.start();
        p.waitFor();
        p.destroy();
    } catch (IOException | InterruptedException e) {
        System.out.println("Error");
        e.printStackTrace();
    }finally{
        try{
        ProcessBuilder pb = new ProcessBuilder(exec_cmd);
        pb.directory(new File(workingDir));
        pb.inheritIO();
        System.out.println(Arrays.toString(pb.command().toArray()));
        //System.out.println(pb.directory().getAbsolutePath());
        Process[] players = {pb.start(), pb.start(), pb.start()};
        for(Process player : players) {
            player.waitFor();
        }
        }catch(IOException | InterruptedException e){
            e.printStackTrace();
        }
    }
    kb.close();
}
}

РЕДАКТИРОВАТЬ: Я собираюсь добавить свой код для основного метода класса Player здесь для справки.Первая строка (объявление main) - это строка 164, указанная в приведенной выше ошибке.

public static void main(String[] args) { // Line 164
    if(args.length == 3){
        int port = Integer.parseInt(args[1]);
        int numGames = Integer.parseInt(args[2]);
        Player player = null;
        try {
            InetAddress group = InetAddress.getByName(args[0]);
            player = new Player(group, port);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        player.multipleGames(numGames);
    }else{System.out.println("No arguments");}
}
...