Java之——Web項目中DLL文件動態加載方法


本文轉自:https://blog.csdn.net/l1028386804/article/details/53903557

在Java Web項目中,我們經常會用到通過JNI調用dll動態庫文件來實現一些JAVA不能實現的功能,或者是一些第三方dll插件。通常的做法是將這些dll文件復制到 %JAVA_HOME%\jre\bin\ 文件夾或者 應用中間件(Tomcat|Weblogic)的bin目錄下之后,在程序中才能正常使用。但是這個步驟在項目實施或移植時經常會被忘記,比較麻煩,所以就考慮能否在項目運行過程中動態加載,而不需要再手動復制這些文件。在網上找了很多資料,大部分的說法要么是手動復制,要么就是JAVA項目中的解決方法(不適用於JAVA Web項目),所以整理此資料,以供參考。

第一步 建立一個監聽類
    建立監聽類的作用是在應用中間件啟動時自動執行加載程序。
    1)創建一個類實現ServletContextListener 接口
    2)實現contextInitialized方法
    3)在項目的web.xml 文件中配置此監聽類

第二步 將dll文件所在的路徑添加到系統環境java.library.path 中
    添加過程需要使用到反射機制來進行,不能使用System.setProperty()進行設置,設置了也無效。直接看代碼:

private void addDirToPath(String s){
    try {
        //獲取系統path變量對象
        Field field=ClassLoader.class.getDeclaredField("sys_paths");
        //設置此變量對象可訪問 
        field.setAccessible(true);
        //獲取此變量對象的值 
        String[] path=(String[])field.get(null);
        //創建字符串數組,在原來的數組長度上增加一個,用於存放增加的目錄
        String[] tem=new String[path.length+1];
        //將原來的path變量復制到tem中 
        System.arraycopy(path,0,tem,0,path.length);
        //將增加的目錄存入新的變量數組中 
        tem[path.length]=s;
        //將增加目錄后的數組賦給path變量對象
        field.set(null,tem);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

第三步 加載dll文件

接下來就可以寫上下文初始化的方法了:

public void contextInitialized(ServletContextEvent arg0) {
    //獲取存放dll文件的絕對路徑(假設將dll文件放在系統根目錄下的WEB-INF文件夾中)
    String path=arg0.getServletContext().getRealPath("WEB-INF");
    //將此目錄添加到系統環境變量中 
    addDirToPath(path);
    //加載相應的dll文件,注意要將'\'替換為'/' 
    System.load(path.replaceAll("\\\\","/")+"/XXXX.dll"); 
 }

第四步 重啟啟動應用中間件(Tomcat|Weblogic)

至此就可以在你的java程序中使用dll文件的方法了。

---------------------
作者:liuyazhuang
來源:CSDN
原文:https://blog.csdn.net/l1028386804/article/details/53903557
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM