@echo off chcp 65001 >nul setlocal EnableExtensions EnableDelayedExpansion cd /d "%~dp0.." set "PROJECT_DIR=%CD%" set "TARGET=%PROJECT_DIR%\target" set "DIST=%TARGET%\dist" set "RELEASE_DIR=%DIST%\workutils" set "BUILD_JDK=" echo. echo ========== WorkUtils Windows portable release ========== echo Project: %PROJECT_DIR% call :try_jdk "%JDK17_HOME%" call :try_jdk "%JAVA_HOME%" call :try_jdk "C:\Program Files\Java\jdk-17" call :try_jdk "C:\Program Files\Eclipse Adoptium\jdk-17" if not defined BUILD_JDK ( echo [ERROR] A JDK 17 or newer with jlink.exe is required to build the release. echo Set JAVA_HOME or JDK17_HOME to a valid JDK directory. pause exit /b 1 ) set "JAVA_HOME=%BUILD_JDK%" set "PATH=%JAVA_HOME%\bin;%PATH%" echo Build JDK: %JAVA_HOME% echo. echo [1/5] Build and test executable JAR... call "%PROJECT_DIR%\mvnw.cmd" clean package if errorlevel 1 goto :build_failed echo. echo [2/5] Read project version... set "VERSION=" for /f "usebackq delims=" %%a in (`powershell -NoProfile -NonInteractive -Command "([xml](Get-Content -Encoding UTF8 '%PROJECT_DIR%\pom.xml')).project.version"`) do set "VERSION=%%a" if not defined VERSION ( echo [ERROR] Unable to read the project version from pom.xml. pause exit /b 1 ) set "JAR_NAME=workutils-%VERSION%.jar" set "JAR_PATH=%TARGET%\%JAR_NAME%" if not exist "%JAR_PATH%" ( echo [ERROR] Executable JAR not found: %JAR_PATH% pause exit /b 1 ) echo Version: %VERSION% echo. echo [3/5] Assemble release directory... if exist "%DIST%" rd /s /q "%DIST%" mkdir "%RELEASE_DIR%" || goto :build_failed copy /y "%JAR_PATH%" "%RELEASE_DIR%\%JAR_NAME%" >nul || goto :build_failed powershell -NoProfile -NonInteractive -Command ^ "$text = Get-Content -Raw -Encoding UTF8 '%PROJECT_DIR%\scripts\start-release.bat';" ^ "$text = $text.Replace('@APP_JAR@', '%JAR_NAME%');" ^ "[IO.File]::WriteAllText('%RELEASE_DIR%\start.bat', $text, [Text.UTF8Encoding]::new($false))" if errorlevel 1 goto :build_failed echo. echo [4/5] Generate bundled Java runtime... "%JAVA_HOME%\bin\jlink.exe" ^ --module-path "%JAVA_HOME%\jmods" ^ --add-modules ALL-MODULE-PATH ^ --bind-services ^ --strip-debug ^ --no-header-files ^ --no-man-pages ^ --compress=2 ^ --output "%RELEASE_DIR%\runtime" if errorlevel 1 goto :build_failed "%RELEASE_DIR%\runtime\bin\java.exe" -version if errorlevel 1 goto :build_failed echo. echo [5/5] Create portable ZIP... set "ZIP_PATH=%DIST%\workutils-v%VERSION%-windows.zip" powershell -NoProfile -NonInteractive -Command ^ "Compress-Archive -Path '%RELEASE_DIR%' -DestinationPath '%ZIP_PATH%' -Force" if errorlevel 1 goto :build_failed echo. echo ============================================ echo Build complete. The recipient needs no Java installation. echo Directory: %RELEASE_DIR% echo ZIP: %ZIP_PATH% echo ============================================ exit /b 0 :try_jdk if defined BUILD_JDK exit /b 0 set "CANDIDATE=%~1" if not defined CANDIDATE exit /b 0 if not exist "!CANDIDATE!\bin\java.exe" exit /b 0 if not exist "!CANDIDATE!\bin\jlink.exe" exit /b 0 set "CANDIDATE_VERSION=" set "VERSION_FILE=%TEMP%\workutils-java-version-!RANDOM!.txt" "!CANDIDATE!\bin\java.exe" -version > "!VERSION_FILE!" 2>&1 for /f "tokens=3" %%v in ('findstr /i "version" "!VERSION_FILE!"') do set "CANDIDATE_VERSION=%%~v" del /q "!VERSION_FILE!" >nul 2>&1 set "CANDIDATE_MAJOR=" for /f "tokens=1 delims=." %%m in ("!CANDIDATE_VERSION!") do set "CANDIDATE_MAJOR=%%m" if "!CANDIDATE_MAJOR!"=="1" for /f "tokens=2 delims=." %%m in ("!CANDIDATE_VERSION!") do set "CANDIDATE_MAJOR=%%m" if not defined CANDIDATE_MAJOR exit /b 0 if !CANDIDATE_MAJOR! GEQ 17 set "BUILD_JDK=!CANDIDATE!" exit /b 0 :build_failed echo. echo [ERROR] Windows portable release build failed. pause exit /b 1