使用jlink打包
打包完成后会产生以下文件
app
├── bin
├── conf
├── legal
├── lib
└── release
其中bin文件夹中包含了java环境以及bat启动脚本
通过这个bat文件可以启动我们的javafx程序
使用golang打包app文件夹
直接上代码
import (
"embed"
"fmt"
"io/fs"
"os"
"os/exec"
"path/filepath"
"syscall"
)
//go:embed assets/*
var embeddedFiles embed.FS
func main() {
tmpDir := filepath.Join(os.TempDir(), "tmp_dir")
if err := os.MkdirAll(tmpDir, 0755); err != nil {
fmt.Println("Error creating temp directory:", err)
return
}
defer os.RemoveAll(tmpDir)
err := embedFilesToTempDir(tmpDir)
if err != nil {
fmt.Println("Error extracting files:", err)
return
}
if err != nil {
fmt.Println("Error extracting disk:", err)
return
}
batFile := filepath.Join(tmpDir, "assets", "bin", "app.bat")
cmd := exec.Command(batFile)
cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
err = cmd.Run()
if err != nil {
fmt.Println("Error running the JavaFX application:", err)
}
}
func embedFilesToTempDir(tmpDir string) error {
return fs.WalkDir(embeddedFiles, "assets", func(path string, d fs.DirEntry, err error) error {
if err != nil {
return err
}
if d.IsDir() {
return nil
}
data, err := embeddedFiles.ReadFile(path)
if err != nil {
return err
}
destPath := filepath.Join(tmpDir, path)
if err := os.MkdirAll(filepath.Dir(destPath), 0755); err != nil {
return err
}
if err := os.WriteFile(destPath, data, 0644); err != nil {
return err
}
return nil
})
}
通过embed将app文件夹嵌入到可执行文件中,在运行时解压app至临时文件夹,并通过调用bat文件启动javafx程序