2017-04-18 63 views
1

我正在開發一個應用程序,需要調用一些Jenkins實例,爲此我使用jenkins-cli .jar
我可以使用命令行調用jar來輕鬆提取它的輸出。然後,我需要自己解析異常。
要正確處理異常,現在我通過反射調用的jar的主要方法:單獨的Classpath的Java單獨的System.out

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); 

但現在我需要以某種方式得到輸出的打印罐子到System.out
我知道我可以使用System.setOut() 。問題是我有其他線程同時記錄。 我讀here System.out是類加載器特定的,但我找不到任何其他信息。
有人知道一種方法來獲取罐子的標準輸出而不會干擾其他線程嗎?

+1

其他答案是錯誤的:'System.out'絕對不是類加載器特定的。也許你可以使用'System.setOut'來讓'PrintStream'對調用者敏感,但是默認情況下它也不會這樣做。 –

+0

啊我看到了,我希望那裏有一個簡單的解決方案。感謝您解決問題 – ElectronicManuel

回答

1

一種可能性是創建一個自定義類擴展PrintStream,會簡單地傳遞任何傳遞給他人PrintStream,然後包裹周圍0​​,通過System.setOut();自定義類可能有一個ThreadLocal私有屬性,可用於告知它是否應攔截當前線程。

不是最優雅的解決方案,但如果找不到替代方案,可能是一個很好的回退。