JavaFX 使用 xjar 加密并且打包成 exe安裝運(yùn)行

記錄一下(針對(duì) Windows 的加密、打包、安裝、運(yùn)行)
一般都很少人會(huì)使用 JavaFX 去寫桌面程序,但是因?yàn)槟承┰?,不得不使用,并且還需要對(duì)外發(fā)布安裝包。為了防止代碼被看到(因?yàn)?jar 包是類似于壓縮包,解壓就能看到全部?jī)?nèi)容),所以使用了 xjar 進(jìn)行加密。
xjar_github
首先按照 github 的 readme 將 jar 包引入,并且增加 xjar-plugin。

// 打包命令
mvn clean package -Dxjar.password=自定義的密碼

打包后,會(huì)出現(xiàn)一個(gè) xjar.go 文件,這個(gè)文件就是執(zhí)行文件,通過該文件去執(zhí)行 java -jar ***.xjar 去運(yùn)行 jar包,從而將加密后的 javafx 程序運(yùn)行起來

maven 打包后,target 目錄下有幾個(gè)關(guān)鍵文件

  • ***.jar -- 未加密的 jar 包
  • ***.xjar -- 加密后的 jar 包
  • xjar.go -- 真正執(zhí)行文件

這個(gè)時(shí)候的運(yùn)行命令是 xjar.go java -jar ***.xjar

此時(shí),還需要將這些文件打包成安裝包,并且需要有一個(gè)可執(zhí)行文件用來安裝后運(yùn)行。
因?yàn)?xjar.go 是真正運(yùn)行文件,所以就需要將 xjar.go 編譯成 .exe 文件,這個(gè)可以使用 go 官方的命令
go build (go build 具體參數(shù)不寫了,如果需要打包其他相關(guān)文件到同一個(gè)exe,還有圖標(biāo)等,百度都有)

如果需要 go 編譯后的 .exe 文件能直接運(yùn)行,而不是執(zhí)行上述命令(雙擊 .exe 文件直接運(yùn)行)
則需要對(duì) maven 打包出的 xjar.go 做億點(diǎn)點(diǎn)改造(本機(jī)沒 xjar.go 文件了,所以直接文字說明吧)

通過觀察 xjar.go 文件發(fā)現(xiàn),內(nèi)部是通過調(diào)用 cmd 命令行來直接執(zhí)行 java -jar ***.xjar 的。
具體的入口在 main() 方法,里面會(huì)拿到傳入的參數(shù)(就是 java -jar ***.xjar),這三個(gè)參數(shù),然后去調(diào)用后續(xù)方法。

  1. 首先將第一個(gè)參數(shù) java 拿出來,作為執(zhí)行命令
  2. 后面的參數(shù)作為 java 命令的執(zhí)行參數(shù),如果要設(shè)置某些如 -Xmx 這些,則放在第一個(gè)參數(shù)后面,倒數(shù)第一、第二個(gè)參數(shù)前面
  3. 倒數(shù)第二個(gè)參數(shù)會(huì)作為 -jar,如果不是會(huì)報(bào)錯(cuò)
  4. 倒數(shù)第一個(gè)參數(shù)就是執(zhí)行的 xjar
// 這是生成 xjar.go 中獲取 jar 包名稱的方法,會(huì)直接尋找 -jar 參數(shù)的下一個(gè)參數(shù)作為執(zhí)行的 jar 包名稱
// find jar name from args
func JAR(args []string) (string, error) {
    var jar string

    l := len(args)
    for i := 1; i < l-1; i++ {
        arg := args[i]
        if arg == "-jar" {
            jar = args[i+1]
        }
    }
    if jar == "" {
        return "", errors.New("unspecified jar name")
    }
    return jar, nil
}

因?yàn)槟J(rèn)參數(shù)是要自己傳的(看xjar.go java -jar ***.xjar能看出來),所以為了讓直接執(zhí)行 xjar.go 能有這種效果,則直接修改生成的 xjar.go 文件

main()入口處,直接寫死運(yùn)行命令,將main()方法傳入的 args[] 手動(dòng)賦值

  1. 把 args[0] 賦值成 java
  2. 后續(xù)的賦值成啟動(dòng)參數(shù)
  3. 最后兩個(gè)為 -jar***.xjar
    上述操作完成后,運(yùn)行 xjar.go 就能直接啟動(dòng) jar包了,但是這個(gè)時(shí)候發(fā)現(xiàn)會(huì)彈出 cmd 窗口來執(zhí)行,所以還要隱藏
將 xjar.go 打包成 exe 的命令換成 go build  -ldflags="-H windowsgui"
// 并且在這行代碼下添加下面那行代碼
cmd := exec.Command(java, args...)
// 添加的代碼
cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}

這個(gè)實(shí)現(xiàn)運(yùn)行打包后的 xjar.exe就能隱藏彈窗直接啟動(dòng) jar 包了

最后就是使用 inno setup 打包成安裝包了。
具體執(zhí)行文件直接選 xjar.exe 那個(gè)文件,這個(gè)文件自己修改名稱。xjar 包和其他需要的文件夾也一起打包進(jìn)去,為加密的 Jar 包就不需要了。具體的打包方法直接百度就好了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容