Java将System.out分开,用于单独的Classpath

时间:2017-04-18 12:04:25

标签: java jenkins classloader system.out

我正在开发一个需要调用一些Jenkins实例的应用程序,为此我使用的是jenkins-cli .jar
我可以使用命令行调用jar来轻松提取其输出。然而,我需要自己解析异常 为了正确处理异常,我现在通过反射调用jar的main方法:

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()。问题是我有其他线程同时记录。 我读了here,System.out是特定于类加载器的,但我无法找到有关此内容的任何其他信息。
有人知道如何获得jar的stdout而不受其他线程的干扰吗?

1 个答案:

答案 0 :(得分:1)

一种可能性是创建一个扩展PrintStream的自定义类,只需将传递给它的任何内容传递给另一个PrintStream,然后通过{{1}将其包裹在System.out周围}};自定义类可以有一个ThreadLocal私有属性,可以用来告诉它当前线程是否应截取文本。

不是最优雅的解决方案,但如果找不到替代方案,可能是一个很好的后备。