2012-03-30 2 views
2

변경할 수없는 타사 Java 코드를 사용하는 Groovy 스크립트를 작성하고 있습니다. 이 코드는 (나쁘다고 생각합니다.) ClassLoader.getSystemClassLoader().getResourceAsStream("/hard/file/path/in/jar/file") 이며 파일을 읽을 예정입니다. 타사 코드는 우리가 이미 작성한 그루비 코드의 무리와 함께 통합 할 지금, 그러나SystemClassLoader를 사용한 Groovy 스크립트 클래스 경로 문제

java -cp "/path/to/jar/file" ...를 사용하여, 그래서 우리는 끝내에서 실행하고 싶어 할 때

모든 자바에서 잘 어울린다.

우리는 Groovy 스크립트를 작성하여 test.groovy을 호출하고 groovy -cp "/path/to/jar/file" test.groovy으로 실행했습니다.

문제는 코드가 파일 리소스에 액세스 할 수 없다는 것입니다. Groovy가 System ClassLoader에서 해당 항아리를 직접로드하지 않는 것 같습니다.

Groovy 스크립트 내에 Thread.currentThread().getContextClassLoader().getResourceAsStream("/hard/file/path/in/jar/file")을 사용하여 파일을 읽을 수 있지만 ClassLoader.getSystemClassLoader().getResourceAsStream("/hard/file/path/in/jar/file")을 사용할 수는 없습니다.

그럼, 더러운 해킹 시도를하지 않고도 Groovy Script에서 System ClassLoader의 클래스를로드하는 방법을 알고 있습니까 (예 : getSystemClassloader 컨텍스트 클래스 로더를 반환하는 등).

답변

1

당신은 당신의 스크립트가 실행과 같이 할 때뿐만 아니라 시스템 클래스 로더에 항아리를 추가하는 시도 할 수 :

ClassLoader.systemClassLoader.addURL new File('/path/to/jar/file').toURI().toURL() 

PS : 나는보다는 System.getSystemClassLoader()

0

Groovy 프로세스를 시작하기 전에 jar를 %GROOVY_HOME%\lib 폴더에 넣거나 groovy 명령을 감싸는 래퍼를 만들고 %CLASSPATH% 변수를 수정하십시오.

+0

덕분에, 당신은 당신의 질문에 ClassLoader.getSystemClassLoader()을 의미 가정 귀하의 답변은 % GROOVY_HOME % \ lib => 이미 시도되었지만 Groovy에 의해'-cp' 옵션으로 선택된 GroovyClassLoader % CLASSPATH % =>에 의해로드되었습니다. – Grooveek