2017-04-18 7 views
1

일부 젠킨스 인스턴스를 호출해야하는 응용 프로그램을 개발 중입니다. jenkins-cli .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.setOut()을 사용할 수 있습니다 알고있는 항아리가 인쇄
를 System.out에 출력을 얻을 필요 . 거기에 문제가 다른 스레드가 simultanious 로깅을 가지고있다. here System.out이 클래스 로더와 관련이 있다고 읽었지만 이에 대한 추가 정보를 찾을 수 없습니다.
누군가 다른 스레드에서 방해받지 않고 jar 파일의 stdout을 얻는 방법을 알고 있습니까?

+1

다른 답변이 잘못되었습니다. 'System.out'은 분명히 클래스 로더와 관련이 없습니다. 아마도'System.setOut'을 사용하여'PrintStream'이 호출자에 민감한 것일 수도 있지만, 기본적으로 그렇게하지는 않습니다. –

+0

아하나, 나는 쉬운 해결책이 있기를 바랍니다. 문제를 해결해 주셔서 감사합니다. – ElectronicManuel

답변

1

하나의 가능성이 후, 단순히 다른 PrintStream에 전달 무엇이든 통과 할 PrintStream을 확장하는 사용자 정의 클래스를 만들고 포장하는 것 그 System.out 주위 System.setOut()를 통해; 사용자 정의 클래스는 현재 스레드에 대해 텍스트를 인터셉트해야하는지 여부를 알리는 데 사용할 수있는 ThreadLocal 개인 속성을 가질 수 있습니다.

가장 우수한 해결책은 아니지만 대안이 없다면 좋은 대안이 될 수 있습니다.