2012-11-21 4 views
1

이것은 간단한 질문과 마찬가지로 this one의 후속 질문입니다. OS X 및 Windows에서 .jar 파일을 두 번 클릭하여 Java 프로그램을 실행할 수 있었지만 리눅스에서는 후자와 마찬가지로 파일 경로 문제가 발생합니다).우분투에서 File.getAbsolutePath가 올바르지 않음

우분투 (12.04)에서 NetBeans를 사용하여 몇 가지 방법을 시도해 본 결과 프로그램이 작업 디렉토리로 간주하는 것으로 보이는 것으로 나타났습니다 (출력은 File.getAbsolutePath()입니다). 내가 넷빈즈에 내 응용 프로그램을 시작하면, 모든 것이 (심지어 우분투에서) 작동하고,

System.out.println(new File(".").getAbsolutePath()); 

나에게 내 프로젝트 폴더 따라서 올바른 /home/my_home/projects/VocabTrainer/.을 제공합니다. 그러나 /home/my_home/projects/VocabTrainer/dist에있는 .jar 파일을 두 번 클릭하면 갑자기 우분투 아래에 출력됩니다. /home/my_home/.dist 디렉토리의 하위 디렉토리에있는 데이터 파일에 액세스하려는 경우 문제가 있습니다.

누구든지이 동작의 원인을 알고 있으며 문제를 어떻게 해결할 수 있습니까?

PS : 여기이 필요하면 모르겠지만는 java -version

java version "1.6.0_24" 
OpenJDK Runtime Environment (IcedTea6 1.11.5) (6b24-1.11.5-0ubuntu1~12.04.1) 
OpenJDK Server VM (build 20.0-b12, mixed mode) 

답변

1

원인, 정말를 참조하십시오. 그러나 예측할 수없는 가능성으로 인해 그런 식으로 처리하고 싶지는 않을 것입니다. 나는 이것이 명확하게 해키 지적한다 : 이런 식으로 뭔가 당신이 아래 getResource 전화 :

URL url = this.getClass().getClassLoader().getResource("thepackage/ofyourclass/JunkTest.class"); //get url of class file. expected: ("jar:file:/somepath/dist/yourjar.jar!qualified/class/name.class") 
File distDir = null; 
if(url.getProtocol() == "jar") { 
    String classPath = null; 
    String jarPath = url.getPath(); 
    if(jarPath.matches(".*:.*")) jarPath = new URL(jarPath).getPath(); 
    classPath = jarPath.split("!")[0]; 
    distDir = new File(classPath).getParentFile(); //may need to replace/with \ on windows? 
} else { //"file" or none 
    distDir = new File(url.toURI()).getParentFile(); 
}  
//... do what you need to do with distDir to tack on your subdirectory and file name 

편집에 항아리에 무언가의 클래스 이름을 사용하는 가정, 파일을 받아야합니다. 시작할 때 클래스 경로에 파일의 위치를 ​​직접 추가 할 수도 있습니다 (또는 jar 파일에서 찾고자하는 파일을 포함 할 수도 있습니다). 그래서, 확인, 누락 된 프로토콜에 적응하고 그것을 밖으로 확산 :

URL url = this.getClass().getResource("yourfile"); 
File file = new File(url.toURI()); 
//... use file directly from here 

멀어져 편집 : 이것에서 당신은 같은 당신을 얻을 것입니다 당신이 직접 무엇을 찾고 있는지의 파일 이름으로 this.getClass().getClassLoader().getResource()을 사용할 수 있습니다 오류 메시지가 더 읽기 쉽습니다.

+0

답장을 보내 주셔서 감사합니다. 나는 아마도 뭔가 익숙하지 않은 짓을했다. (나는 자바가 처음이다.) URL "url = this.getClass(). getClassLoader(). getResource ("qualified/class/VocabItem.class ");" 나에게 URL == null을 주었다. 나는 단지 나의 수업 중 하나의 이름을 골랐다. 그러나 아마 나는 당신의 제안을 오해했다!? – canavanin

+0

ah - "qualified/class"비트를 문제가되는 클래스의 패키지로 대체합니다 (있다고 가정). 클래스의 "규정 된 클래스 이름"은 패키지가 앞에 붙인 클래스 이름입니다. 이 목적을 위해, 당신은 "." "/"자를위한 문자. 따라서 VocabItem 클래스가 com.canavanin 패키지에 있으면 해당 문자열에 "com/canavanin/VocabItem.class"를 사용합니다. 패키지가 없으면 문자열의 해당 부분을 생략 할 수 있어야합니다. –

+0

업데이트 해 주셔서 감사합니다. 이제 MalformedURLExeption을 얻습니다 : java.net.MalformedURLException : 프로토콜 없음 : /home/my_home/projects/VocabTrainer/build/classes/my/vocabtrainer/VocabItem.class – canavanin

관련 문제