Java отдельный System.out для отдельного пути к классам

Я разрабатываю приложение, которое должно вызывать некоторые экземпляры Jenkins, для этого я использую jenkins-cli .jar
Я мог бы вызывать банку с помощью командной строки, чтобы легко извлечь ее вывод. Затем, однако, мне нужно самому анализировать исключения.
Чтобы правильно обрабатывать исключения, я теперь вызываю основной метод jar через отражение:

URLClassLoader jenkinsClassloader = new URLClassLoader(new URL[]{"UrlToJenkins-Cli.jar"}, getClass().getClassLoader());
Class<?> jenkinsCli = Class.forName ("hudson.cli.CLI", false, jenkinsClassloader);
Method mainMethod = jenkinsCli.getDeclaredMethod("main", String[].class);
mainMethod.invoke (null, (Object) commandArray);

Но теперь мне нужно как-то получить вывод, который jar печатает в System.out
Я знаю, что могу использовать System.setOut(). Проблема в том, что у меня одновременно регистрируются другие потоки. Я прочитал здесь что System.out зависит от загрузчика классов, но я не смог найти никакой дополнительной информации об этом.
Кто-нибудь знает способ получить стандартный вывод jar без вмешательства других потоков?


person ElectronicManuel    schedule 18.04.2017    source источник
comment
Этот другой ответ неверен: System.out определенно не зависит от загрузчика классов. Возможно, вы могли бы использовать System.setOut, чтобы PrintStream был чувствителен к вызывающему абоненту, но по умолчанию он также не делает этого.   -  person Brett Kail    schedule 18.04.2017
comment
А, понятно, я надеялся, что будет простое решение. Спасибо, что прояснили ситуацию   -  person ElectronicManuel    schedule 19.04.2017


Ответы (1)


Одной из возможностей было бы создание пользовательского класса, расширяющего PrintStream< /a>, это просто передаст все, что ему передано, другому PrintStream, а затем обернет это вокруг System.out через System.setOut(); пользовательский класс может иметь ThreadLocal private атрибут, который можно использовать, чтобы сообщить, следует ли перехватывать текст для текущего потока.

Не самое элегантное решение, но может быть хорошим запасным вариантом, если альтернативы не найдено.

person Haroldo_OK    schedule 18.04.2017