我正在开发一个需要调用一些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而不受其他线程的干扰吗?
答案 0 :(得分:1)
一种可能性是创建一个扩展PrintStream
的自定义类,只需将传递给它的任何内容传递给另一个PrintStream
,然后通过{{1}将其包裹在System.out
周围}};自定义类可以有一个ThreadLocal
私有属性,可以用来告诉它当前线程是否应截取文本。
不是最优雅的解决方案,但如果找不到替代方案,可能是一个很好的后备。