Eclipse Plug-in 의 내부 resource 들은 Plug-in 과 함께 jar 로 묶여 Eclipse 에 포함되게 된다.

 예를들어 jar 내에 "resources/index.html" 이라는 파일이 있다면 이를 접근하기 위해 다음과 같은 함수가 사용된다.

URL url = Activator.class.getClassLoader().getResource("resources/index.html"); InputStream stream = Activator.class.getClassLoader().getResourceAsStream("resources/index.html");

 이때 URL 의 경우, 해당 resource 가 포함된 plug-in 의 feature 설정이 unpack 설정이 되어 있지 않으면 Eclipse 에 jar 로 묶이기 때문에 Local File URL 을 얻을 수 가 없다.


 쉽게 말하면, jar 로 묶여있는 상태의 plug-in 혹은 라이브러리에 포함된 resource 파일들에 대한 Runtime 시의 절대경로를 얻을 수 없다는 뜻이다.


 절대경로를 얻을수 없는 resource 들은 Browser.setURL() 같은 함수에서 쓰일수 없는 유효하지 않은 URL 값을 가지게 된다.


 위와 같은 문제를 Eclipse 에서는 jar 의 일부 리소스들을 다음폴더에 압축해제시켜놓고 사용한다.

  • workspace/configuration/org.eclipse.osgi/bundles/..

 위의 디렉토리는 Runtime 에 jar 안의 resource 들에 대한 절대경로로 해당 resource 에 대한 절대경로를 얻으려면 다음 API 를 사용하면 된다.

Platform.asLocalURL(URL) - Deprecated FileLocator.toFileURL(URL) //example Bundle bundle = Platform.getBundle(Activator.PLUGIN_ID); URL url= bundle.getEntry("resources/index.html"); // bundleresource://547.fwk25421790:1/resources/index.html URL localurl = FileLocator.toFileURL(url); // file:/home/leechwin/eclipse/workspace/.metadata/.plugins/org.eclipse.pde.core/Indigo.product/org.eclipse.osgi/bundles/547/1/.cp/resources/index.html

 

 참고로 Eclipse 는 Resource 에 Access 가 되는 파일들만 미리 bundles 밑에 폴더에 압축을 풀어놓고 Access 가 되지 않는 파일들은 압축을 풀어놓지 않아, html 과 같은 파일만 Access 하게 되면, 해당 html 에 연관된 css, javascript 등은 압축이 해제되어있지않아 원하는 결과를 얻지 못할 수 있다.

 이럴경우 해당 파일의 Parent 경로(파일의 디렉토리)를 인자로 주면 해당 폴더의 내용들이 모두 압축이 풀리게 된다.


참고: http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.eclipse.platform.doc.isv%2Freference%2Fmisc%2Fmulti_user_installs.html

Posted by leechwin
,