gembin

          OSGi, Eclipse Equinox, ECF, Virgo, Gemini, Apache Felix, Karaf, Aires, Camel, Eclipse RCP

          HBase, Hadoop, ZooKeeper, Cassandra

          Flex4, AS3, Swiz framework, GraniteDS, BlazeDS etc.

          There is nothing that software can't fix. Unfortunately, there is also nothing that software can't completely fuck up. That gap is called talent.

          About Me

           

          java.library.path屬性在代碼中設(shè)置不生效問題

          from http://daimojingdeyu.blogbus.com/logs/28617218.html



          可是在使用上面文章介紹的動(dòng)態(tài)庫(kù)時(shí),遇上了加載問題,也就是將動(dòng)態(tài)庫(kù)放到什么位置合適?文章中說可以放到System32目錄,但我不想這樣做,我更希望的是可以自己定制dll庫(kù)的位置~~

          沒有將lib放到System32目錄,而是放到了自己的lib目錄,程序在啟動(dòng)的過程中會(huì)報(bào)下面的錯(cuò)誤:
          java.lang.UnsatisfiedLinkError: no JIntellitype in java.library.path

          根據(jù)上面的提示信息在VM參數(shù)處通過-Djava.library.path將加載路徑指定到自己的lib目錄后,程序可以正常啟動(dòng)。

          這種方式不是太好,因?yàn)橐謩?dòng)的去指定虛擬機(jī)參數(shù),于是想通過System類的setProperty函數(shù)來在代碼中動(dòng)態(tài)的改變一下java.library.path的值。
          使用
          Java代碼 復(fù)制代碼
          1. System.setProperty("java.library.path""./lib");  

          后,啟動(dòng)程序總是報(bào)錯(cuò)"no JIntellitype in java.library.path"

          想了半天沒有想明白,為什么代碼的設(shè)置就不起作用,而在虛擬機(jī)參數(shù)處指定就是好的?

          Google了半天才知道原因,這里整理一下,以方便以后查找。
          代碼中設(shè)置不起作用,主要是因?yàn)閖ava.library.path只在jvm啟動(dòng)時(shí)讀取一次,其他情況下的修改不會(huì)起作用的。可以參考下面的這個(gè)bug:
          http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4280189

          原因和ClassLoader的實(shí)現(xiàn)有關(guān)系,
          ClassLoader.loadLibrary() method:
          Java代碼 復(fù)制代碼
          1. if (sys_paths == null) {  
          2.         usr_paths = initializePath("java.library.path");  
          3.         sys_paths = initializePath("sun.boot.library.path");  
          4. }  


          系統(tǒng)緩存了java.library.path的值,并且一直都會(huì)是第一次加載時(shí)的值。有人提到了下面的修改方法,
          Java代碼 復(fù)制代碼
          1. if (sys_paths == null) {  
          2.        sys_paths = initializePath("sun.boot.library.path");  
          3. }  
          4. usr_paths = initializePath("java.library.path");  

          但是從2002年到現(xiàn)在Sun一直都沒有改,不知道出于什么原因考慮的。

          有問題,就會(huì)有人解決問題,antony_miguel在一篇文章中,使用java的反射機(jī)制,完成了對(duì)于ClassLoader類中的usr_paths變量的動(dòng)態(tài)修改,
          Java代碼 復(fù)制代碼
          1. public static void addDir(String s) throws IOException {  
          2.     try {  
          3.         Field field = ClassLoader.class.getDeclaredField("usr_paths");  
          4.         field.setAccessible(true);  
          5.         String[] paths = (String[])field.get(null);  
          6.         for (int i = 0; i < paths.length; i++) {  
          7.             if (s.equals(paths[i])) {  
          8.                 return;  
          9.             }  
          10.         }  
          11.         String[] tmp = new String[paths.length+1];  
          12.         System.arraycopy(paths,0,tmp,0,paths.length);  
          13.         tmp[paths.length] = s;  
          14.         field.set(null,tmp);  
          15.     } catch (IllegalAccessException e) {  
          16.         throw new IOException("Failed to get permissions to set library path");  
          17.     } catch (NoSuchFieldException e) {  
          18.         throw new IOException("Failed to get field handle to set library path");  
          19.     }  
          20. }  

          文章也同時(shí)指出了這種實(shí)現(xiàn)的局限性,和jvm的實(shí)現(xiàn)強(qiáng)關(guān)聯(lián),只要jvm實(shí)現(xiàn)不是用的變量usr_paths來保存java.library.path的值,這個(gè)方法就不能用了。
          但是只要知道源代碼,小小的改動(dòng)就應(yīng)該可以實(shí)現(xiàn)了。

          posted on 2008-10-29 14:49 gembin 閱讀(8035) 評(píng)論(0)  編輯  收藏 所屬分類: JavaSE

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(6)

          隨筆分類(440)

          隨筆檔案(378)

          文章檔案(6)

          新聞檔案(1)

          相冊(cè)

          收藏夾(9)

          Adobe

          Android

          AS3

          Blog-Links

          Build

          Design Pattern

          Eclipse

          Favorite Links

          Flickr

          Game Dev

          HBase

          Identity Management

          IT resources

          JEE

          Language

          OpenID

          OSGi

          SOA

          Version Control

          最新隨筆

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          free counters
          主站蜘蛛池模板: 北安市| 容城县| 商南县| 准格尔旗| 广宁县| 林州市| 玛纳斯县| 渭南市| 沅陵县| 北安市| 慈利县| 清水县| 沁源县| 祁阳县| 固原市| 齐齐哈尔市| 斗六市| 东辽县| 衡东县| 项城市| 郁南县| 泰和县| 鹰潭市| 甘南县| 台北市| 麻江县| 大田县| 新民市| 元江| 廉江市| 延吉市| 泸水县| 新蔡县| 张掖市| 和龙市| 清丰县| 边坝县| 资中县| 博客| 琼结县| 正宁县|