我正在开发一个需要调用一些 Jenkins 实例的应用程序,为此我使用 jenkins-cli .jar
我可以使用命令行调用 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()。问题是我有其他线程同时记录。
我读过here System.out 是特定于类加载器的,但我找不到有关此的任何其他信息。
有人知道一种方法来获取 jar 的标准输出而不受到其他线程的干扰吗?
最佳答案
一种可能性是创建一个扩展PrintStream
的自定义类。 ,它将简单地将传递给它的任何内容传递给另一个 PrintStream
,然后通过 System.setOut()
将其包装在 System.out
周围;自定义类可以有 ThreadLocal
私有(private)属性,可用于告诉它对于当前线程是否应该拦截文本。
不是最优雅的解决方案,但如果找不到替代方案,可能是一个很好的后备方案。
关于Java 单独的 System.out 用于单独的类路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43471635/