Finally, ARM64 Support for Windows and Linux
Painlessly deploy your Java desktop (and CLI) apps as native ARM64 apps
I’m proud to announce the immediate release of jDeploy 5.0. This release includes lots of little improvements, but the highlights include:
ARM64 support for Windows and Linux on both desktop and CLI apps.
Claude Code integration - you can get AI to set up your jDeploy configuration so you don’t have to mess with any build files.
See full release notes.
Why Now?
Users have been asking for ARM support on Windows for a long time. At first I wasn’t sure why people wanted this, since pretty much all the Windows devices I saw advertised used x86_64 processors. I finally “got it” when I installed Windows 11 via Parallels on my Mac, and experienced Windows ARM personally. Still, it didn’t seem urgent, since Windows provides an emulation layer on ARM for running x86_64 binaries.
Over the past year, however, I’ve seen a pronounced shift to using ARM on both Linux and Windows, in the cloud because they’re so darned efficient. I didn’t want jDeploy to be left behind, so I rolled up my sleeves and got serious about ARM.
It was hard
Making things work on ARM was more difficult than I expected it to be. I had assumed that all I would need to do is use a Windows ARM runner, and tweak a few things to use that toolchain, but that was naive. The jDeploy launcher uses a mix of C and Go, and requires both GCC and Go’s compiler. In addition, the jDeploy installer makes use of some C code integrating with the Windows registry. Then there’s the JVM, and also JavaFX. All of this had to be built for ARM64.
The JVM piece wasn’t too difficult. jDeploy was using Azul’s JDKs for most situations, but they don’t offer ARM builds for the JRE - only the JDK - so I was forced to look elsewhere for my Windows ARM builds. Luckily BellSoft provides both JRE and JDK on ARM for Java 11 and higher.
jDeploy still uses Azul for most platforms, and Java versions. It just uses BellSoft’s distributions on Windows and Linux ARM64.
The most difficult piece was just getting the launcher to build on ARM. CGO (Golang’s version of JNI) doesn’t work well with Windows developer tools. It requires GCC, or something compatible. And GCC currently doesn’t support Windows ARM. I made several attempts with different replacement tools. Zig and Clang both offer pretty good compatibility with GCC, but there were enough differences that porting was not trivial.
I had many go-arounds throwing spaghetti at the wall to see what would stick before I finally honed in on a working solution. In the end, I didn’t even use ARM runners to perform the builds. I use x86_64 runners, and perform cross-compilation.
I did all of this so that you don’t have to
The only thing you need to do in order to distribute your Java desktop app for ARM64 on Linux and Windows, is to check a box in the jDeploy UI, and press “Publish”.
Currently, these builds are off by default, in case you don’t actually want them - as I imagine that some apps might include some native code that won’t work on ARM. You can easily “preview” them, however, by visiting the download page for your app, and adding the `preview=1` GET parameter.
E.g. https://www.jdeploy.com/~jdeploy-demo-javafx-ensemble?all=1&preview=1
Wow that’s a lot of links!
You’ll notice, from the screenshot above, that these download pages are getting mighty busy. So many links might be confusing for non-technical users.
For this reason, I improved the download page to detect the current platform, and only show a single download link for that platform.
This is what the download page looks like for me on my Mac
I can see the full grid of download options by pressing “Other platforms…”
The best just keeps getting better! I've been happily using JDeploy for SnapCode and running it on my Surface Pro ARM64 without realizing it was x86. I'll get the new ARM64 version going this week. Thanks!