日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java中关于路径和使用exe4j打包成ext可执行程序的一些小总结

發(fā)布時間:2025/4/17 java 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java中关于路径和使用exe4j打包成ext可执行程序的一些小总结 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

需求是這樣的,假設你的Java程序啟動的時候要讀一份配置文件,或者一個dll鏈接庫,或者一個jar包,假設是dll好了,那么你的dll到底應該放在哪比較合適?
1.代碼中使用絕對地址,這個是最好理解的,在代碼中寫好了絕對地址,那么程序肯定能找得到,缺點是當你的程序移植到了新的電腦上,那么這個絕對地址很有可能就失效了。

2.使用相對地址,這個就比較人性化了,也是常用的方式,使用相對地址前,首先要搞清楚的是相對地址是相對于誰的地址。我總結了三種情況。

  • 相對于某個class文件的地址
  • 相對于classpath路徑地址
  • 相對于當前工作目錄地址
  • 首先是第一種,相對于class文件的地址,一般來講我們使用的是哪個class文件調用了這個dll,那么這個dll就是相對與這個class文件的地址。比如文件A.java里邊調用了dll文件。那么A.java應該寫的是:
    path=this.class.getResource("").getPath() 或者path=A.class.getResource("").getPath()
    load.(path+"\你的dll文件名.dll")
    需要注意的是load()方法中你的文件名是要加上后綴的,loadlibrary()方法里邊的文件名不加后綴。而且要使用雙反斜杠“\",因為第一個"“是轉義字符。當你的代碼放在一個靜態(tài)函數(shù)里邊時,是不能用this的,但是可以使用A.class。
    這樣的話你的dll文件跟A.class文件放在一塊再運行,程序運行就不會出錯了,放在一塊也就是放在同一個目錄下,注意是和A.class文件在同一個目錄,不是A.java源文件。也就是說你在編譯完成后,找到A.class文件所在的位置,把dll文件放到它旁邊就可以了。
    如果你在A.java中導入了B類,而且你把path=A.class.getResource(”").getPath()換成了path=B.class.getResource("").getPath(),那么你就得把dll文件放在和B.class同一目錄。
    這里解釋一下A.class.getResource("")的意思,getResouce()是獲取資源的意思,完整用法為A.class.getResource(“xxx”),意思是獲取和A.class同一文件下的某個資源xxx,這個xxx資源可以是一個txt文件,比如”name.txt",得到這個”name.txt"的資源對象。那么上邊為什么沒有參數(shù)呢,當“xxx"為空時,表示獲取一個空對象,獲取空對象當然沒有什么用,但是可以通過這個方式獲取A.class文件的地址,就像上邊寫的那樣。

    第二種就是相對于classpath類路徑的地址了,首先我們先對類路徑達成共識,假設你的類A.java。放在包com.gg.yy下,而這個包放在DIRR文件夾下,那么這個DIRR文件夾的路徑應該被你或者你的編輯軟件設為類路徑,java編譯器只有先知道類路徑,才能正確找到com.gg.yy這個包,也才能找到A.java來進行編譯。所以A.java所在的目錄結構為 “類路徑/com/gg/yy/A.java”,如果想要dll文件放在類路徑下,也就是DIRR目錄下,也就是和com目錄待一塊。
    獲取類路徑的方式為:

  • 通過類加載器,類加載器肯定是通過類路徑來尋找和加載類的,path=Thread.currentThread().getContextClassLoader().getResource("").getPath(),或者path=A.class.getClassLoader().getResource("").getPath()
  • 通過這個類A,因為類A所屬的包也是放在類路徑下,所以也可以這么寫:path=A.class.getResource("").getPath(”/“),比第一種寫法只多了”/“。
    只樣的話你的dll文件就得放在類路徑下了。
    值得注意的是類路徑不止有一個,可以有很多個,以上的類路徑我指的是類A的類路徑。如果有一個類B,它可以不用放在目錄DIRR下,比如放在目錄DIRT下,那么就得把DIRT添加到類路徑,這樣編譯器和虛擬機才能找得到類B。我們在設置系統(tǒng)變量時通常也會配classpath類路徑,這個類路徑指的是我們安裝java的目錄中jre下的jar包,jar包是一些經(jīng)過壓縮的class類,有了這些類,我們的java程序才能運行的起來,我們只有把這些class類添加到類路徑中,虛擬機才能找到這些類。虛擬機會找遍所有的類路徑,通過這些類路徑找到所有的java文件。
  • 第三中,那就是相對于當前的工作地址了,寫法為path =System.getProperty(“user.dir”),System.getProperty(“user.dir”)按字面上理解就是系統(tǒng).屬性(工作目錄),也就是獲取操作系統(tǒng)當前的工作目錄了。通過System.getProperty()我們可以獲取系統(tǒng)的很多參數(shù)信息,比如java安裝地址,操作系統(tǒng)的名稱等等,當參數(shù)為user.dar時,意思就是系統(tǒng)當前的工作目錄,值得注意的是,工作目錄是針對某一個進程而言的,進程qq的工作目錄和進程wechat的工作目錄是不一樣的,那么你可能會想,我安裝了qq,安裝的文件夾下哪一個才是工作目錄呢,是最上邊那個嗎?其實不一定的。我在桌面打開了qq,那么桌面就是qq當前這個進程的工作目錄,我在d盤下的test目錄下打開了qq,這個test目錄就是當前這個qq進程的工作目錄。如何在test目錄打開qq?打開cmd,切換到test目錄,然后輸入qq應用程序的地址,然后回車就可以了。
    所以要是你在程序中使用了工作目錄,而且你從這個工作目錄中加載你的dll,那么你只有在這個指定的目錄中打開你的應用程序,你的dll才會被加載到!
    使用工作目錄這個方法看起來沒有用,但是如果的java使用ext4j進行打包成exe,那么你得指定exe4j是不處理dll文件的,通過jar包生成exe時他會跳過dll文件,這樣如果的你使用相對類路徑或者類加載的dll,你的dll放在打包生成jar包中,那么平常運行jar包的時候,dll是可以被加載到的,但是一旦使用exe4j給這個jar包打包,那么dll就不會被打包上了!也就是說打包后的程序就加載不到dll了。使用工作目錄,可以指定dll文件和jar包放在同一級目錄,打成exe后,和exe放在同一級目錄。
    當然也可以先獲取類路徑,然后獲取類路徑的上一級目錄,上一級目錄的上一級目錄。。。這種方式 …/…/…/

    exe4j打包的時候記得根據(jù)你的jre位數(shù)指定32為還是64位。

    還有一個遇到的問題,就是你的dll引用了另外一個dll,那么這個另外引用的dll應該放在哪?
    答:放在工作目錄!或者是C:\Windows\System32,這個目錄比較保險,系統(tǒng)的dll大多放在這個目錄,程序運行的時候會掃描這個目錄,還有一個目錄,C:\Windows\SysWOW64,是C:\Windows\System32的兄弟,內容是差不多的,C:\Windows\System32里邊放的是32位的dll,C:\Windows\SysWOW64里邊放的是64位的dll。當放在C:\Windows\System32不管用的時候,放在C:\Windows\SysWOW64試試看!不知道java的bin目錄下可不可以。

    總結

    以上是生活随笔為你收集整理的Java中关于路径和使用exe4j打包成ext可执行程序的一些小总结的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。