From 7b2a184dd4b968bcbcb40257e584ff1e06d3267b Mon Sep 17 00:00:00 2001 From: Christophe Lallement Date: Wed, 29 Jul 2026 23:32:30 -0400 Subject: [PATCH] build(distrib): add jdeploy packaging for native installers Introduces native installer generation for Windows, macOS, and Linux using jDeploy. The packaging is driven by package.json and a GitHub Actions workflow that builds platform-specific bundles with embedded Azul Zulu FX JRE 26. Key additions: - package.json descriptor with jDeploy configuration targeting 7 platforms (excludes windows-arm64 due to missing Azul FX build) - jdeploy-maven-plugin behind a profile to sync descriptor fields from POM without requiring Node in default builds - GitHub workflow triggered by v* tags (versioned releases) or *-snapshot branches (rolling prereleases) - Version-free finalName (pholio.jar) so jar path stays stable - Launcher reads package-info.json from jdeploy tag for auto-update The spring-boot-maven-plugin's mainClass is the single source of truth for the entry point: it lands in the repackaged jar's manifest as Start-Class, which jDeploy's native launcher uses to bootstrap. --- .github/workflows/jdeploy.yml | 64 +++++++++++++++++++++++++++++++++ .gitignore | 6 ++++ CLAUDE.md | 29 +++++++++++++++ icon.png | Bin 0 -> 18907 bytes package.json | 35 ++++++++++++++++++ pom.xml | 66 ++++++++++++++++++++++++++++++++++ 6 files changed, 200 insertions(+) create mode 100644 .github/workflows/jdeploy.yml create mode 100644 icon.png create mode 100644 package.json diff --git a/.github/workflows/jdeploy.yml b/.github/workflows/jdeploy.yml new file mode 100644 index 0000000..876fb68 --- /dev/null +++ b/.github/workflows/jdeploy.yml @@ -0,0 +1,64 @@ +# Builds the native installers for Windows, macOS and Linux and publishes them as GitHub release assets. +# +# Two channels, distinguished by what was pushed: +# * a `v*` tag -> a versioned release; the tag name minus the leading `v` becomes the app version. +# * a `*-snapshot` branch -> a rolling prerelease named after the branch, replaced on every push. +# +# Auto-update needs nothing else from us. The jDeploy action writes a package-info.json to a `jdeploy` tag in +# this repository, and the native launcher installed on a user's machine reads it on startup to notice a newer +# release. That only works while the repository is public — a private repository needs a separate public +# release-only repository passed as `target_repository`. +name: jdeploy + +on: + push: + tags: + - 'v*' + branches: + - '*-snapshot' + # Lets the pipeline be exercised without cutting a tag. Running it on a branch produces the snapshot + # prerelease for that branch, exactly as a push would. + workflow_dispatch: + +# The action rewrites a shared `jdeploy` tag, so two runs must never overlap. Queued rather than cancelled: +# cancelling mid-upload is what leaves that tag half written. +concurrency: + group: jdeploy-release-${{ github.repository }} + cancel-in-progress: false + +jobs: + bundle: + runs-on: ubuntu-latest + permissions: + # Needed to create the release and to push the `jdeploy` tag that carries package-info.json. + contents: write + + steps: + - uses: actions/checkout@v4 + + # Zulu rather than Temurin: the JavaFX dependencies are pinned to a Zulu FX build locally, and Azul + # publishes non-LTS feature releases, which Java 26 is. + - name: Set up JDK 26 + uses: actions/setup-java@v4 + with: + java-version: '26' + distribution: 'zulu' + cache: maven + + # The -Pjdeploy profile synchronises package.json by shelling out to `npm pkg set`, so Node has to be on + # PATH before Maven runs, not just before the jDeploy action. + - name: Set up Node + uses: actions/setup-node@v4 + with: + node-version: '22' + + - name: Build + run: ./mvnw -B --no-transfer-progress -Pjdeploy package + + - name: Build app installer bundles + uses: shannah/jdeploy@v6.1.5 + with: + github_token: ${{ github.token }} + # Kept in step with jdeploy.cli.version in pom.xml. The action's own default lags its release tag. + jdeploy_version: '6.1.5' + diff --git a/.gitignore b/.gitignore index b683da0..65a6dfd 100644 --- a/.gitignore +++ b/.gitignore @@ -42,3 +42,9 @@ logs/ *.mv.db *.trace.db +### jDeploy +# Generated by the jDeploy CLI: the npm-shaped launcher bundle and the installer/release staging directory. +jdeploy-bundle/ +jdeploy/ +node_modules/ + diff --git a/CLAUDE.md b/CLAUDE.md index eda6a17..6800bf9 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -11,6 +11,35 @@ This project is a desktop application for images / pictures management. Like col * For packaging, use spring boot generated jar, and jdeploy to create OS package (jdk/jre included) * Use lombok when applicable (Constructor and getter / setter) +## Packaging & distribution (jDeploy) + +Native installers with a bundled JRE are produced by jDeploy, driven from two files: `package.json` at the +repository root (the descriptor) and `.github/workflows/jdeploy.yml` (the release pipeline). + +* **Entry point.** jDeploy has no main-class setting — it runs the jar. So the entry point is declared once, as + `spring-boot-maven-plugin`'s `${main.class}`, which lands in the repackaged jar's + manifest as `Start-Class`. `jdeploy.jar` in `package.json` points at `target/pholio.jar`; `` is + version-free precisely so that path never needs updating. +* **Runtime.** `jdeploy.javaVersion: "26"` with `jdeploy.javafx: true` provisions an Azul Zulu FX **JRE** per + platform. `windows-arm64` is deliberately absent from `downloadPage.platforms`: Azul publishes no FX build for + it at 26, so listing it would produce an installer that cannot start. +* **Syncing the descriptor.** `mvn -Pjdeploy package` runs `jdeploy-maven-plugin:sync-package-json`, which + copies version, name, description, title, jar path, Java version and the JavaFX flag from the POM into + `package.json`. It works by shelling out to `npm pkg set`, which is why it sits behind a profile — a plain + `mvn package` must not require Node. Every other key in `package.json` is hand-maintained. +* **Releasing.** Push a `v` tag (the leading `v` is stripped to form the app version); the workflow + builds the bundles and attaches them to that release. Pushing a `*-snapshot` branch publishes a rolling + prerelease instead. Branch and tag names must be at most 16 characters of `[A-Za-z0-9._-]` — the jDeploy + action silently skips anything else. +* **Auto-update.** Handled entirely by the native launcher: it reads a `package-info.json` that the action + writes to a `jdeploy` tag in this repository, and picks up a newer release on next start. This requires the + repository to stay public; a private one needs a separate public release repository passed to the action as + `target_repository`. +* **Do not add `documentTypes`, `urlSchemes` or `singleton` without changing the launcher first.** jDeploy + passes opened files and URIs to `main`, and `LaunchOptions` reads any unrecognised argument as a subcommand + and switches to `HEADLESS`. File associations would therefore make a double-clicked photo start Pholio with + no window. + ## Testing * for unit test use AssertJ with SoftAssertion diff --git a/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3669a2e54025d2e17617884584ff663fddcd6239 GIT binary patch literal 18907 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�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 literal 0 HcmV?d00001 diff --git a/package.json b/package.json new file mode 100644 index 0000000..e07f9c3 --- /dev/null +++ b/package.json @@ -0,0 +1,35 @@ +{ + "name": "pholio", + "version": "0.1.0-SNAPSHOT", + "description": "High-volume desktop photo and media library manager", + "author": "Christophe Lallement", + "repository": "https://github.com/Imag-In/pholio", + "bin": { + "pholio": "jdeploy-bundle/jdeploy.js" + }, + "files": [ + "jdeploy-bundle" + ], + "preferGlobal": true, + "jdeploy": { + "jar": "target/pholio.jar", + "javaVersion": "26", + "javafx": true, + "jdk": false, + "title": "Pholio", + "args": [ + "-Djdeploy.file.limit=8192" + ], + "downloadPage": { + "platforms": [ + "mac-arm64", + "mac-x64", + "windows-x64", + "linux-x64", + "linux-arm64", + "debian-x64", + "debian-arm64" + ] + } + } +} diff --git a/pom.xml b/pom.xml index 7ecc6a1..9776e67 100644 --- a/pom.xml +++ b/pom.xml @@ -43,6 +43,16 @@ io.pholio.PholioApplication + + + 1.0.8 + + 6.1.5 @@ -162,10 +172,22 @@ + + pholio org.springframework.boot spring-boot-maven-plugin + ${main.class} @@ -188,4 +210,48 @@ + + + + + jdeploy + + + + ca.weblite + jdeploy-maven-plugin + ${jdeploy-maven-plugin.version} + + ${jdeploy.cli.version} + + + + sync-package-json + + package + + sync-package-json + + + + + + + +