<AI>
JavaFXアプリケーションを自己更新(バージョンアップ)し、
メインプログラムの終了後にバッチファイルへ処理を切り替えるには、以下の手順で実装します。
Javaからバッチファイルをコピーする: Files.copy を使用します。
バッチファイルを非同期で実行する: ProcessBuilder を使ってJava外でバッチプロセスを開始します。
Javaプログラムを終了させる: System.exit(0) でメインプロセスを閉じます。
1. Java側(JavaFX)の実装例
Javaプログラム内で更新用バッチをコピーし、プロセスを実行してから自身を終了させます。
java
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
public class Updater {
public static void executeUpdate() {
try {
// パスの設定 (環境に合わせて適宜変更してください)
Path sourceBat = Path.of("update/update_temp.bat"); // コピー元のバッチ
Path targetBat = Path.of("update.bat"); // 実行するバッチ
// 1. バッチファイルを安全な場所へコピーする
Files.copy(sourceBat, targetBat, StandardCopyOption.REPLACE_EXISTING);
// 2. バッチファイルの起動 (ProcessBuilderを使用)
ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/c", targetBat.toAbsolutePath().toString());
// バックグラウンドで独立して実行させるために、ディレクトリを指定
pb.directory(targetBat.toAbsolutePath().getParent().toFile());
pb.start();
// 3. JavaFXアプリケーションを閉じる
System.exit(0); ==> finalOperation2() に制御を渡す
} catch (IOException e) {
e.printStackTrace();
}
}
}
2. コピー先バッチファイル(update.bat)の処理例
Javaが終了するのを待ってから(timeoutなどで数秒待機を推奨)、上書きや再起動の処理を行います。
bat
@echo off
REM Javaのプロセスが確実に終了するまで待機
timeout /t 3 /nobreak > nul
REM 新しいバージョンのファイルを上書きコピー
copy /Y "update\app_new.jar" "app.jar"
REM バージョンアップ完了後に新アプリを再起動
start "" "app.jar"
REM 自身(バッチファイル)を終了
exit
重要なポイント
競合の回避: コピー元のバッチファイル(update_temp.bat)は、実行中のJavaにロックされないように別のディレクトリに配置しておく必要があります。
待機時間の確保: バッチファイル側で数秒のウェイト(timeoutコマンドなど)を入れることで、Javaプロセスが完全に終了してからファイルを上書きできます。
ロックエラーを防ぐために必須の処理です。
管理者権限: プログラムのインストール先(C:\Program Files など)を更新する場合は、バッチファイルおよびJavaアプリケーションに管理者権限が必要になります。
必要に応じてマニフェストファイル等で権限昇格を構成してください。