解決Java 部署Tomcat時(shí)使用jni和jna調(diào)用DLL文件的問(wèn)題
我的前一篇博客提到,我們公司項(xiàng)目的restful框架中要用到底層的DLL C++庫(kù),最后經(jīng)過(guò)測(cè)試驗(yàn)證結(jié)果選擇采用JNA方法來(lái)調(diào)DLL庫(kù)。
之后基礎(chǔ)框架在IDEA中的jetty服務(wù)中調(diào)試成功,但是在部署到Tomcat上時(shí)出現(xiàn)了無(wú)法加載DLL庫(kù)的狀況,只能現(xiàn)學(xué)現(xiàn)賣了。
一. 把DLL文件放在Tomcat下的方法:
在Tomcat中加載dll,供其它接口調(diào)用:
在Tomcat目錄根下新建一個(gè)文件夾,這里就叫DLL吧,<tomcat_home>/DLL;
把需要用到的dll放入新建的DLL目錄下;
編輯<tomcat_home>/conf/catalina.properties,在common.loader后面追加${catalina.home}/DLL;
編輯<tomcat_home>/bin/目錄下的catalina.bat,在rem Copy CATALINA_BASE from CATALINA_HOME if not defined的段落中增加如下語(yǔ)句:
set LD_LIBRARY_PATH=%CATALINA_BASE%\DLL
set JAVA_OPTS=-Djava.library.path=%CATALINA_BASE%\DLL%JAVA_OPTS%
保存重新啟動(dòng)Tomcat,deploy war即可。
二. 把DLL文件放在java.library.path路徑下,可以通過(guò)System.out.println(System.getProperty("java.library.path"));語(yǔ)句查看都有哪些系統(tǒng)調(diào)默認(rèn)調(diào)用的文件路徑。Tomcat會(huì)在這些目錄下尋找要加載的文件、庫(kù)等。
三. 在使用JNA調(diào)用DLL時(shí),總是提示無(wú)法加載相應(yīng)的庫(kù)。把DLL文件放在各種路徑下都不起作用。
無(wú)奈之下,我換成JNI工具嘗試了一下,結(jié)果提示Can't load IA 32-bit .dll on a AMD 64-bit platform。真相終于浮出了水面,原來(lái)是因?yàn)镴DK和DLL系統(tǒng)不兼容(萬(wàn)萬(wàn)沒(méi)想到問(wèn)題出在這里),于是我把DLL重新編譯成64位試了一下,成功部署。
然后我又換成JNA工具后試了一下也成功部署(早該換成JNI試一下,就是因?yàn)镴NI使用步驟過(guò)于繁瑣,所以一直對(duì)JNA不死心,結(jié)果拖了很長(zhǎng)時(shí)間),問(wèn)題解決。
四.使用JNA的時(shí)候,大多數(shù)網(wǎng)上教程中Native.loadLibrary(“DLL name”, classname.class); 中的第一個(gè)參數(shù)都是相對(duì)路徑。按照編程經(jīng)驗(yàn),這里應(yīng)該也可以寫(xiě)成絕對(duì)路徑,例如:
Native.loadLibrary(“C:\Program Files (x86)\Java\jdk1.8.0_51\bin\ DLLname.dll”, classname.class);
我這樣試著跑了一下,證明我的猜想是正確的。
五. 把DLL放在Tomcat文件夾下的bin文件中也可以找到。Linux下放在 /user/local/bin 中。這是我最后采用的方式。
總結(jié):
問(wèn)題可能出在方方面面,需要學(xué)習(xí)的還很多,經(jīng)驗(yàn)也相當(dāng)重要。同時(shí)應(yīng)該在自己的代碼中建立完整的異常報(bào)錯(cuò)體系,和良好的異常處理習(xí)慣。但是我又擔(dān)心太多的分支處理會(huì)影響整體的性能。還是好好修煉內(nèi)功才是王道啊。
補(bǔ)充知識(shí):正確配置java jdk環(huán)境變量方式 及 配置tomcat后執(zhí)行startup.bat閃退原因分析
我們用的很多軟件都需要配置環(huán)境變量,有的軟件會(huì)自動(dòng)配置環(huán)境變量,不需要我們手動(dòng)配置.而有的必須手動(dòng)配置環(huán)境變量,比如git, eclipse等.
下面分享一下正確配置java環(huán)境變量的方法.因?yàn)楹芏嘬浖倪\(yùn)行都需要基于配置java環(huán)境變量的基礎(chǔ)上.
以配置jdk1.8為例:
1 安裝jdk1.8
如圖中所以,打開(kāi)jdk-xxx.exe,進(jìn)行安裝jdk,事先建兩個(gè)文件夾jdk,jre,用于分別作為jdk和jre的安裝文件夾
2 配置環(huán)境變量
安裝完之后,就是配置環(huán)境變量:
JAVA_HOME -- 變量值就是jdk的主目錄,圖中已用藍(lán)色標(biāo)出(配置JAVA_HOME變量值時(shí),末尾一定不要加分號(hào))
Path -- 需要配置兩個(gè),jdk的bin目錄和jdk下的jre的bin目錄,如圖中所示:
即 %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

