VexelRay
Framework docs

Shipping it

Once your application runs, there are two steps to getting it onto someone else’s computer: build a native executable, and publish it with an installer people can run in one line, as the suite’s applications are.

1. The executable

With a GraalVM 25 JDK as JAVA_HOME, through the generated native-build.cmd, which loads the Visual Studio environment the linker and the icon step need:

./native-build.cmd -Pnative-release package -DskipTests

That writes target/my-app.exe, the build you ship: it has no console window, and its automation sockets are off until the launch asks for them, or the title bar’s plug restarts it in debug mode with them on. On Linux, mvn -Pnative-linux package -DskipTests writes target-linux/my-app. Getting started §6 explains the two builds, and the generated README explains what to do when the native executable fails at something the JVM run did not.

Before you publish, run the release executable yourself on a clean folder. A native image only contains what was reachable when it was built, so a code path you only ever tried under mvn exec:exec has not really been tested.

Replace the icon first: src/main/rc/my-app.ico is the framework’s placeholder mark.

2. A one-line installer

vexelray-installer turns the executable into a per-user Windows installer served from a GitHub repository. It is the same tool behind the suite’s install line. Clone it beside the stack and build it:

git clone https://github.com/sibarum/vexelray-installer.git && (cd vexelray-installer && mvn install -DskipTests)

Describe your application in an installer.json at the root of your project:

{
  "id": "my-app",
  "name": "My App",
  "publisher": "you",
  "description": "One line about what it does.",
  "repo": "you/my-app",
  "windows": {
    "binaries": [
      {
        "name": "my-app",
        "source": "target/my-app.exe",
        "icon": "src/main/rc/my-app.ico",
        "addToPath": true,
        "shortcuts": { "desktop": true, "startMenu": true, "label": "My App" }
      }
    ]
  }
}

Generate the installer, and publish the executable as a GitHub release. Publishing needs a token in GITHUB_TOKEN with permission to write to you/my-app:

java -jar ../vexelray-installer/installer-core/target/installer-core-*-cli.jar --config installer.json --version 0.1.0 --out dist --publish

(The jar’s name carries the installer’s own version, so the shell’s * picks whichever -cli.jar your build wrote.) Leave out --publish to see what would be written first.

Commit what it wrote to dist (install.ps1, uninstall.ps1, update.ps1, manifest.json and a README) to the repository named in repo. Then anyone on Windows can install your application with:

irm https://raw.githubusercontent.com/you/my-app/main/install.ps1 | iex

The installer checks every download against its SHA-256, needs no administrator rights, and adds an uninstall entry to Settings. Running the same line again updates the application. File associations, a PATH entry, signing, and jars instead of executables are all options; the installer’s README lists them, and "fileAssociations" in Vex’s installer.json is a worked example.

For Linux, add a linux section beside windows, naming the target-linux/my-app executable. The same run then also writes install.sh, uninstall.sh and update.sh; the installer’s README shows the section.

3. Telling people

Say what it is, what it needs (Windows 10 or 11 or Linux, a GPU with an up-to-date Vulkan driver), and that it is built on a framework before v1. If you would like it listed alongside the suite’s applications, open an issue with a link and a screenshot.