Overview
This project contains 2 Gradle plugin:
- NativeImage allows you to create a native executable file from a Gradle project using GraalVM's
native-image
tool - Jlink allows you to create a native distribution of a Gradle project using GraalVM
jlink
tool
Native Image plugin
Declare the plugin in your build's settings.gradle
like this
pluginManagement {
repositories {
maven {
url = 'https://woggioni.net/mvn/'
}
}
plugins {
id "net.woggioni.gradle.graalvm.native-image" version "2023.10.23"
}
}
Then add it to a project's build.gradle
plugins {
id 'net.woggioni.gradle.graalvm.native-image'
}
configureNativeImage {
args = [ 'your', 'command', 'line', 'arguments']
}
application {
mainClass = 'your.main.Class'
}
Mind that if your project also uses the built-in Gradle application
plugin, that must be applied before the net.woggioni.gradle.graalvm.native-image
.
The plugin adds 2 tasks to your project:
configureNativeImage
of typenet.woggioni.gradle.graalvm.NativeImageConfigurationTask
which launches your application with the native-image-agent to generate the native image configuration files in${project.projectDir}/native-image
nativeImage
of typenet.woggioni.gradle.graalvm.NativeImageTask
that creates the native executable the project's libraries folder (${project.buildDir}/libs
)
Configuration for NativeImageConfigurationTask
mergeConfiguration
This boolean property decides whether to create a new set of configuration files or simply append to the existing ones
Configuration for NativeImageTask
mainClass
The name of the main class the native executable will launch, defaults to the value set in
application {
mainClass = 'my.main.class'
}
mainModule
The name of the main JPMS module the native executable will launch, defaults to the value set in
application {
mainModule = 'my.main.module'
}
Only applicable when useJpms
is true
useJpms
Whether or not enable JPMS in the generated executable
(dependencies that support JPMS will be forwarded to native-image
using the -p
instead of the -cp
option)
useMusl
This boolean property allows to link the generated executable to musl libc,
note that in order to do that a valid (linked to musl-libc) compiler toolchain must be available
on the PATH
, for example if building x86_64 executables on Linux, GraalVM will look for
x86_64-linux-musl-gcc
buildStaticImage
This boolean property allows to create a statically linked executable for maximum portability (a static executable only depends on the kernel and can be moved freely to another different machine with the same operating system and CPU architecture). Beware that this requires the libc to support static linking (most notably, the glibc does not support static linking, the only way to build static executables on linux is to link to a different libc implementation like musl libc).
enableFallback
Whether or not to allow the creation of the fallback image when native-image configuration is missing.
graalVmHome
This points to the installation folder of GraalVM, defaults to the installation directory of the selected Gradle toolchain (if any) or the installation directory of the JVM Gradle is running on otherwise.
Customize native-image command line
A native-image.properties
file can be added to ${project.projectDir}/native-image
to add custom parameters:
-H:Optimize=3 --initialize-at-run-time=your.main.class --gc=G1
Limitations
GraalVM with the native-image plugin is required in order for these plugins to work, this can be achieved either running Gradle under GraalVM directly or using Gradle toolchains support to request GraalVM at the project level
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
vendor = JvmVendorSpec.GRAAL_VM
}
}