IDEA 打包 exe 程式 與 javafxpackager 打包 exe程式
阿新 • • 發佈:2019-02-09
本文導讀
- 很多時候把應用打包成可執行Jar檔案,還是美中不足,因為整個應用被生成了一個jar檔案
- 可以把Jar再轉成exe應用,本文講解兩種方式
javafxpackager
簡 述
- 從 JDK1.7u6 開始 Java FX 內建在Java SE中,同時為Javafx 提供了打包工具-javafxpackager.exe,如下所示。
- 這是推薦方式
- 此種方式適用於任何可執行Jar應用,包括Java SE 與Java FX,也無論是IDEA生成的,還是Eclipse、MyEclipse生成的,或是其它方式生成的
jar 轉 exe
- 以《IDEA 打包 可執行 Jar 程式》中 "Java SE應用"打包生成後的"china.jar"為例繼續進行轉換為exe應用
- 如下所示,現在china.jar可以放到任何安裝了Java 執行環境的電腦上運行了,現在開始將它轉為exe應用。
- 1、新建"jar"、"exe"兩個目錄,名字自己取,建議不含中文和空格就行,將"china.jar"放入到"jar"目錄中
- 使用命令列:javafxpackager -deploy -native image -appclass com.lct.main.MainApp -srcdir E:/wmx/logs/jar -outdir E:/wmx/logs/exe -outfile chinaApp -name china
- 引數詳解,可以直接在cmd輸入"javafxpackager",然後回車,可以看到所有引數資訊
- -deploy:打包程式根據其他引數生成 jnlp 和 html檔案
- -native:生成自包含的應用程式包 (如果可能), 如果指定了型別, 則只建立此型別的包,所支援型別的列表包括: installer, image, exe, msi, dmg, rpm 和 deb。
- -appclass:要執行的應用程式類的限定名稱,即程式入口類的全路徑。
- -srcdir:待打包檔案的基目錄。
- -outdir:要將輸出檔案生成到的目錄的名稱。
- -outfile:生成的檔案的名稱 (不帶副檔名)。
- 這樣生成好的檔案就打包到l"exe"目錄中了,下面的"china.jar"其實就是咋們打包的原始檔,也就是"jar"目錄下的可執行jar檔案,需要的exe應用在"bundles"目錄中
- 需要的就是這個"china"目錄,轉換好的exe應用就在裡面,可以將"china"放到任何安裝了Java執行環境的電腦上執行
執行測試
注意事項
- 1、使用“javafxpackager”方式生成的exe程式包,雖然可以放到任意安裝了Java環境的電腦上執行,但是exe放置的路徑不能含有中文,否則執行失敗,含有空格沒有關係
- 2、Java程式是在Java JVM中執行中的,所以跨平臺,無論是64位還是32位作業系統都沒有問題,而 Java JDK是區分系統的,而且還有64位於32位之分,不同的系統和位數就得下載安裝不同的版本型號的Java JDK。
- 如果使用64位的Java JDK將Jar編譯成exe,則此exe程式預設只能在64位Windows系統中執行;如果想要在32位windows系統中執行,則可以在32位的電腦系統上安裝32位的Java JDK,然後重新編譯即可。
IDEA 自動生成
- IDEA可以將Java Web專案直接轉成war包,可以將Java SE 直接轉成 Jar包,同理 IDEA 可以直接將Java FX轉成exe應用
專案程式碼
package utils; import org.apache.commons.lang3.StringUtils; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.ResourceBundle; /** * Created by Administrator on 2018/6/29 0029. * 日誌工具類 */ public class LogWmxUtils { private static final String LOG_DIR_PATH; static { ResourceBundle resourceBundle = ResourceBundle.getBundle("system"); LOG_DIR_PATH = resourceBundle.getString("logDirPath"); } /** * 寫入日誌 * * @param message */ public static final void writeLine(String message) { try { if (StringUtils.isNotBlank(message)) { File logDir = new File(LOG_DIR_PATH); if (!logDir.exists()) { logDir.mkdirs(); } SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String logName = simpleDateFormat1.format(new Date()); String messageHead = simpleDateFormat2.format(new Date()); File logFile = new File(logDir, logName + ".log"); FileWriter fileWriter = new FileWriter(logFile, true); fileWriter.write(messageHead + ":" + message + "\r\n"); fileWriter.flush(); fileWriter.close(); } } catch (IOException e) { e.printStackTrace(); } } }
package sample; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.stage.Stage; import utils.LogWmxUtils; public class Main extends Application { @Override public void start(Stage primaryStage) throws Exception { Parent root = FXMLLoader.load(getClass().getResource("sample.fxml")); primaryStage.setTitle("2018 China"); primaryStage.setScene(new Scene(root, 300, 275)); primaryStage.show(); } public static void main(String[] args) { LogWmxUtils.writeLine("Application startup"); launch(args); } }
打包exe
- 經過了上面的javafxpackager打包之後,這裡就更加簡單了
- 這和使用javafxpackager打包基本一樣,同樣IDEA會先將應用打包成可執行Jar檔案,如下所示的"USA.jar",在通過它來進行轉換,真正需要的在"bundles"目錄中
- 下面的"USA"目錄才是真正需要的東西,可以拷貝到任何安裝了Java環境的電腦上執行