JAVA_HOME和Path配置截圖:


配置完之后,可以打開(kāi)Windows+R.輸入cmd,打開(kāi)dos窗口,輸入 java 和 javac -version (或java version)來(lái)進(jìn)行驗(yàn)證java環(huán)境變量是否配置成功和查看所配置的jdk版本信息


注意:
有些軟件需要嚴(yán)格配置java環(huán)境變量.比如在配置Tomcat后,執(zhí)行startup.bat手動(dòng)啟動(dòng)tomcat會(huì)閃退.原因就是環(huán)境變量沒(méi)有正確配置.
右鍵startup.bat,編輯,在文本的最后敲上pause,保存后重新運(yùn)行startup.bat, 這時(shí)候窗口不會(huì)再閃退,而是停留在桌面上,如果有錯(cuò)誤信息,這時(shí)候會(huì)顯示出來(lái),可以根據(jù)提示確定是哪里出錯(cuò).進(jìn)而針對(duì)性解決.其實(shí)90%的原因就是java環(huán)境變量沒(méi)有正確配置

調(diào)試成功后,記得把pause去掉

(注意;有時(shí)java環(huán)境變量雖沒(méi)有正確配置,但不影響eclipe的運(yùn)行.但若沒(méi)有正確配置java環(huán)境變量,就會(huì)導(dǎo)致配置tomcat后,執(zhí)行startup.bat出現(xiàn)閃退現(xiàn)象.)
正確配置java環(huán)境變量方式,見(jiàn)前面所示。
以上這篇解決Java 部署Tomcat時(shí)使用jni和jna調(diào)用DLL文件的問(wèn)題就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
servlet的url-pattern匹配規(guī)則詳細(xì)描述(小結(jié))
在利用servlet或Filter進(jìn)行url請(qǐng)求的匹配時(shí),很關(guān)鍵的一點(diǎn)就是匹配規(guī)則。這篇文章主要介紹了servlet的url-pattern匹配規(guī)則詳細(xì)描述(小結(jié)),非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-07-07
java返回前端樹(shù)形結(jié)構(gòu)數(shù)據(jù)的2種實(shí)現(xiàn)方式
近期項(xiàng)目有個(gè)需求,需要將組織機(jī)構(gòu)數(shù)據(jù)拼成樹(shù)型結(jié)構(gòu)返回至前端,下面這篇文章主要給大家介紹了關(guān)于java返回前端樹(shù)形結(jié)構(gòu)數(shù)據(jù)的2種實(shí)現(xiàn)方式,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-05-05
SpringBoot @SpringBootTest加速單元測(cè)試的小訣竅
這篇文章主要介紹了SpringBoot @SpringBootTest加速單元測(cè)試的小訣竅,具有很好的參考價(jià)值,對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
Spring Cloud重試機(jī)制與各組件的重試總結(jié)
這篇文章主要給大家介紹了關(guān)于Spring Cloud中重試機(jī)制與各組件的重試的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11
MyBatis-Plus MetaObjectHandler的原理及使用
MyBatis-Plus的MetaObjectHandler接口允許開(kāi)發(fā)者自動(dòng)填充實(shí)體類字段,如創(chuàng)建時(shí)間、更新時(shí)間等公共字段,減少代碼重復(fù),提高數(shù)據(jù)一致性和完整性,感興趣的可以了解一下2024-10-10
Maven的porfile與SpringBoot的profile結(jié)合使用案例詳解
這篇文章主要介紹了Maven的porfile與SpringBoot的profile結(jié)合使用,通過(guò)maven的profile功能,在打包的時(shí)候,通過(guò)-P指定maven激活某個(gè)pofile,這個(gè)profile里面配置了一個(gè)參數(shù)activatedProperties,不同的profile里面的這個(gè)參數(shù)的值不同,需要的朋友可以參考下吧2021-12-12
Java中一維二維數(shù)組的靜態(tài)和動(dòng)態(tài)初始化
今天通過(guò)本文給大家分享Java中的數(shù)組,包括一維數(shù)組和二維數(shù)組的靜態(tài)初始化和動(dòng)態(tài)初始化問(wèn)題,感興趣的朋友一起看看吧2017-10-10
mybatis的動(dòng)態(tài)SQL以及連接池詳解
這篇文章主要介紹了mybatis的動(dòng)態(tài)SQL以及連接池詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
SpringDataJpa寫(xiě)原生sql遇到的問(wèn)題及解決
這篇文章主要介紹了SpringDataJpa寫(xiě)原生sql遇到的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11

