2012-11-19 2 views
2

Mac (OS 버전 10.6.8)의 NetBeans (7.2.1 버전)에서 GUI 응용 프로그램을 개발했습니다. 이 응용 프로그램은 하위 파일 data에 넣으려는 XML 파일 (프로그램에서 사용하는 데이터 포함)이 필요합니다.Java : 데이터 파일의 상대 경로

NetBeans 내에서 응용 프로그램을 실행하려면이 데이터 디렉토리를 주 프로젝트 디렉토리에 배치해야합니다. 그러나 기본 디렉토리의 dist subdir에있는 .jar 파일 (doubleclick 사용)을 실행하려면 데이터 폴더를 dist으로 옮겨야합니다. 그러면 프로그램이 NetBeans에서 더 이상 실행되지 않습니다. 응용 프로그램의 재배포, 나는 단순히 데이터를 이동할 수 있다고 생각으로, 처음에는 그 자체에서

public String vocabPath = "data" + File.separator + "wordlist.xml"; 
public File vocabFile = new File(vocabPath); 

이 문제가 보이지 않았다 :

이 데이터 파일 경로가 프로그램 내에서 지정하는 방법입니다 디렉토리를 dist에 저장하고 배포하십시오 (OS X 및 Windows 7에서 정상적으로 작동 함). 그러나 우분투에서 데이터 파일을 찾을 수 없다는 오류 메시지가 나타납니다.

저는 Java에 익숙하지 않으므로 어쨌든 이것은 어쨌든 MAIN_DIR/dist/data에있는 데이터 파일에 내 응용 프로그램이 액세스하도록하려면 어떻게해야합니까? 문제의 근원이 다른 곳에 있다면, 알려주세요.

미리 감사드립니다.

나는 단지 우분투에서 발생 일부 예기치 않은 동작에 문제를 좁혀 생각하는 내가하는 follow-up question을 게시 한

편집 할 수 있습니다.

편집이 내 후속 질문에 대한 답은 (첫째 편집 참조) 내 문제를 (해결했다

단지와 유사한 문제를 해결하는 동안이 게시물을 찾은 사람들에게 참고로 광산).

+0

어떻게 Windows 및 OS X에서 실제로 작동 했습니까? 애플리케이션을 어떻게 실행합니까? – Jayan

+0

@Jayan .jar 파일을 두 번 클릭하여 응용 프로그램을 실행했습니다. 그것은 OS X와 ​​Windows에서 완벽하게 작동했습니다. – canavanin

+0

좋아요, 그래서 프로세스가 jar의 위치에 '현재 작동중인'디렉토리로 시작되었습니다. 따라서 File은 올바른 경로를 얻었습니다. 어떻게 리눅스에서 실행되고 있습니까? – Jayan

답변

1

wordlist.xml 파일을 사용자가 수정할 수없는 경우 jar 파일에 포함하고 getResourceAsStream()을 사용하여로드 할 수 있습니다. 데이터가 수정 될 것으로 예상되는 경우 몇 가지 추가 세부 정보는 getResourceAsStream() vs FileInputStream

이며, 알려진 위치에 보관할 수 있습니다. Users home directoryuser.home 속성을 통해 입수 할 수 있습니다.

java 명령으로 시작된 순수 Java 프로그램 인 경우 '설치'(MAIN_DIR)에 상대적인 파일을 갖는 것이 더 어려울 수 있습니다. 실행 파일을 생성하고 일부 운영 체제 API (Linux에서는 readlink ("/proc/self/exe", ..))를 사용하여 설치 위치를 확인할 수 있습니다.

기본 실행 파일이있는 java 프로그램을 패키징하는 것은 exe4j과 같은 소프트웨어로 수행 할 수 있습니다.

(완료와 미래의 참조를 위해서) (Launch4J, 여기에 유용 할 수 유사한 기능을 갖춘 오픈 소스 솔루션입니다). Windows에서 작은 배치 스크립트를 만들고 Linux에서 쉘 스크립트를 만들 수도 있습니다. 설치 영역을 둘 다 감지 할 수 있습니다.

박쥐 - % ~ dp0 % - Directory navigation in command prompts 참조.
bash - Getting the source directory of a Bash script from within

+0

답장을 보내 주셔서 감사합니다. wordlist.xml은 실제로 사용자가 수정할 수 있어야하며, 운영체제의 특정 기능을 사용하지 않으려는 것처럼 파일을 특정 위치에 배치하지는 않습니다. 이게 까다로운 문제 인 것 같아서 놀랍군요/ – canavanin

+0

사용자가 파일 위치를 한 번만 선택하도록 허용하지 않으시겠습니까? – Jayan

0

파일의 시스템 속성을 유지하고 경로를 dist으로 유지하는 것이 좋습니다. 개발 환경 인 data에 파일이있는 경우 응용 프로그램에서 파일을 가져 오지 않으면 항상 dist의 파일을 가져옵니다. 당신 넷빈즈 환경에서 단지 data 언급 경로 시스템 프로퍼티 VOCAB_FILE_PATH을 설정

// This would pick up system property if set otherwise default value provided. 
String filePath = (String) System.getProperty("VOCAB_FILE_PATH","<<path with dist>>"); 
public File vocabFile = new File(filePath); 

: 같은

당신은 할 수 있습니다.