1. 程式人生 > >IDEA 打包 exe 程式 與 javafxpackager 打包 exe程式

IDEA 打包 exe 程式 與 javafxpackager 打包 exe程式

本文導讀

  • 很多時候把應用打包成可執行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",然後回車,可以看到所有引數資訊
  1. -deploy:打包程式根據其他引數生成 jnlp 和 html檔案
  2. -native:生成自包含的應用程式包 (如果可能), 如果指定了型別, 則只建立此型別的包,所支援型別的列表包括: installer, image, exe, msi, dmg, rpm 和 deb。
  3. -appclass:要執行的應用程式類的限定名稱,即程式入口類的全路徑。
  4. -srcdir:待打包檔案的基目錄。
  5. -outdir:要將輸出檔案生成到的目錄的名稱。
  6.  -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環境的電腦上執行


執行測試



資原始檔位置