2012-07-15 3 views
7

우선, 많은 S.O.를 읽었습니다. 이 주제에 관한 질문과 나는 그들에게 제안 된 것들을 시도했다.컴파일 된 jar의 리소스에 어떻게 액세스해야합니까?

여기 내 상황입니다. Processing 프레임 워크를 사용하여 Java 응용 프로그램을 작성 중이며 응용 프로그램 패키징에 대해 생각할 필요가있는 마지막 단계에 있습니다. 명령 줄에서 실행 가능한 jar 파일은 Eclipse에서 내보내기 기능을 사용하여 빌드하려고 시도한 것입니다.

내 프로젝트의 구조는 다음과 같습니다

src/ 
    multiple packages/ 
libs/ 
    jar files and natives 
data/ 
    fonts and images 
config/ 
    json files 

나는 jar 파일을 수출하고 내용의 검사를 위해 단지 uzip, 나는이 DIRS의 내용이 최상위에 버려진 된 것을 발견하면 .jar의. 다음과 같습니다

:

.jar 
    packages 
    jar files 
    fonts 
    json files 

그래서, 내가 좋아하는 뭔가 설정 파일을로드 할 때 : 이클립스에서 응용 프로그램을 실행할 때

BufferedReader reader = new BufferedReader(new FileReader(path)); 

모든 그냥 파일을 사용할 수 있습니다. 그러나 jar 파일은 FileNotFoundException을 던집니다.

S.O에서 본 많은 질문 중 하나입니다. 이러한 문제에 대해서는 class.getClass().getResource() 또는 class.getResourceAsStream()을 사용하는 것이 좋습니다. 나는에서 이러한 사용하여 상대 경로와 파일 이름 만 모두 시도 :

class.getResource('config.json'); 
class.getResources('cfg/config.json'); 
class.getResourceAsStream('../../config.json'); 

이러한 방법은 모두 null를 돌려 사용하는 이클립스 또는 항아리 중 하나에서 실행하면

java -jar myjarfile.jar 

내가 또한 Ant 파일을 사용할 수 있습니다. 사실, 이제 내보내기 기능으로 생성 된 Ant 파일을 사용하여 jar 파일을 빌드하고 있습니다. 거기에 뭔가를 추가 할 수있는 항아리에 디렉토리를 추가하는 것도 좋을 것입니다.

답변

5

루트에있는 리소스에 도달하려면 /을 경로 앞에 추가하십시오. 그렇지 않은 경우 현재 패키지에 상대적으로 수행합니다. 이는 일반적으로 자원이 소스의 클래스 옆에 물리적으로있는 경우에만 유용합니다.

따라서 class.getResourceAsStream("/config.json");을 사용하여 jar의 루트에서 config.json에 도달하십시오.

jars-inside-jars는 직접 지원되지 않습니다.

+0

답변 해 주셔서 감사합니다. getResource()에 추가로 슬래시를 사용하도록 제안 하시겠습니까? – JeremyFromEarth

+0

이것은 훨씬 더 가까워 보인다. 이 경로가 반환하는 경로는 다음과 같습니다. jar : file :/C : /path_to_project/myjarfile.jar! /config.json 그러나 jar 파일을 실행할 때 경로가 올바른 경우에도 파일이 예외가 아닙니다. 필자도 Eclipse 내에서 작동 함을 언급해야합니다. – JeremyFromEarth

+1

Jars 내부의 리소스로 FileReaders를 사용할 수 없습니다. getResourceAsSTream에서 리턴 된 InputStream을 사용해야합니다. –

1

.jar 파일은 컴파일 된 코드의 "패키지"와 관련된 디렉토리 만 포함하면됩니다./lib/WEB-INF 등으로 .war 구조를 참조 할 수도 있습니다.

은 패키지 구조 인 경우 :

com.yourco.authentication 

그리고 로그인

에서 클래스 이

그런 다음 항아리가

/com/ 
    /yourco/ 
    /authentication/ 
     Login.class 

당신이 다음 ENV에 대한 클래스 경로에 .JAR을 필요로해야한다 명령 줄을 통해 실행합니다.

이클립스에서는 환경 설정과 가져 오기에 필요한 libs 등이 제대로 작동한다는 점을 잘 알고있다. 패키지/폴더에 컴파일 된 Java 코드가 포함되어있는 경우 외부에서 참조 할 때 작동하는지 확실하지 않으므로 루트 폴더에서 패키지를 시작하는 것이 좋습니다.

+0

/를 참조하도록 코드를 수정하여 다른 제안 사항을 참조하십시오. 테스트하지 않고도 작동 할 수는 있지만 디렉토리 구조로 lib가 아닌 앱을 패키지하려는 것처럼 보입니다. –

관련 문제