Java 에서 SWT Combo 박스에 Item 추가 작업을 하다가 Linux 환경에서는 text 가 제대로 나오는데 Windows 에서는 text 앞부분에 이상한문자가 붙어서 나오는 현상을 경험하게 되었다.


Windows 에서 다음과 같이 "ar-ae" 앞에 이상한 문자가 껴있었다.


디버깅을 해도 전혀 이상한 점이 없어서 삽질을 하던중 구글링을 통해 UTF-8 인코딩시 BOM(Byte Order Mark) 라는 것을 알게 되었다.

 BOM 은 UTF-8 로 인코딩되었다는 일종의 마킹인데, 윈도우즈에서 일부 프로그램에서는 BOM 을 강제로 삽입하는 경우가 있다고 한다. -_-;

 참고: http://blog.wystan.net/2007/08/18/bom-byte-order-mark-problem


 따라서 이를 제거해야 하는데, Edit Plus 와 같은 툴을 이용하는 등의 방법이 있다.

 본인은 해당 파일을 Edit Plus 에서 UTF-8 BOM 이 추가안되도록 설정한 상태에서 해당 문자를 지우고 다시 타이핑하였더니 해당 문제가 사라졌다.

 Gerrit 에서 봐도 사람이 봐서는 알 수 가 없다.


 하지만 hex viewer 로 보면 다음과 같이 EF BB BF 라는 문자가 삽입되어 있다.


 문자열이 알 수 없는 문제로 말썽을 일으킬때 한번 살펴보아야 할 부분인것 같다.


 리눅스에서 텍스트 파일 인코딩을 변경하려면 iconv uconv 명령을 사용하여 인코딩을 변경 할 수 있다.


Posted by leechwin
,

 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
,

 Eclipse 의 extension point 를 extension 한경우 그값으로 IConfigurationElement  를 얻어 올 수 있다.

 extension 을 한 해당 plugin 에 대한 Bundle 을 얻고 싶은 경우가 있는데 다음과 같이 수행하면 해당 Bundle 을 얻어 올 수 있다.


Bundle bundle = Platform.getBundle( IConfigurationElement.getContributor().getName() );


해당 번들에서 어떠한 리소스들 찾고 싶다면 다음과 같이 수행하면된다.


Bundle bundle = Platform.getBundle( IConfigurationElement.getContributor().getName() );
URL url = bundle.getResource( filepath );
URL resolvedURL = FileLocator.resolve( url );

참고로 번들에서 Resource 를 얻어오면 "bundleresource://" 등의 prefix 가 붙는 경우가 있는데,

이런때에는 org.eclipse.core.runtime.FileLocator.resolve(URL url) 함수를 사용하면 된다.


참고: http://www.eclipsezone.com/eclipse/forums/t82616.html

참고: http://stackoverflow.com/questions/9030830/file-and-bundleresource-urls

Posted by leechwin
,