記錄一下(針對(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ù)方法。
- 首先將第一個(gè)參數(shù)
java拿出來,作為執(zhí)行命令 - 后面的參數(shù)作為
java命令的執(zhí)行參數(shù),如果要設(shè)置某些如-Xmx這些,則放在第一個(gè)參數(shù)后面,倒數(shù)第一、第二個(gè)參數(shù)前面 - 倒數(shù)第二個(gè)參數(shù)會(huì)作為
-jar,如果不是會(huì)報(bào)錯(cuò) - 倒數(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)賦值
- 把 args[0] 賦值成 java
- 后續(xù)的賦值成啟動(dòng)參數(shù)
- 最后兩個(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 包就不需要了。具體的打包方法直接百度就好了。