JavaWeb項(xiàng)目中dll文件動(dòng)態(tài)加載方法解析(詳細(xì)步驟)
相信很多做Java的朋友都有過用Java調(diào)用JNI實(shí)現(xiàn)調(diào)用C或C++方法的經(jīng)歷,那么Java Web中又如何實(shí)現(xiàn)DLL/SO文件的動(dòng)態(tài)加載方法呢。今天就給大家?guī)硪黄狫AVA Web項(xiàng)目中DLL/SO文件動(dòng)態(tài)加載方法的文章。
在Java Web項(xiàng)目中,我們經(jīng)常會(huì)用到通過JNI調(diào)用dll動(dòng)態(tài)庫文件來實(shí)現(xiàn)一些JAVA不能實(shí)現(xiàn)的功能,或者是一些第三方dll插件。通常的做法是將這些dll文件復(fù)制到 %JAVA_HOME%\jre\bin\ 文件夾或者 應(yīng)用中間件(Tomcat|Weblogic)的bin目錄下之后,在程序中才能正常使用。但是這個(gè)步驟在項(xiàng)目實(shí)施或移植時(shí)經(jīng)常會(huì)被忘記,比較麻煩,所以就考慮能否在項(xiàng)目運(yùn)行過程中動(dòng)態(tài)加載,而不需要再手動(dòng)復(fù)制這些文件。在網(wǎng)上找了很多資料,大部分的說法要么是手動(dòng)復(fù)制,要么就是JAVA項(xiàng)目中的解決方法(不適用于JAVA Web項(xiàng)目),所以整理此資料,以供參考。
第一步 建立一個(gè)監(jiān)聽類
建立監(jiān)聽類的作用是在應(yīng)用中間件啟動(dòng)時(shí)自動(dòng)執(zhí)行加載程序。
1)創(chuàng)建一個(gè)類實(shí)現(xiàn)ServletContextListener 接口
2)實(shí)現(xiàn)contextInitialized方法
3)在項(xiàng)目的web.xml 文件中配置此監(jiān)聽類
第二步 將dll文件所在的路徑添加到系統(tǒng)環(huán)境java.library.path 中
添加過程需要使用到反射機(jī)制來進(jìn)行,不能使用System.setProperty()進(jìn)行設(shè)置,設(shè)置了也無效。直接看代碼:
private void addDirToPath(String s){ try { //獲取系統(tǒng)path變量對(duì)象 Field field=ClassLoader.class.getDeclaredField("sys_paths"); //設(shè)置此變量對(duì)象可訪問 field.setAccessible(true); //獲取此變量對(duì)象的值 String[] path=(String[])field.get(null); //創(chuàng)建字符串?dāng)?shù)組,在原來的數(shù)組長度上增加一個(gè),用于存放增加的目錄 String[] tem=new String[path.length+1]; //將原來的path變量復(fù)制到tem中 System.arraycopy(path,0,tem,0,path.length); //將增加的目錄存入新的變量數(shù)組中 tem[path.length]=s; //將增加目錄后的數(shù)組賦給path變量對(duì)象 field.set(null,tem); } catch (Exception e) { e.printStackTrace(); } }
第三步 加載dll文件
接下來就可以寫上下文初始化的方法了:
public void contextInitialized(ServletContextEvent arg0) { //獲取存放dll文件的絕對(duì)路徑(假設(shè)將dll文件放在系統(tǒng)根目錄下的WEB-INF文件夾中) String path=arg0.getServletContext().getRealPath("WEB-INF"); //將此目錄添加到系統(tǒng)環(huán)境變量中 addDirToPath(path); //加載相應(yīng)的dll文件,注意要將'\'替換為'/' System.load(path.replaceAll("\\\\","/")+"/XXXX.dll"); }
第四步 重啟啟動(dòng)應(yīng)用中間件(Tomcat|Weblogic)
至此就可以在你的java程序中使用dll文件的方法了。
以上就是本文關(guān)于JavaWeb項(xiàng)目中dll文件動(dòng)態(tài)加載方法的全部內(nèi)容,希望對(duì)大家有所幫助。
相關(guān)文章
springboot讀取application.yaml文件數(shù)據(jù)的方法
這篇文章主要為大家詳細(xì)介紹了springboot讀取application.yaml文件數(shù)據(jù)的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07老生常談JVM的內(nèi)存溢出說明及參數(shù)調(diào)整
下面小編就為大家?guī)硪黄仙U凧VM的內(nèi)存溢出說明及參數(shù)調(diào)整。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03使用@ConditionalOnProperty控制是否加載的操作
這篇文章主要介紹了使用@ConditionalOnProperty控制是否加載的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06java web中圖片驗(yàn)證碼功能的簡單實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄猨ava web 驗(yàn)證碼的簡單實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-06-06spring使用xml方式整合Druid數(shù)據(jù)源連接池
傳統(tǒng)的JDBC數(shù)據(jù)庫連接方式,每次連接都需加載Connection到內(nèi)存并驗(yàn)證,使用后再放回,從而重復(fù)利用數(shù)據(jù)庫連接資源,這不僅降低了系統(tǒng)資源消耗,還避免了頻繁連接導(dǎo)致的服務(wù)器崩潰和內(nèi)存泄漏風(fēng)險(xiǎn),數(shù)據(jù)庫連接池在初始化時(shí)創(chuàng)建并保持最小數(shù)量的數(shù)據(jù)庫連接2024-10-10如何動(dòng)態(tài)修改JavaBean中注解的參數(shù)值
這篇文章主要介紹了如何動(dòng)態(tài)修改JavaBean中注解的參數(shù)值操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-02-02