Java: запустить main другого класса и получить стандартный вывод этого класса - PullRequest
0 голосов
/ 23 января 2019

у меня работает что-то вроде этого

String[] reassignCmdArgs =
    { "--reassignment-json-file=" + jsonFile,
      "--zookeeper=" + zkConnect,
      "--throttle=" + (throttle <= 0 ? "1000000000" : throttle),
      "--execute" };
 ReassignPartitionsCommand.main(reassignCmdArgs);

В ReassignPartitionsCommand есть несколько операторов println, и я бы хотел их здесь зафиксировать.

Как это можно сделать?

EDIT: Мой текущий обходной путь ниже. Я ищу то, что не запускает другой процесс

   String[] reassignCmdArgs =
          { "--reassignment-json-file=" + jsonFile,
            "--zookeeper=" + zkConnect,
            "--throttle=" + (throttle <= 0 ? "1000000000" : throttle),
            "--execute" };
      System.out.println("Calling ReassignPartitionsCommand with args: " +
                         Arrays.toString(reassignCmdArgs));
      StringBuilder result = new StringBuilder();
      try {
        ClassLoader cl = ClassLoader.getSystemClassLoader();

        URL[] urls = ((URLClassLoader) cl).getURLs();
        ProcessBuilder pb = new ProcessBuilder();
        pb.redirectErrorStream(true);
        String classPath = Arrays.asList(urls)
                                 .stream()
                                 .map(URL::getFile)
                                 .collect(Collectors.joining(";"));
        String[] args = new String[4 + reassignCmdArgs.length];
        args[0] = "java";
        args[1] = "-cp";
        args[2] = classPath;
        args[3] = ReassignPartitionsCommand.class.getName();
        for (int i = 4; i < 4 + reassignCmdArgs.length; i++) {
          args[i] = reassignCmdArgs[i - 4];
        }
        pb.command(args);
        System.out.println("Calling process with args: " + Arrays.toString(args));
        Process p = pb.start();
        p.waitFor();  // wait for process to finish

        BufferedReader bri =
            new BufferedReader(new InputStreamReader(p.getInputStream()));

        String line;
        while ((line = bri.readLine()) != null) {
          result.append(line + "\n");
        }
      } catch (Exception e) {
        result = new StringBuilder("Problem running as another process");
        ReassignPartitionsCommand.main(reassignCmdArgs);
      }

1 Ответ

0 голосов
/ 23 января 2019

Вы должны посмотреть на ProcessBuilder ;Вы можете указать, куда выводится, например, pb.redirectOutput (Redirect.appendTo (log)).Затем просто прочитайте вывод из указанного вами файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...