Java 单独的 System.out 用于单独的类路径

标签 java jenkins classloader system.out

我正在开发一个需要调用一些 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/

相关文章:

java - Seam - IdentityManager.isUserEnabled() 的问题

ios - Jenkins xcodebuild 失败

jenkins - 为Jenkins安装和设置BlueOcean

java - 使用单独的类加载器运行每个 JUnit 测试(不,真的)

java - 使用自定义 ClassLoader 拦截 ClassLoader.getResource(String) 调用

java - 套接字与 Metro WS-安全复杂性

java - 在 Android Eclipse 中发送短信

Java:ExceptionInInitializerError 创建使用自定义类加载器加载的 Clojure 编译类的新实例

java - 读取MathType对象,将MathType对象转换为图像

jenkins - 如何在 Jenkins Pipeline 中的 withCredentials 中使用多个凭据