1. 程式人生 > >利用 EXE4j 生成 ".exe" Java Swing程式

利用 EXE4j 生成 ".exe" Java Swing程式

大上週剛剛了結一個桌面軟體專案。這個專案需要用到SNMP協議,我剛開始嘗試使用不熟的C#,但始終無法ping通目標主機,反而是Java一下就通了,看來還是熟悉的東西比較穩妥。但是用Java的話,大家都懂的~~~(寶寶心裡苦啊)

Java 搭建桌面程式不是不可以,而是需要面臨很多棘手的問題。軟體編寫完成後,本來以為大功告成,奈何還要解決編譯、打包、如何執行在別人的機器上等等諸如此類的問題,麻煩的要命。這真的要感謝很多前輩的博文,給了我很多啟發,幫助我渡過難關。現將自己所經歷的一切總結成文,希望可以幫助到各位同仁,大家一起愉快的玩耍豈不美哉(嘿嘿嘿嘿~~~)

文章涉及軟體與技術

  • 專案技術選型:JDK1.8(32/64 涉及到使用此軟體電腦的版本)
    DruidCommons3Commons-EmailLombokDbutils
  • 資料庫:Access(驅動:ucanaccess)
  • 其它:軟體圖示(.ico)

工程說明

  1. 首先對工程目錄做下說明。src目錄下,二十幾個包,就不打開了。主要說下,為什麼有兩個resources目錄。利用EXE4j將專案打包成.exe後,配置檔案會被一起打包,為了實現配置獨立,又將resources目錄獨立出一份。這樣做之後,resources資料夾要和.exe可執行程式處於同一檔案目錄下,程式才能載入到配置檔案。當然,也可以在程式碼中自定義配置檔案路徑,但那樣做之後,可能會在路徑問題上耗費較多時間(例如我,log4j
    日誌生成目錄弄了半天)
  2. 當前這個工程,我是將log4j配置檔案,加入到maven下的resources裡面的,但在最後生成時,我是將這個檔案,放到外層的resources裡,和其它配置檔案處於同一目錄。這樣的原因是,如果在Eclipse裡面,直接將log4j配置檔案放到外層的resources裡面,會出現載入不到該配置檔案的情況(我想把這幾個配置檔案獨立出來,所以沒有采用預設路徑載入,而是自載入的方式),所以在Eclipse裡面測試時,log4j配置檔案就放在maven管理的resouces下了。只要log4j配置檔案可以正常載入,生成日誌的檔案路徑,就不用操心了。
  3. images後期沒有改動的需求,一併加入到resources
    管理
    在這裡插入圖片描述

準備工作

  1. Java程式是執行在虛擬機器上的,所以別人的電腦要想執行Java程式必須要有Java環境,即jre。而我的程式要執行在32位電腦上,所以就需要準備32位的jre,64位同理;
  2. exe4j軟體;
  3. 桌面程式需要軟體圖示,準備一個ico圖片,並不是必要的。

匯出程式

  1. 程式右鍵 --> Export…
    在這裡插入圖片描述
  2. 選擇“Runnable JAR file(可執行JAR包)”–> next
    在這裡插入圖片描述
  3. 配置如下:
    在這裡插入圖片描述
“Library handing”:我選擇的第一項
  • Extract required libraries into generated JAR:把所有的import JAR都拆開來,包含在JAR的各個目錄中,ex. net/org/xxx.class
  • Package required libraries into generated JAR:把所有的import JAR都包在JAR的根目錄下
  • Copy required libraries into a sub-folder next to the generated JAR:把所有import JAR放在JAR外面獨立的一個資料夾
  • 如果程式依賴於其它包,就在“Library handling”處選擇“Package required libraries into generated JAR”或“Copy required libraries into a sub-folder next to the generated JAR”,如果選擇後者,匯出時,會將需要的包拷貝到一個目錄中,後面引用這個JAR包時,必須將這個目錄拷到JAR包所在的目錄。
  1. 配置完成後,點選“Finish”。如果看到下面的警告不要害怕,只是一個警告而已。提示大致意思是生成的專案有警告(不影響程式執行,但可能是一個未知的隱患)。如果你的程式碼中有黃色告警,那麼到這裡,是肯定會彈出這個提示框的。在這裡插入圖片描述
  2. 不用理會,點選OK!我的輸出路徑是桌面,快看看。在這裡插入圖片描述
  3. 這個“jar”已經可以執行了,但那是因為我的機器裡有“java”執行環境,複製到別人的電腦上是沒用的。現在將它轉換為“.exe”可執行程式

