2014-01-09 1 views
2

내 응용 프로그램에 다음 코드 블록이 있습니다.Thread.currentThread(). getContextClassLoader(). getResourceAsStream()이 null을 반환합니다.

InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream(FilePath); 

여기서 'FilePath'는 파일의 절대 경로입니다.

위의 코드는 Linux 및 Windows에서 정상 모드로 응용 프로그램을 실행할 때 잘 작동합니다. (예 : 명령 프롬프트에서) 그러나 응용 프로그램을 Windows 서비스로 실행하면 작동하지 않습니다. 입력 스트림이 'null'로 표시됩니다.

누구든지 이전에 이러한 문제가 발생 했습니까? 자바 클래스 로더 이외의 다른 정보를 찾을 수 없습니다. 여기서 우리는 사용될 올바른 클래스 로더 인 "ContextClassLoader"를 사용합니다.

실마리가 있습니까?

+1

정확한 경로를 알려주세요. "절대 경로"는이 문맥에서 잘못 들린다. –

+0

여기 내 경로는 저장소와 비슷합니다. + File.separator + "resources"+ File.separator + "api_templates"+ "api.xml"; (wrapper.conf 파일에 홈 디렉토리를 설정하고 응용 프로그램을 서비스로 시작합니다 성공적으로). "저장소 디렉토리가 내 홈 디렉토리의 첫 번째 하위 디렉토리입니다. – Ratha

+1

서비스가 실행될 때 응용 프로그램이 실행되는 ID로 열려는 파일에 대한 읽기 액세스가 가능합니까? ID가 잘 작동하지만 서비스가 아닌 경우 내 마음에 유일한 차이점은 실행 방법이나 실행 대상입니다. – CodeChimp

답변

9

나는 이것이 "." (현재 폴더)를 클래스 경로에 추가하십시오. 그것은 a) 나쁜 아이디어이고 b) 앱이 이상한 방식으로 중단됩니다.

이해해야 할 사항은 파일과 리소스의 차이입니다. 파일은 classpath 외부에있는 파일입니다.

액세스하려면 FileFileReader을 사용해야합니다.

리소스가 클래스 경로에 있습니다. 리소스 경로는 항상 /을 파일 구분자로 사용하며 File.separator이 아닙니다.

또 다른 방법은 $HOME/repository/ (Linux) 또는 %HOME%/repository/을 클래스 경로에 추가하고 "resources/api_templates/api.xml"을 사용하여 리소스를로드하는 것입니다. 이 작업을 수행하려면 resources$HOME/repository/의 폴더 여야합니다.

이렇게하지 않으면 홈 디렉토리 (또는 응용 프로그램을 시작하는 디렉토리)의 모든 파일이 클래스 경로에 자원으로 추가됩니다.

+0

세부 답변을 보내 주셔서 감사합니다. 이제는 FileInputStream으로 변경되었습니다. InputStream에서 새 코드를 변경했습니다. = new FileInputStream (filePame); 리소스와 파일의 차이를 이해했습니다. 자원이 아닌 파일을 읽으려고했습니다. 다시 한 번 감사드립니다. – Ratha

관련 문제