2017-02-01 1 views
1

우리는 SpringFileStream을 사용하여 속성을로드해야하는 legacy jar API가있는 스프링 부팅 응용 프로그램을 가지고 있습니다. 우리는 스프링 부트 지방 병에 레거시 항아리를 싸서 등록 정보 파일은 BOOT-INF/classes 폴더 아래에 있습니다. 모든 관련 속성을로드하는 스프링을 볼 수 있지만 이전 jar에 속성 파일 이름을 전달하면 jar 파일 내부에서 속성 파일을 읽을 수없고 물리적 경로 아래 있지 않습니다. 이 시나리오에서 등록 정보 파일을 기존 jar로 전달하는 방법은 무엇입니까?Spring boot fat jar 파일 읽기하기

기존 항아리는 변경할 수 없습니다.

+0

기존 단지에있는 API는 무엇을 수 있습니까 : src/main/resources에서 당신이 file.properties를 얻을 수 원한다면 예를 들어 당신이 뭔가를 할 수 있습니다? InputStream을 전달할 수 있습니까? 또는 파일 시스템 경로로 해석되는 String 만 가져올 수 있습니까? –

+0

예 레거시 jar는 파일 경로 인 String 만 전달할 수 있습니다. – lsiva

답변

0

"파일"속성이 파일이 아니기 때문에 기본적으로 압축 할 수없는 jar 파일의 리소스입니다. 실제로는 .zip 파일입니다.

AFAIK,이 작업을 수행하는 유일한 방법은 jar에서 파일을 추출하여 잘 알려진 위치에 서버에 저장하는 것입니다. 그런 다음 런타임에 FileInputStream을 사용하여 파일을 열고 레거시 메서드에 전달합니다.

+0

우리는 하나의 fat jar로 응용 프로그램을 배포하고 독립 실행 형으로 실행하려고했습니다. 이것을 달성 할 수있는 방법이 있습니까? – lsiva

+0

내가 생각할 수있는 유일한 해결책은 런타임시 파일을 getResourceAsStream을 통해 InputStream으로 가져 와서 파일에 임시 파일로 작성한 다음 FileInputStream으로 열어 두는 것입니다. – GreyBeardedGeek

+0

이 방법을 사용해 보겠습니다. . – lsiva

1

실제로는 FileSystem을 사용할 수 있습니다. 파일을 가져 오는 데 필요한 폴더에서 파일 시스템을 에뮬레이트하기 만하면됩니다. 당신이 그것으로 통과

FileSystem fs = FileSystems.newFileSystem(this.getClass().getResource("").toURI(), Collections.emptyMap()); 
String pathToMyFile = fs.getPath("file.properties").toString(); 
yourLegacyClassThatNeedsAndAbsoluteFilePath.execute(pathToMyFile) 
관련 문제