2012-02-04 2 views
5

원시 클래스 경로에있는 jar 파일의 경로를 찾으려고합니다. getRawClasspath는 IClasspathEntry 오브젝트의 콜렉션을 리턴합니다. getPath를 호출 할 수 있습니다.Eclipse PDE : /ProjectName/lib/something.jar와 같은 상대 경로가 주어지면 전체 파일 시스템 경로는 어떻게 얻을 수 있습니까?

그러나 getPath 뭔가 이상한 반환이 ipath처럼, 프로젝트 이름으로 시작 :

/ProjectName/lib/something.jar을 풀 -에이 상대 경로를 설정하는 올바른 방법을 무엇

공인 OS 경로? 처음에는 작업 공간 루트에 경로를 추가 할 수 있다고 생각했지만 작업 공간과 프로젝트 사이에 중간 디렉토리가 있기 때문에 작동하지 않습니다.

더 일반적으로 방법으로 반환 된 IPath를 어떻게 처리해야하는지 어떻게 알 수 있습니까? 그 IPath가 무엇인지 나는 결코 알지 못한다. 프로젝트와 관련하여, 프로젝트와 관련하여 작업장과 관련되어 있지만 프로젝트 이름은 첫 번째 요소로, 달의 위상과 관련이 있습니다 ... 모든 문제는 당황 스럽습니다. 문서는 결코 도움이되지 않습니다. 봐야할지 모르겠다.

업데이트

저는 더 혼란 스럽습니다. 문제는 여전히 IClasspathEntry가있을 때 파일 시스템 경로로 해결하는 방법이 여전히 불분명하다는 것입니다.

"경로가 절대 경로 (작업 영역과 관련된)로 시작하는 경우 올바르지 않습니다. 문제는 IClasspath의 getPath 메소드가 다음 두 가지 중 하나를 반환한다는 것입니다. 경로 시작 작업 공간과 관련된 슬래시 또는 실제 파일 시스템 경로 인 /로 시작하는 IPath 예, 두 가지 완전히 다른 것을 하나의 유형으로 밀어 넣습니다. jar 파일이 작업 공간 밖에있을 때 파일 시스템 변형을 얻습니다.

"절대적인"변종은 그 자체로 멋진 문자열 일 뿐이라는 것을 알고 있습니다. IPath는 그 자체로 멋진 문자열 일뿐입니다. 올바른 정보를 가지고 있지 않아서 유용하지 않습니다.

그럼 어떻게 처리해야할까요?

답변

5

이 시도 :

IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); 
    IResource res = root.findMember("/ProjectName/lib/something.jar"); 
    System.out.println(res.getLocation().toString()); 
+0

"그걸 알고 있니? 왜 그것은 작업 공간 대신 ​​프로젝트에서 조회가되어서는 안됩니까? 예를 들면? –

+0

경로가 '/'로 시작하는 경우 경로가 절대 경로 (상대 경로 인 작업 영역 루트)임을 의미합니다. 그렇지 않다면 그것은 상대 경로임을 의미하고, 어떤 컨테이너와도 관련 될 수 있습니다 ... IPath.isAbsolute()를 사용하여 경로가 절대 경로인지 여부를 알 수 있습니다. JDT의 IProject.getRawClasspath의 경우 항상 절대 경로를 사용합니다. – Dollyn

+0

필자의 기본적인 실수는 이클립스 경로가 OS 경로와 관련이 있다고 생각하기 시작했다. eclipse 절대 경로 _always_는 파일 시스템 경로가 무엇이든 첫 번째 요소로 프로젝트를 가지고 있습니까? 그래서 /Users/james/workspace/someSubDirectory/foo/ProjectX/src/Code.java에서 /ProjectX/src/Code.java의 절대 경로를 가질 것으로 예상해야합니까? –

-2

내가 제안이, 사진 첨부를 보면, 찾을 이클립스의 플러그인의 속성에서 "위치"속성에서이고, 어쩌면 찾을 수 있습니다. 죄송합니다. 평판이 10 개 밖에 없으므로 그림을 볼 수 있습니다. picture url

1

경로가 복잡하고 클래스 경로 컨테이너 (예 : JRE), 언급되지 않은 다른 몇 가지 상황이 있습니다. 작업 공간 및 클래스 경로 변수 외부.

단순화하기 위해 getResolvedClasspath을 대신 사용하여 '단순한'classpath entires (변수가없고 컨테이너가 없음) 만 반환하는 것이 좋습니다. 자바 독에 따르면, 그것은 절대 경로를 반환하고, 그 해석은 항목의 종류에 따라 달라집니다

  • CPE_LIBRARY - 그것은 외부 라이브러리가 있다면, 그것은 파일 시스템 경로 (그리고 당신이 할 수 의미 연관된 자원이 없습니다 findMember으로 찾으십시오).프로젝트
  • CPE_SOURCE에 절대 경로 - -

모든 절대 경로는 작업 공간에서 해석되는 소스 폴더에 대한 절대 경로 그렇지 않으면, 작업 공간 루트

  • CPE_PROJECT에 따라 경로입니다. 파일 시스템 경로가 필요하면 getLocation을 사용해야합니다.

    부수적으로 파일 시스템 엔터티와 작업 영역 리소스 간에는 1 대 1 매핑이 없습니다. 작업 영역 링크로 인해 동일한 (파일 시스템) 위치를 가리키는 여러 작업 영역 경로가있을 수 있습니다.

  • 0

    이것은 내가 가지고 올 수있는 최선이며, 그것은 완전히 예, 못생긴 해킹 : (upvote에)을 작동하지만 내가 어떻게해야 '의 더 큰 질문에 대답하지 않습니다

    private IPath getCorrectAbsolutePath(IJavaProject project, IPath path) throws IllegalArgumentException { 
        final String projectName = project.getProject().getName(); 
        if (path.segmentCount() > 1 && path.segment(0).equals(projectName)) { 
         IPath projectAbsolutePath = project.getProject().getLocation(); 
         IPath relativePath = path.removeFirstSegments(1); 
         return projectAbsolutePath.append(relativePath); 
        } else { 
         if (!path.isAbsolute()) 
          path = path.makeAbsolute(); 
         if (!path.isAbsolute()) 
          throw new IllegalArgument("Cannot make IPath absolute: " + path.toString()); 
         return path; 
        } 
    } 
    
    관련 문제