Java中关于路径和使用exe4j打包成ext可执行程序的一些小总结
需求是這樣的,假設(shè)你的Java程序啟動(dòng)的時(shí)候要讀一份配置文件,或者一個(gè)dll鏈接庫(kù),或者一個(gè)jar包,假設(shè)是dll好了,那么你的dll到底應(yīng)該放在哪比較合適?
1.代碼中使用絕對(duì)地址,這個(gè)是最好理解的,在代碼中寫好了絕對(duì)地址,那么程序肯定能找得到,缺點(diǎn)是當(dāng)你的程序移植到了新的電腦上,那么這個(gè)絕對(duì)地址很有可能就失效了。
2.使用相對(duì)地址,這個(gè)就比較人性化了,也是常用的方式,使用相對(duì)地址前,首先要搞清楚的是相對(duì)地址是相對(duì)于誰(shuí)的地址。我總結(jié)了三種情況。
首先是第一種,相對(duì)于class文件的地址,一般來(lái)講我們使用的是哪個(gè)class文件調(diào)用了這個(gè)dll,那么這個(gè)dll就是相對(duì)與這個(gè)class文件的地址。比如文件A.java里邊調(diào)用了dll文件。那么A.java應(yīng)該寫的是:
path=this.class.getResource("").getPath() 或者path=A.class.getResource("").getPath()
load.(path+"\你的dll文件名.dll")
需要注意的是load()方法中你的文件名是要加上后綴的,loadlibrary()方法里邊的文件名不加后綴。而且要使用雙反斜杠“\",因?yàn)榈谝粋€(gè)"“是轉(zhuǎn)義字符。當(dāng)你的代碼放在一個(gè)靜態(tài)函數(shù)里邊時(shí),是不能用this的,但是可以使用A.class。
這樣的話你的dll文件跟A.class文件放在一塊再運(yùn)行,程序運(yùn)行就不會(huì)出錯(cuò)了,放在一塊也就是放在同一個(gè)目錄下,注意是和A.class文件在同一個(gè)目錄,不是A.java源文件。也就是說你在編譯完成后,找到A.class文件所在的位置,把dll文件放到它旁邊就可以了。
如果你在A.java中導(dǎo)入了B類,而且你把path=A.class.getResource(”").getPath()換成了path=B.class.getResource("").getPath(),那么你就得把dll文件放在和B.class同一目錄。
這里解釋一下A.class.getResource("")的意思,getResouce()是獲取資源的意思,完整用法為A.class.getResource(“xxx”),意思是獲取和A.class同一文件下的某個(gè)資源xxx,這個(gè)xxx資源可以是一個(gè)txt文件,比如”name.txt",得到這個(gè)”name.txt"的資源對(duì)象。那么上邊為什么沒有參數(shù)呢,當(dāng)“xxx"為空時(shí),表示獲取一個(gè)空對(duì)象,獲取空對(duì)象當(dāng)然沒有什么用,但是可以通過這個(gè)方式獲取A.class文件的地址,就像上邊寫的那樣。
第二種就是相對(duì)于classpath類路徑的地址了,首先我們先對(duì)類路徑達(dá)成共識(shí),假設(shè)你的類A.java。放在包c(diǎn)om.gg.yy下,而這個(gè)包放在DIRR文件夾下,那么這個(gè)DIRR文件夾的路徑應(yīng)該被你或者你的編輯軟件設(shè)為類路徑,java編譯器只有先知道類路徑,才能正確找到com.gg.yy這個(gè)包,也才能找到A.java來(lái)進(jìn)行編譯。所以A.java所在的目錄結(jié)構(gòu)為 “類路徑/com/gg/yy/A.java”,如果想要dll文件放在類路徑下,也就是DIRR目錄下,也就是和com目錄待一塊。
獲取類路徑的方式為:
只樣的話你的dll文件就得放在類路徑下了。
值得注意的是類路徑不止有一個(gè),可以有很多個(gè),以上的類路徑我指的是類A的類路徑。如果有一個(gè)類B,它可以不用放在目錄DIRR下,比如放在目錄DIRT下,那么就得把DIRT添加到類路徑,這樣編譯器和虛擬機(jī)才能找得到類B。我們?cè)谠O(shè)置系統(tǒng)變量時(shí)通常也會(huì)配classpath類路徑,這個(gè)類路徑指的是我們安裝java的目錄中jre下的jar包,jar包是一些經(jīng)過壓縮的class類,有了這些類,我們的java程序才能運(yùn)行的起來(lái),我們只有把這些class類添加到類路徑中,虛擬機(jī)才能找到這些類。虛擬機(jī)會(huì)找遍所有的類路徑,通過這些類路徑找到所有的java文件。
第三中,那就是相對(duì)于當(dāng)前的工作地址了,寫法為path =System.getProperty(“user.dir”),System.getProperty(“user.dir”)按字面上理解就是系統(tǒng).屬性(工作目錄),也就是獲取操作系統(tǒng)當(dāng)前的工作目錄了。通過System.getProperty()我們可以獲取系統(tǒng)的很多參數(shù)信息,比如java安裝地址,操作系統(tǒng)的名稱等等,當(dāng)參數(shù)為user.dar時(shí),意思就是系統(tǒng)當(dāng)前的工作目錄,值得注意的是,工作目錄是針對(duì)某一個(gè)進(jìn)程而言的,進(jìn)程qq的工作目錄和進(jìn)程wechat的工作目錄是不一樣的,那么你可能會(huì)想,我安裝了qq,安裝的文件夾下哪一個(gè)才是工作目錄呢,是最上邊那個(gè)嗎?其實(shí)不一定的。我在桌面打開了qq,那么桌面就是qq當(dāng)前這個(gè)進(jìn)程的工作目錄,我在d盤下的test目錄下打開了qq,這個(gè)test目錄就是當(dāng)前這個(gè)qq進(jìn)程的工作目錄。如何在test目錄打開qq?打開cmd,切換到test目錄,然后輸入qq應(yīng)用程序的地址,然后回車就可以了。
所以要是你在程序中使用了工作目錄,而且你從這個(gè)工作目錄中加載你的dll,那么你只有在這個(gè)指定的目錄中打開你的應(yīng)用程序,你的dll才會(huì)被加載到!
使用工作目錄這個(gè)方法看起來(lái)沒有用,但是如果的java使用ext4j進(jìn)行打包成exe,那么你得指定exe4j是不處理dll文件的,通過jar包生成exe時(shí)他會(huì)跳過dll文件,這樣如果的你使用相對(duì)類路徑或者類加載的dll,你的dll放在打包生成jar包中,那么平常運(yùn)行jar包的時(shí)候,dll是可以被加載到的,但是一旦使用exe4j給這個(gè)jar包打包,那么dll就不會(huì)被打包上了!也就是說打包后的程序就加載不到dll了。使用工作目錄,可以指定dll文件和jar包放在同一級(jí)目錄,打成exe后,和exe放在同一級(jí)目錄。
當(dāng)然也可以先獲取類路徑,然后獲取類路徑的上一級(jí)目錄,上一級(jí)目錄的上一級(jí)目錄。。。這種方式 …/…/…/
exe4j打包的時(shí)候記得根據(jù)你的jre位數(shù)指定32為還是64位。
還有一個(gè)遇到的問題,就是你的dll引用了另外一個(gè)dll,那么這個(gè)另外引用的dll應(yīng)該放在哪?
答:放在工作目錄!或者是C:\Windows\System32,這個(gè)目錄比較保險(xiǎn),系統(tǒng)的dll大多放在這個(gè)目錄,程序運(yùn)行的時(shí)候會(huì)掃描這個(gè)目錄,還有一個(gè)目錄,C:\Windows\SysWOW64,是C:\Windows\System32的兄弟,內(nèi)容是差不多的,C:\Windows\System32里邊放的是32位的dll,C:\Windows\SysWOW64里邊放的是64位的dll。當(dāng)放在C:\Windows\System32不管用的時(shí)候,放在C:\Windows\SysWOW64試試看!不知道java的bin目錄下可不可以。
總結(jié)
以上是生活随笔為你收集整理的Java中关于路径和使用exe4j打包成ext可执行程序的一些小总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jsp页面返回文本时产生大量空格的解决办
- 下一篇: SpringBoot使用mybatis