2017-05-09 1 views
1

이클립스와 jar에서 모두 작동하는 방법으로 리소스를로드하는 방법을 이해하는 데 문제가 있습니다.Java classLoader 및 getResourceAsStream

내 프로젝트에는 하나의 소스 파일 인 src이 있습니다. 그 아래에서 리소스 (이미지, 오디오 ..)를 가져 오는 새로운 패키지를 만들었습니다. 리소스는 src/resources이고 src/com/Mainclass.java입니다.

이제 다른 답변에서 알 수 있듯이 .class.getResource(); 클래스의 디렉토리를 검색하기 시작합니다. Eclipse에서 jar 파일을 추출 할 때 클래스의 디렉토리를 제외하고. 즉 ,

MainClass.class.getResourceAsStream("/resources/img.png") 

는 이클립스에 작동합니다.

리소스가 메인 클래스와 동일한 경로에 있지 않기 때문에 왜 작동하는지조차 알지 못합니다. 나는 대신 우리가 com에서 갈 것이므로 ../resources/img.png가 작동 할 것을 기대할 것입니다. ~ src/, 리소스는 다음과 같습니다.

<root of the jar>/com/mainclass.java 

<root of the jar>/src/resources 

을 그리고 그것은 작동하지 않습니다

아직도 한 번 나는 분리 내가 그 안에 찾을 항아리로 추출합니다.

더 쉬운 해결책은 다음과 같습니다. MainClass.class.getResourceAsStream ("/ resources/img.png")이로드되는 정확한 디렉토리를 어떻게 알 수 있습니까? 모든 단일 하위 폴더에/resources /를 넣으려고했지만 여전히 작동하지 않습니다. IT는 리소스 폴더가 항아리와 같은 폴더에 있지만 항아리 자체가 아닌 경우 이클립스 외부에서 작동합니다. 프로젝트는 메이븐 자바 프로젝트입니다, 내가 외부 libs가 없다

enter image description here

:

여기 내 빌드 경로입니다.

+1

:

그래서, 당신의 코드는 실제로처럼 보일 것이다. Eclipse에서 사용되는 소스/컴파일 된 레이아웃은 Eclipse 방식 (많이)과 Maven 방식 (약간)을 혼합합니다. – davidxxx

+0

전체적으로 이해하려면 https://maven.apache.org/guides/getting-started/를 읽어보십시오. 리소스 요구 사항은 https://maven.apache.org/plugins/maven-resources-plugin/examples/resource-directory를 참조하십시오.htac – davidxxx

답변

3

리소스가 응용 프로그램의 일부인 경우 src/main/resources, 또는 최종 이슈의 일부가 아닌 테스트 용으로 사용되는 경우 src/test/resources 아래에 있어야합니다.

Maven은 리소스를 src/main/resources에서 target/classes으로, src/test/resources에서 target/test-classes으로 복사합니다. 테스트 중에 target/classes과`target/test-classes '가 classpath에 추가됩니다. 난 당신이 메이븐 기본 문서를 읽어해야한다고 생각

MainClass.class.getResourceAsStream("/img.png") 
+0

근본적으로 내가 upvote하지만 그의 이클립스 구성 및 메이븐 그의 지식을 참조로 그것의 문제를 해결할 수 있을지 모르겠다 – davidxxx

+1

@ davidxxx, 나는 당신이 무슨 뜻인지 알아. 나는'src/resources' 디렉토리의 내용을'src/main/resources' 아래에서 간단하게 옮겨야한다고 생각합니다. – carlspring

+0

@carlspirng src/main/resources로 src/resources를 옮기고 자원에 대한 호출마다 MainClass.class.getResourceAsStream ("/ img.png")으로 코드를 변경 하시겠습니까? 내가 이것을 정확하게 가지고 있는지 단지 알기 위해 –