我正在运行这样的外部 jar 插件:
Class<?> pluginClass = pluginLoader.loadClass(".......");
Method main = pluginClass.getMethod("main", String[].class);
main.invoke(null, new Object[] { new String[0] });
效果很好。现在需要将插件控制台消息保存到一个字符串中
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(baos); // how to indicate System.out coming from JAR plugin
System.setOut(ps);
// how to connect ps with plugin only
但此代码将所有控制台消息保存到字符串中。我不需要所有应用程序消息。如何重定向仅限插件消息......来自这个加载的jar的消息到字符串中?
最佳答案
你不能按照你的要求去做。进程中只有一个标准输出流,它与插件代码和您的代码共享。
您可以改为将插件代码作为单独的进程运行并捕获输出流。您可以使用“java.home”系统属性来查找启动进程的 JRE 的位置,并使用它来形成命令行来启动插件 jar。
参见 https://docs.oracle.com/javase/8/docs/api/java/lang/ProcessBuilder.html
关于java - 如何从类加载器加载的 jar 中获取系统输出控制台?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57937898/