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屬性在代碼中設置不生效問題

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



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

          沒有將lib放到System32目錄,而是放到了自己的lib目錄,程序在啟動的過程中會報下面的錯誤:
          java.lang.UnsatisfiedLinkError: no JIntellitype in java.library.path

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

          這種方式不是太好,因為要手動的去指定虛擬機參數,于是想通過System類的setProperty函數來在代碼中動態的改變一下java.library.path的值。
          使用
          Java代碼 復制代碼
          1. System.setProperty("java.library.path""./lib");  

          后,啟動程序總是報錯"no JIntellitype in java.library.path"

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

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

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


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

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

          有問題,就會有人解決問題,antony_miguel在一篇文章中,使用java的反射機制,完成了對于ClassLoader類中的usr_paths變量的動態修改,
          Java代碼 復制代碼
          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. }  

          文章也同時指出了這種實現的局限性,和jvm的實現強關聯,只要jvm實現不是用的變量usr_paths來保存java.library.path的值,這個方法就不能用了。
          但是只要知道源代碼,小小的改動就應該可以實現了。

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

          導航

          統計

          常用鏈接

          留言簿(6)

          隨筆分類(440)

          隨筆檔案(378)

          文章檔案(6)

          新聞檔案(1)

          相冊

          收藏夾(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

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          free counters
          主站蜘蛛池模板: 雷州市| 牙克石市| 通城县| 泰和县| 如皋市| 花莲县| 乌拉特前旗| 屏东县| 白城市| 马尔康县| 花莲市| 商水县| 扎赉特旗| 阜康市| 综艺| 澎湖县| 长宁区| 北京市| 灵川县| 盱眙县| 石嘴山市| 聂拉木县| 武汉市| 方山县| 阿图什市| 怀化市| 桃园市| 柘城县| 和田县| 遂川县| 察雅县| 宁安市| 白河县| 阿城市| 离岛区| 葫芦岛市| 宜阳县| 甘洛县| 长宁县| 西安市| 张家口市|