이전의 자원 및 파일 시스템에 대한 설명(자원을 디스크 위치 맵핑)은 프로젝트의 모든 자원이 파일 시스템과 같은 위치에 있는 것으로 간주합니다. 이것은 일반적으로 true입니다. 그러나, 프로젝트 내부의 파일과 폴더가 프로젝트 위치의 외부에 있는 파일 시스템에 저장될 수 있도록 Workbench에서 링크된 자원이라는 개념이 제공됩니다.
링크된 자원에는 상위 자원으로 프로젝트가 있어야 합니다. 링크된 자원은 실제로 파일 시스템 어디에든 위치할 수 있습니다. 링크된 자원은 프로젝트 위치 외부에 상주하거나 다른 프로젝트 내에도 상주할 수 있습니다. 링크된 자원 위치에 대한 몇 가지의 제한사항만 있습니다. 메소드 IWorkspace.validateLinkLocation은 지정된 위치가 링크된 자원을 작성하는 데 올바른지 확인하는 데 사용될 수 있습니다.
링크된 자원은 메소드 IFolder.createLink
또는 IFile.createLink를
사용하여 작성됩니다.
제공된 자원이 링크된 자원인지 여부를 프로그램에 따라 판별하려면,
메소드 IResource.isLinked를
사용할 수 있습니다.
이 메소드는 링크된 자원의 하위가 아닌 링크된 자원에 대해서만 true
를
리턴함에 유의하십시오.
링크된 자원 작성 및 자원이 링크되었는지를 발견하는 이러한 특수 메소드와는 별도로 링크된 자원을 조작할 때 일반 작업공간 API를 사용할 수 있습니다. 대부분 링크된 자원은 작업공간에서 정확히 다른 자원처럼 작동합니다. 그러나 링크된 자원을 이동, 복사 또는 삭제할 때 일부 제한사항이 적용됩니다. 개별 조작 및 해당 제한사항에 대한 정보는 IResource 및 해당 서브클래스를 참조하십시오.
경로 변수는 링크된 자원의 위치를 지정할 때 사용될 수 있습니다. 경로 변수는 파일 시스템의 위치에 바로 가기를 정의하는 간단한(문자열 -> IPath) 맵핑입니다. 변수는 하드 코드된 절대 파일 시스템 경로가 사용되는 위치의 수를 감소시켜 링크된 자원의 관리를 수월하게 할 수 있습니다.
경로 변수는 다음과 같이 여러 가지 방법으로 사용자가 링크된 자원을 효율적으로 관리할 수 있게 합니다.
이 목록의 마지막 항목에는 약간의 설명이 필요합니다. 프로젝트에 링크된 자원을 작성할 때 링크된 자원의 설명은 프로젝트 위치의
프로젝트 설명 파일(".project")에 추가됩니다. 경로 변수를 사용하여 프로젝트를
공유하고(프로젝트 컨텐츠를 복사하거나 저장소를 사용하여) 각 개별
워크스테이션에 적합한 변수를 다시 정의할 수 있습니다. 예를 들어, 한 사용자는 시스템의 c:\temp 아래 외부 자원을 저장할 수 있는 반면
Unix를 사용하는 다른 사용자는 /home/username/tmp에 동일한 자원을 저장할 수 있습니다.
각 작업 공간(TEMP=c:\temp
및 TEMP=/home/userb/tmp)
에 경로 변수를
정의하면 이 차이점을 해결하여 현재 그대로 링크된 자원과 프로젝트를 공유할 수 있습니다.
IPathVariableManager는 경로 변수를 작성, 조작 및 분석하는 데 필요한 API를 정의합니다. 또한 작성하기 전에 변수 이름 및 값을 유효성 검사하고, 경로 변수 정의를 변경할 때 통보하도록 리스너를 설치하기 위해 메소드를 제공합니다. IWorkspace.getPathVariableManager를 사용하여 이 클래스의 인스턴스를 얻을 수 있습니다. 자세한 내용은 이 절 끝에 있는 코드 예제를 참조하십시오.
메소드 IResource.getRawLocation은 링크된 자원의 분석되지 않은 위치를 찾는 데 사용될 수 있습니다. 즉, 경로 변수를 해당 값으로 분석하는 대신 실제 경로 변수 이름을 가져옵니다. 자원 위치가 경로 변수로 정의되지 않은 경우 getRawLocation 메소드는 getLocation 메소드와 똑같이 작동합니다.
자원을 프로그램에 따라 조작하는 클라이언트는 중단 링크의 가능성을 인식해야 합니다. 중단 링크는 링크된 자원의 위치가 존재하지 않거나 정의되지 않은 경로 변수에 상대적인 위치가 지정될 때 발생합니다. IResource 프로토콜 사용 시 다음과 같은 특수한 경우가 적용됩니다.
널
을 리턴합니다.일부 플러그인은 링크된 자원을 처리할 수 없으므로 링크된 자원을 사용 안함으로 설정할 수 있는 여러 가지 메커니즘이 있습니다. 모든 프로젝트 컨텐츠가 프로젝트의 기본 위치에 반드시 있어야 하는 플러그인을 작성하려는 경우 사용자가 자원을 표시하지 않으려는 위치에 링크된 자원을 작성하지 못하도록 이러한 메커니즘을 사용할 수 있습니다.
첫 번째 메커니즘은 프로젝트 속성 거부라고 합니다. 사용자 고유의 프로젝트 속성을 정의하려면, 속성이 링크된 자원과 호환되지 않도록 속성 정의에 지정할 수 있습니다. 다음은 속성 거부를 사용하는 속성 정의의 예제입니다.
<extension id="myNature" name="My Nature" point="org.eclipse.core.resources.natures"> <runtime> <run class="com.xyz.MyNature"/> </runtime> <options allowLinking="false"/> </extension>
링크된 자원이 작성되지 않도록 하는 두 번째 메커니즘은 팀 후크입니다. 사용자 고유의 저장소 구현을 정의하는 경우 org.eclipse.core.resources.teamHook 확장점을 사용하여 저장소 유형과 공유하는 프로젝트에 링크된 자원이 작성되지 않도록 할 수 있습니다. 기본적으로 저장소 제공자는 저장소에 연결된 프로젝트에 링크된 자원이 놓이도록 허용하지 않습니다.
저장소 지원이 링크된 자원을 인식하지 않는 이전 플러그인을 통해 제공되는 경우, 해당 프로젝트에 링크된 자원을 작성할 수 없습니다.
이에 따라 전체 작업공간과 관련하여 링크된 자원을 사용 안함으로 설정하는 경우 사용할 수 있는 환경 설정이 있습니다.
이 전의 두 가지 거부 메커니즘이 한 프로젝트 기준으로 작동하는 반면, 이 환경 설정은 작업공간의 모든 프로젝트에 영향을 미칩니다.
이 환경 설정을 프로그램에 따라 설정하려면 환경 설정 ResourcesPlugin.PREF_DISABLE_LINKING
을 사용하십시오.
설정된 경우에도 환경 설정을 꺼서 사용자 또는 플러그인이 이 설정을 대체할 수 있음을 주의하십시오.
코드에서 링크된 자원의 사용에 대한 일부 예제를 살펴봅니다. 다음과 같이 경로 변수부터 정의하여 시작합니다.
IWorkspace workspace = ResourcesPlugin.getWorkspace(); IPathVariableManager pathMan = workspace.getPathVariableManager(); String name = "TEMP"; IPath value = new Path("c:\\temp"); if (pathMan.validateName(name).isOK() && pathMan.validateValue(value).isOK()) { pathMan.setValue(name, value); } else { //invalid name or value, throw an exception or warn user }
이제 다음과 같이 정의된 경로 변수와 관련된 링크된 자원을 작성할 수 있습니다.
IProject project = workspace.getProject("Project");//assume this exists IFolder link = project.getFolder("Link"); IPath location = new Path("TEMP/folder"); if (workspace.validateLinkLocation(location).isOK()) { link.createLink(location, IResource.NONE, null); } else { //invalid location, throw an exception or warn user }
모두 완료했습니다! 이제 "c:\temp\folder"에 위치한 "Link"라는 작업공간에 링크된 폴더가 있습니다.
링크된 자원과 관련된 다른 작동 메소드를 설명하는 링크된 자원의 일부 코드 스니펫으로 마무리합니다.
link.getFullPath() ==> "/Project/Link" link.getLocation() ==> "c:\temp\folder" link.getRawLocation() ==> "TEMP/folder" link.isLinked() ==> "true" IFile child = link.getFile("abc.txt"); child.create(...); child.getFullPath() ==> "/Project/Link/abc.txt" child.getLocation() ==> "c:\temp\folder\abc.txt" child.getRawLocation() ==> "c:\temp\folder\abc.txt" child.isLinked() ==> "false"