记录一下(针对 Windows 的加密、打包、安装、运行)
一般都很少人会使用 JavaFX 去写桌面程序,但是因为某些原因,不得不使用,并且还需要对外发布安装包。为了防止代码被看到(因为 jar 包是类似于压缩包,解压就能看到全部内容),所以使用了 xjar 进行加密。
xjar_github
首先按照 github 的 readme 将 jar 包引入,并且增加 xjar-plugin。
// 打包命令
mvn clean package -Dxjar.password=自定义的密码
打包后,会出现一个 xjar.go 文件,这个文件就是执行文件,通过该文件去执行 java -jar ***.xjar 去运行 jar包,从而将加密后的 javafx 程序运行起来
maven 打包后,target 目录下有几个关键文件
- ***.jar -- 未加密的 jar 包
- ***.xjar -- 加密后的 jar 包
- xjar.go -- 真正执行文件
这个时候的运行命令是 xjar.go java -jar ***.xjar
此时,还需要将这些文件打包成安装包,并且需要有一个可执行文件用来安装后运行。
因为 xjar.go 是真正运行文件,所以就需要将 xjar.go 编译成 .exe 文件,这个可以使用 go 官方的命令
go build
(go build 具体参数不写了,如果需要打包其他相关文件到同一个exe,还有图标等,百度都有)
如果需要 go 编译后的 .exe 文件能直接运行,而不是执行上述命令(双击 .exe 文件直接运行)
则需要对 maven 打包出的 xjar.go 做亿点点改造(本机没 xjar.go 文件了,所以直接文字说明吧)
通过观察 xjar.go 文件发现,内部是通过调用 cmd 命令行来直接执行 java -jar ***.xjar
的。
具体的入口在 main()
方法,里面会拿到传入的参数(就是 java -jar ***.xjar
),这三个参数,然后去调用后续方法。
- 首先将第一个参数
java
拿出来,作为执行命令 - 后面的参数作为
java
命令的执行参数,如果要设置某些如-Xmx
这些,则放在第一个参数后面,倒数第一、第二个参数前面 - 倒数第二个参数会作为
-jar
,如果不是会报错 - 倒数第一个参数就是执行的
xjar
包
// 这是生成 xjar.go 中获取 jar 包名称的方法,会直接寻找 -jar 参数的下一个参数作为执行的 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
}
因为默认参数是要自己传的(看xjar.go java -jar ***.xjar
能看出来),所以为了让直接执行 xjar.go
能有这种效果,则直接修改生成的 xjar.go
文件
在
main()
入口处,直接写死运行命令,将main()
方法传入的 args[] 手动赋值
- 把 args[0] 赋值成 java
- 后续的赋值成启动参数
- 最后两个为
-jar
和***.xjar
上述操作完成后,运行 xjar.go 就能直接启动 jar包了,但是这个时候发现会弹出 cmd 窗口来执行,所以还要隐藏
将 xjar.go 打包成 exe 的命令换成 go build -ldflags="-H windowsgui"
// 并且在这行代码下添加下面那行代码
cmd := exec.Command(java, args...)
// 添加的代码
cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
这个实现运行打包后的 xjar.exe
就能隐藏弹窗直接启动 jar
包了
最后就是使用 inno setup 打包成安装包了。
具体执行文件直接选 xjar.exe 那个文件,这个文件自己修改名称。xjar 包和其他需要的文件夹也一起打包进去,为加密的 Jar 包就不需要了。具体的打包方法直接百度就好了。