轉換為“.exe”可執行程式

  1. 在桌面建立一個資料夾,將.ico圖示jre(根據自身情況選擇)配置檔案(上面已經說明了配置檔案的情況),放到裡面,就想像下圖
    在這裡插入圖片描述
  2. 開始使用工具EXE4J,啟動該軟體,來到歡迎頁。這裡可以選擇程式轉換“模板”或註冊該軟體。點選“next”
    在這裡插入圖片描述
  3. 第二步,選擇如下,next
    在這裡插入圖片描述
  4. 配置如下,其中第二項,我的輸出位置應該選擇第一步建立的資料夾,已經存放了之前準備好的“32位jre”.配置完成,點選next
    在這裡插入圖片描述
  5. 配置完成後,點選左側樹狀結構“Redirection”
  • “Allow only a single running instance of the application”,表示同一時間只有一個程式可以被啟動。即多次點選程式圖示,只能執行一個程式視窗。
    在這裡插入圖片描述
  1. 這裡可以配置程式的日誌檔案。注意,這個日誌和log4j完成沒關係,應該是exe4j2將Java控制檯輸出的日誌資訊以這種方式輸出。該檔案生成的日誌與.exe程式同級。配置完成後,點選“Version info”在這裡插入圖片描述
  2. 這裡的配置其實可以忽略,有興趣的可以看看
    在這裡插入圖片描述
  3. 如果你的程式是64位,就要勾選它。我的程式執行在32位系統上,不能勾選。
    在這裡插入圖片描述
  4. 來到“Java invocation”,先點選右側的“+”,新增“jar”程式
    在這裡插入圖片描述
  5. 這裡有個小BUG,彈出的對話方塊,點選開啟路徑選擇彈窗無效,只能手動錄入了~~~~這裡選擇的,就是我們通過Eclipse生成的jar 檔案
    在這裡插入圖片描述
  • 點選“OK之後”,回到剛才的視窗,發現多個一條記錄,選中它,然後看下圖。通過選擇可執行jar檔案,exe4j就能加載出它包含的所有類,我們就需要選擇入口類。在這裡插入圖片描述
  • 這裡可以配置虛擬機器引數:-Dfile.encoding=utf-8是設定了utf-8的編碼,以防中文亂碼;在這裡插入圖片描述
  1. 接著“next”,來到“JDK”版本選擇;
    在這裡插入圖片描述
  • 配置好之後,選擇“advanced Options”–> “Search sequence”.剛進來是下圖這樣,不用理這三個傢伙在這裡插入圖片描述
  • 這裡是配置jre的。exe4j2最後生成的".exe"要想在別人的電腦上執行,就需要告訴它jre在哪裡。這裡,當然要填上第一步已經準備好的jre路徑。所以,這個配置的意義,就是最後生成的".exe"是要和jre一起打包給別人的,這樣".exe"才能找到jre,在別人的電腦上執行。
  • 點選最右側綠色的“+”就會彈出下圖的對話方塊,選擇已經準備好的“32位JRE”
    在這裡插入圖片描述
  • 匯入自己的“jre”檔案後,刪除其它三項,特別注意的是,一定要刪除JAVA_HOMEJDK_HOME這兩個預設配置,因為它會儲存你本機的JAVA_HOME地址,給別人用時,就會出現路徑找不到的錯誤;
    在這裡插入圖片描述
  1. 跳過第7步,到第8步,可以選擇語言
    在這裡插入圖片描述
  2. 到這裡,點選“next”,第九步自動解析,之後自動來到最後,大功告成!這一系列操作之後,就可以將這一過程,儲存為一個模板,用相同的配置快速轉換另一個程式了。
    在這裡插入圖片描述
  3. 快看看成果吧!如下圖。圖中沒註釋的檔案,都是我提前放進去的。和工程裡的配置檔案一樣,這樣就做到了配置檔案分離了!程式啟動後,日誌檔案自動儲存到log資料夾中。備註:生成的程式,完美在XP32位系統執行,美滋滋!在這裡插入圖片描述
  • 啟動介面
    在這裡插入圖片描述

常見BUG總結

  1. 如果最終生成的程式,放到別人的電腦上無法執行,有一部分原因是下圖的路徑不對,具體原因我說不明白,我找了很久,只有一篇部落格提到了,但那篇部落格我找不到了。大體意思就是,不能配置絕對路徑,應該使用相對路徑。但是我使用絕對路徑生成的程式,放到別人的電腦上是可以執行的,所以不清楚他為什麼會有這個問題。放在這裡給需要的小夥伴。
  • 絕對路徑的配置
    在這裡插入圖片描述
  • 相對路徑的配置: 重要: “程式主資料夾”前,要加..\來表示上級目錄,exe4j才能載入到入口類
    在這裡插入圖片描述
  1. 打包後的程式報如下錯誤:就是jre位數不對,程式放在什麼系統執行,就使用相應的位數jre即可解決。
    在這裡插入圖片描述
    在這裡插入圖片描述

拓展

exe 生成是編寫Java桌面程式的最重要關卡,通過這道門,以後的事情就簡單很多。如果想把事情做到最完美,還可以考慮以下問題。

jre 瘦身

  1. 現在面臨的問題是,exe程式很小,才十幾M。可jre實在太大了,java8的jre有170M(我滴靠~~)給別人不太方便。jre 的瘦身就成為了一個新的問題(當然,如果不在乎體積大小的,也就不是問題了)
  2. jre 瘦身非常麻煩,我綜合了若干部落格,讓jre縮小了100M左右,再通過壓縮軟體,最終生成的安裝程式只有30M左右,已經是我可以接收的範圍了,就沒有繼續做到極致。做到極致的話,未壓縮狀態的jre應該可以做到10M以下,但那樣需要消耗很多精力,我也就懶得弄了。

整個工程打包為安裝程式

  1. 想讓“.exe”在別人的電腦上執行,就需要“jre”,而且程式還需要其它的配置檔案,總不能直接把這些東西打包到一個壓縮包直接給人家用吧?不太專業。要想辦法弄一個安裝程式給人家用,才符合大公司的做派不是?
  2. 我使用的是“Inno Setup 5”,這個軟體的教程網上有很多,我也就不再拙述了。