1. 程式人生 > >Java之—— JAVA Web專案中DLL/SO檔案動態載入方法

Java之—— JAVA Web專案中DLL/SO檔案動態載入方法

相信很多做Java的朋友都有過用Java呼叫JNI實現呼叫C或C++方法的經歷,那麼Java Web中又如何實現DLL/SO檔案的動態載入方法呢。今天就給大家帶來一篇JAVA Web專案中DLL/SO檔案動態載入方法的文章。

在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/so檔案所在的路徑新增到系統環境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();
    }
}

第三步 載入動態庫檔案

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

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

第四步 重啟啟動應用中介軟體(Tomcat|Weblogic)

    至此就可以在你的java程式中使用dll/so檔案的方法了。