Compressing native executables using UPX
Ultimate Packer for eXecutables (UPX) is a compression tool reducing the size of executables. Quarkus can compress the produced native executable to reduce its size. Such compression is interesting when:
-
building CLI tools, and you want to reduce the disk footprint,
-
building small container images.
Note that UPX compression:
-
increases your build time, mainly if you use high-compression levels
-
increases the startup RSS usage of the application
System vs. Container
The UPX compression requires:
-
the
upx
command to be available in the systemPATH
; -
or to have built the native executable using an in-container build.
If you have the upx
command available on your path, Quarkus uses it.
Otherwise, if you built the native image using an in-container build (using quarkus.native.container-build=true
) and if the builder image provides the upx
command, Quarkus compresses the executable from inside the container.
If you are not in one of these cases, the compression fails.
upx is cross-platform.
|
Configuring the UPX compression
Then, in your application configuration, enable the compression by configuring the compression level you want:
quarkus.native.compression.level=5
If the compression level is not set, the compression is disabled. The compression will happen once the native executable is built and will replace the executable.
Compression level
The compression level goes from 1 to 10:
-
1
: faster compression -
9
: better compression -
10
: best compression (can be slow for big files)
Extra parameters
You can pass extra parameter to upx, such as --brute
or --ultra-brute
using the quarkus.native.compression.additional-args
parameter.
The value is a comma-separated list of arguments:
quarkus.native.compression.level=3
quarkus.native.compression.additional-args=--ultra-brute,-v
The exhaustive list of parameters can be found in the UPX documentation.