2010-07-09 6 views
3

이 주제에 혼란이 많습니다. 몇 가지 질문이 있습니다. 상황은 여전히 ​​불분명하게 보입니다. 클래스 로더, 절대 파일 경로 등 등 내가 같은 프로젝트 디렉토리 구조가 있다고 가정Java에서 프로젝트 폴더의 절대 경로

,

 
MyProject-- 
      --dist   
      --lib 
      --src 
      --test 

나는 자원이

는 "lib 디렉토리/TXT"디렉토리에 "txtfile.txt"를 말한다. 시스템 독립적 인 방식으로 액세스하고 싶습니다. 나는 프로젝트의 절대 경로가 필요하다. 그래서 나는 반드시 프로젝트 루트가 아닌 현재 작업 디렉토리를 얻을 나는이

java.io.File file = new java.io.File(""); //Dummy file 
    String abspath=file.getAbsolutePath(); 

을 abspath + "/ lib 디렉토리/사전/txtfile.txt"가정하자

같은 경로를 코딩 할 수 있습니다.

"lib/txt/txtfile.txt"디렉토리 구조와 리소스가 포함 된 'dist'폴더에서 최종 'prj.jar'을 실행한다고 가정 해 봅시다. 내가 dist 폴더의 절대 경로해야합니다.

희망 문제가 명확합니다.

+0

나는이 방법이 여전히/lib 디렉토리/사전 "추가로 디렉토리 구조 플랫폼처럼에"유닉스 "제한되는 느낌 /txtfile.txt "는 앞으로 및 백 슬래시의 차이 때문에 윈도우를 망칠 것입니다! : | –

+0

실제로 Java는 슬래시 방향을 신경 쓰지 않지만'/'는 현재 디스크의 루트를 가리 키므로 루트가 아닌 드라이브 만 명시 할 수 있습니다. –

+0

System.getProperty ("file.separator")는 Windows 환경의 경우 "\"를 반환하고 Unix (및 Unix 계열) 환경의 경우 "/"를 반환합니다. – Catchwa

답변

9

이런 종류의 클래스 로더를 사용하려면 getResource() 또는 getResourceAsStream()을 사용해야합니다. 특히이 메소드는 ClassLoader를 사용하여 프로젝트 내의 자원에 대한 검색 컨텍스트를 결정합니다.

텍스트 파일을 가져 오려면 getClass().getResource("lib/txtfile.txt")과 같은 것을 지정하십시오.

명확히하기 : 리소스 경로를 얻는 방법을 생각하는 대신 자원을 얻는 방법에 대해 생각해보아야합니다.이 경우 디렉토리 (어쩌면 JAR 내부)에있는 파일에 있습니다. 이 경우에는 절대 경로를 알 필요가 없으며 일부 URL 만 파일에 저장되며 ClassLoader는이 URL을 반환합니다. 파일에 대한 스트림을 열려면 getResourceAsStream을 사용하여 URL을 어지럽히 지 않고 직접이 작업을 수행 할 수 있습니다.

ClassLoader를 통해 액세스하려는 리소스는 Class-Path (JAR 파일의 Manifest에 구성)에 있어야합니다. 이것은 매우 중요합니다! ClassLoader는 Class-Path를 사용하여 리소스를 찾습니다. 따라서 Class-Path에 충분한 컨텍스트를 제공하지 않으면 아무것도 찾을 수 없습니다. .을 추가하면 ClassLoader는 자원을 참조하는 방법에 따라 JAR 내부 또는 외부를 처리해야하지만보다 구체적 일 수는 있습니다.

. 접두어가 붙은 자원을 참조하면 ClassLoader가 JAR 외부의 파일도 찾게되는 반면, 마침표로 자원 경로를 접두어로 사용하면 ClassLoader가 JAR 파일 내부 만 보게됩니다. 당신이 안에 이름 foo.txt있는 디렉토리 lib에서 JAR을 일부 파일 이 있고 같은 자원이 JAR 당신 '이외 ​​인 경우 다음 getResource("lib/foo.txt");

를 실행하려는 자원을 얻으려면 의미

d 실행 getResource("./lib/foo.txt");

+0

내가 언급했듯이, 나는 이미 클래스 로더를 수행하려고 시도했다. 제 경우에 대해 어떻게 생각해 낼 수 있는지 알려주시겠습니까? –

+0

@MArk 클래스 로더가 처리해야한다는 사실을 이해했습니다. 하지만 어떻게? java.net.URL url = getClass(). getResource ("lib/txtfile.txt"); 은 나를위한 null URL을 반환합니다! –

+0

@Mark dist 폴더에는 prj.jar + "lib/txt/txtfile"리소스가 있습니다. (자원은 jar 외부로 배송되었습니다.) 마지막으로 dist 폴더를 tar 화하여 –

0

@ 마크가 맞습니다. 이것은 훨씬 간단하고 강력한 접근 방식입니다.

    는 경로 이름의 목록에 시스템 속성 "java.class.path를"의 내용을 설정
  • : 당신이 정말 File을 가지고있는 경우

    그러나, 당신의 최선의 방법은 다음과 같은 시도하는 것입니다 ,

  • 구축 "../ .."당신에게 "프로젝트"디렉토리를 제공하기 위해 JAR 경로 이름을 기준으로 무엇인지, 그 이름에 따라 목록에
  • 그림을 JAR 경로 이름을 식별하고
  • 당신의 프로젝트 디렉토리에 상대적인 목표 경로.

또 다른 대안은 래퍼 스크립트에 프로젝트 디렉토리 이름을 포함시키고 -D 옵션을 사용하여 시스템 속성으로 설정하는 것입니다. wrapper 스크립트가 자신의 절대 경로 이름을 알아낼 수도 있습니다. 예 : whence을 사용하십시오.

2

먼저 lib 디렉토리가 클래스 경로에 있는지 확인하십시오. 당신은 당신의 시작 스크립트에 명령 줄 매개 변수를 추가하여이 작업을 수행 할 수 있습니다 :이 저장

$JAVA_HOME/bin/java -classpath .:lib com.example.MyMainClass 

를 MyProject를/start.sh 또는 운영 체제에 의존 스크립트로.

그럼 당신은 (로 바르게 마크 언급)에는 TextFile.txt에 액세스 할 수 있습니다 또한

// if you want this as a File 
URL res = getClass().getClassLoader().getResource("text/textfile.txt"); 
File f = new File(res.getFile()); 

// As InputStream 
InputStream in = getClass().getClassLoader() 
     .getResourceAsStream("text/textfile.txt");