Jlink
Creates a Java Runtime image using jlink.
Cross platform Java runtime images may be created however you must ensure that all configured JDKs have the same matching major version. |
You have to install additional JDKs to enable cross-platform images. JReleaser will not install these JDKs for you. You may configure the JDKs Maven Plugin or the JDKs Gradle Plugin to downloads JDKs. |
Legend:
-
required
-
optional
-
may use environment variable
-
accepts Name Templates
#
assemble:
#
jlink:
# Assemblers require a name.
#
app:
# Enables or disables the assembler.
# Supported values are [`NEVER`, `ALWAYS`, `RELEASE`, `SNAPSHOT`].
# Defaults to `NEVER`.
#
active: ALWAYS
# Export the assembled artifacts as a matching named distribution.
# Defaults to `true`.
#
exported: true
# The stereotype of this assembler.
# Supported values are [`NONE`, `CLI`, `DESKTOP`, `WEB`, `MOBILE`].
# Defaults to `${project.stereotype}`.
#
stereotype: CLI
# Additional properties used when evaluating templates.
#
extraProperties:
# Key will be capitalized and prefixed with `jlink`, i.e, `jlinkFoo`.
foo: bar
#
platform:
# Key value pairs.
# Keys match a full platform or an os.name, os.arch.
# Same rules apply as in Platform.
#
replacements:
osx-x86_64: mac
aarch_64: aarch64
x86_64: amd64
linux_musl: alpine
# Name of the executable launcher.
# If left undefined, will use ${assembler.name}.
#
executable: app
# Directory with file templates used to prepare the Jlink assembler.
# Defaults to `src/jreleaser/assemblers/${distribution.name}/jlink`.
# If specified, path must exist.
#
templateDirectory: path/to/jlink/templates
# Name of the generated image.
# If left undefined, will use
# ${project.java.groupId}.${project.java.artifactId}-${project.version}.
# Generated artifacts always have the platform as suffix.
#
imageName: 'app-{{projectVersion}}'
# Name transformation of the generated image.
# Transformed artifacts always have the platform as suffix.
#
imageNameTransform: 'app-{{projectEffectiveVersion}}'
# List of module names.
# Overrides modules found by jdeps.
# Setting any values here automatically disables jdeps.
#
moduleNames:
- java.base
- com.acme.demo
# List of additional module names.
# Additional required modules but not detected by jdeps.
#
additionalModuleNames:
- jdk.crypto.ec
- jdk.localedata
# List of JDKs for generating cross-platform images.
#
targetJdks:
- path: path/to/jdk
platform: osx-x86_64
- path: path/to/jdk
platform: linux-x86_64
# The JDK to use.
# If undefined, will find a matching JDK.
#
jdk:
path: path/to/jdk
platform: linux-x86_64
# Configuration flags for Jdeps
#
jdeps:
# Enables or disables jdeps
# If disabled then [`java.base`] is set as default value for `moduleNames`,
# you may define an explicit value for `moduleNames` or use `additionalModuleNames`.
# Defaults to `true`
#
enabled: true
# Specifies the version when processing multi-release jar files.
# Value should be integer >= 9 or `base`.
# Defaults to empty
#
multiRelease: base
# Ignore missing dependences.
# Defaults to `false`
#
ignoreMissingDeps: true
# Use wildcard expression in classpath.
# Defaults to `true`
#
useWildcardInPath: false
# JARs or classes used to limit the module search
# Must be defined as paths.
# Defaults to empty.
#
targets:
- out/classes/com/acme/Main.class
# A list of build arguments.
# Defaults are shown.
#
args:
- "--no-header-files"
- "--no-man-pages"
- "--compress=2"
- "--strip-debug"
# Copy main and input JARs into archive.
# Defaults to `true`.
#
copyJars: true
# The executable JAR that contains the application.
#
mainJar:
path: path/to/app.jar
# Defines a list of additional JARs as globs.
#
jars:
# The pattern to use.
# May use glob or regex pattern syntax.
#
- pattern: path/to/**/*.jar
#
java:
# Name of main module (if any).
# Define only if the application is modular.
#
mainModule: com.acme.demo
# The application's entry point.
# If left undefined, will use ${project.java.mainClass}.
#
mainClass: com.acme.Main
# Maven coordinates: groupId.
# If left undefined, will use ${project.java.groupId}.
#
groupId: com.acme
# Maven coordinates: artifactId.
# If left undefined, will use ${project.java.artifactId}.
#
artifactId: app
# The minimum Java version required by consumers to run the application.
# If left undefined, will use ${project.java.version}.
#
version: 8
# Identifies the project as being member of a multi-project build.
# If left undefined, will use ${project.java.multiProject}.
#
multiProject: false
# Additional properties used when evaluating templates.
#
extraProperties:
# Key will be capitalized and prefixed with `java`, i.e, `javaFoo`.
foo: bar
# Defines a list of additional files as globs.
# These files will be added to the assembled Zip file.
#
files:
# The pattern to use.
# May use glob or regex pattern syntax.
#
- pattern: path/to/**/*.txt
# Defines a list of additional files as filesets.
# These files will be added to the assembled Zip file.
#
fileSets:
# The input directory to copy files from.
#
- input: path/to/input/directory
# The target path inside the archive.
# If left undefined, defaults to the root of the archive.
#
output: path/to/archive/entry
# Fail if the given `input` does not exist.
# Defaults to `true`.
#
failOnMissingInput: false
# A set of files and directory to include.
#
includes:
- 'name_or_regex'
# A set of files and directory to exclude.
#
excludes:
- 'name_or_regex'
# Additional properties used when evaluating templates.
#
extraProperties:
# Key will be capitalized and prefixed with `artifact`, i.e, `artifactFoo`.
foo: bar
# Assemblers require a name.
#
[assemble.jlink.app]
# Enables or disables the assembler.
# Supported values are [`NEVER`, `ALWAYS`, `RELEASE`, `SNAPSHOT`].
# Defaults to `NEVER`.
#
active = "ALWAYS"
# Export the assembled artifacts as a matching named distribution.
# Defaults to `true`.
#
exported = true
# The stereotype of this assembler.
# Supported values are [`NONE`, `CLI`, `DESKTOP`, `WEB`, `MOBILE`].
# Defaults to `${project.stereotype}`.
#
stereotype = "CLI"
# Additional properties used when evaluating templates.
#
extraProperties.foo = "bar"
# Key will be capitalized and prefixed with `jlink`, i.e, `jlinkFoo`.
# Key value pairs.
# Keys match a full platform or an os.name, os.arch.
# Same rules apply as in Platform.
#
[assemble.jlink.app.platform.replacements]
osx-x86_64 = "mac"
aarch_64 = "aarch64"
x86_64 = "amd64"
linux_musl = "alpine"
# Name of the executable launcher.
# If left undefined, will use ${assembler.name}.
#
executable = "app"
# Directory with file templates used to prepare the Jlink assembler.
# Defaults to `src/jreleaser/assemblers/${distribution.name}/jlink`.
# If specified, path must exist.
#
templateDirectory = "path/to/jlink/templates"
# Name of the generated image.
# If left undefined, will use
# ${project.java.groupId}.${project.java.artifactId}-${project.version}.
# Generated artifacts always have the platform as suffix.
#
imageName = "app-{{projectVersion}}"
# Name transformation of the generated image.
# Transformed artifacts always have the platform as suffix.
#
imageNameTransform = "app-{{projectEffectiveVersion}}"
# List of module names.
# Overrides modules found by jdeps.
# Setting any values here automatically disables jdeps.
#
moduleNames = [
"java.base",
"com.acme.demo"]
# List of additional module names.
# Additional required modules but not detected by jdeps.
#
additionalModuleNames = [
"jdk.crypto.ec",
"jdk.localedata"]
# List of JDKs for generating cross-platform images.
#
targetJdks = [
{ path = "path/to/jdk", platform = "osx-x86_64" },
{ path = "path/to/jdk", platform = "linux-x86_64" }]
# The JDK to use.
# If undefined, will find a matching JDK.
#
jdk = { path = "path/to/jdk", platform = "linux-x86_64" }
# Configuration flags for Jdeps
#
# Enables or disables jdeps
# If disabled then [`java.base`] is set as default value for `moduleNames`,
# you may define an explicit value for `moduleNames` or use `additionalModuleNames`.
# Defaults to `true`
#
jdeps.enabled = true
# Specifies the version when processing multi-release jar files.
# Value should be integer >= 9 or `base`.
# Defaults to empty
#
jdeps.multiRelease = 'base'
# Ignore missing dependences.
# Defaults to `false`
#
jdeps.ignoreMissingDeps = true
# Use wildcard expression in classpath.
# Defaults to `true`
#
jdeps.useWildcardInPath = false
# JARs or classes used to limit the module search
# Must be defined as paths.
# Defaults to empty.
#
jdeps.targets = [ "out/classes/com/acme/Main.class" ]
# A list of build arguments.
# Defaults are shown
#
args = ["--no-header-files",
"--no-man-pages",
"--compress=2",
"--strip-debug"]
# Copy main and input JARs into archive.
# Defaults to `true`.
#
copyJars = true
# The executable JAR that contains the application.
#
mainJar = { path = "path/to/app.jar" }
# Defines a list of additional JARs as globs.
#
[[assemble.jlink.app.jars]]
# The pattern to use.
# May use glob or regex pattern syntax.
#
pattern = "path/to/**/*.jar"
# Name of main module (if any).
# Define only if the application is modular.
#
java.mainModule = "com.acme.demo"
# The application's entry point.
# If left undefined, will use ${project.java.mainClass}.
#
java.mainClass = "com.acme.Main"
# Maven coordinates: groupId.
# If left undefined, will use ${project.java.groupId}.
#
java.groupId = "com.acme"
# Maven coordinates: artifactId.
# If left undefined, will use ${project.java.artifactId}.
#
java.artifactId = "app"
# The minimum Java version required by consumers to run the application.
# If left undefined, will use ${project.java.version}.
#
java.version = "8"
# Identifies the project as being member of a multi-project build.
# If left undefined, will use ${project.java.multiProject}.
#
java.multiProject = false
# Additional properties used when evaluating templates.
#
java.extraProperties.foo = "bar"
# Key will be capitalized and prefixed with `java`, i.e, `javaFoo`.
# Defines a list of additional files as globs.
# These files will be added to the assembled Zip file.
#
[[assemble.jlink.app.files]]
# The pattern to use.
# May use glob or regex pattern syntax.
#
pattern = "path/to/**/*.txt"
# Defines a list of additional files as filesets.
# These files will be added to the assembled Zip file.
#
[[assemble.jlink.app.fileSets]]
# The input directory to copy files from.
#
input = "path/to/input/directory"
# The target path inside the archive.
# If left undefined, defaults to the root of the archive.
#
output = "path/to/archive/entry"
# Fail if the given `input` does not exist.
# Defaults to `true`.
#
failOnMissingInput = false
# A set of files and directory to include.
#
includes = ["name_or_regex"]
# A set of files and directory to exclude.
#
excludes = ["name_or_regex"]
# Additional properties used when evaluating templates.
#
[[assemble.jlink.app.fileSets.extraProperties]]
# Key will be capitalized and prefixed with `artifact`, i.e, `artifactFoo`.
foo: bar
{
//
"assemble": {
//
"jlink": {
// Assemblers require a name.
//
"app": {
// Enables or disables the assembler.
// Supported values are [`NEVER`, `ALWAYS`, `RELEASE`, `SNAPSHOT`].
// Defaults to `NEVER`.
//
"active": "ALWAYS",
// Export the assembled artifacts as a matching named distribution.
// Defaults to `true`.
//
"exported": true,
// The stereotype of this assembler.
// Supported values are [`NONE`, `CLI`, `DESKTOP`, `WEB`, `MOBILE`].
// Defaults to `${project.stereotype}`.
//
"stereotype": "CLI",
// Additional properties used when evaluating templates.
//
"extraProperties": {
// Key will be capitalized and prefixed with `jlink`, i.e, `jlinkFoo`.
"foo": "bar"
},
//
platform: {
// Key value pairs.
// Keys match a full platform or an os.name, os.arch.
// Same rules apply as in Platform.
//
"replacements": {
"osx-x86_64": "mac",
"aarch_64": "aarch64",
"x86_64": "amd64",
"linux_musl": "alpine"
}
},
// Name of the executable launcher.
// If left undefined, will use ${assembler.name}.
//
"executable": "app",
// Directory with file templates used to prepare the Jlink assembler.
// Defaults to `src/jreleaser/assemblers/${distribution.name}/jlink`.
// If specified, path must exist.
//
"templateDirectory": "path/to/jlink/templates",
// Name of the generated image.
// If left undefined, will use
// ${project.java.groupId}.${project.java.artifactId}-${project.version}.
// Generated artifacts always have the platform as suffix.
//
"imageName": "app-{{projectVersion}}",
// Name transformation of the generated image.
// Transformed artifacts always have the platform as suffix.
//
"imageNameTransform": "app-{{projectEffectiveVersion}}",
// List of module names.
// Overrides modules found by jdeps.
// Setting any values here automatically disables jdeps.
//
"moduleNames": [
"java.base",
"com.acme.demo"
],
// List of additional module names.
// Additional required modules but not detected by jdeps.
//
"additionalModuleNames": [
"jdk.crypto.ec",
"jdk.localedata"
],
// List of JDKs for generating cross-platform images.
//
"targetJdks": [
{
"path": "path/to/jdk",
"platform": "osx-x86_64"
},
{
"path": "path/to/jdk",
"platform": "linux-x86_64"
}
],
// The JDK to use.
// If undefined, will find a matching JDK.
//
"jdk": {
"path": "path/to/jdk",
"platform": "linux-x86_64"
},
// Configuration flags for Jdeps
//
"jdeps": {
// Enables or disables jdeps
// If disabled then [`java.base`] is set as default value for `moduleNames`,
// you may define an explicit value for `moduleNames` or use `additionalModuleNames`.
// Defaults to `true`
//
"enabled": true,
// Specifies the version when processing multi-release jar files.
// Value should be integer >= 9 or `base`.
// Defaults to empty
//
"multiRelease": "base",
// Ignore missing dependences.
// Defaults to `false`
//
"ignoreMissingDeps": true,
// Use wildcard expression in classpath.
// Defaults to `true`
//
"useWildcardInPath": false,
// JARs or classes used to limit the module search
// Must be defined as paths.
// Defaults to empty.
//
"targets": [
"out/classes/com/acme/Main.class"
]
},
// A list of build arguments.
// Defaults are shown.
//
"args": [
"--no-header-files",
"--no-man-pages",
"--compress=2",
"--strip-debug"
],
// Copy main and input JARs into archive.
// Defaults to `true`.
//
"copyJars": true,
// The executable JAR that contains the application.
//
"mainJar": {
"path": "path/to/app.jar"
},
// Defines a list of additional JARs as globs.
//
"jars": [
{
// The pattern to use.
// May use glob or regex pattern syntax.
//
"pattern": "path/to/**/*.jar"
}
],
//
"java": {
// Name of main module (if any).
// Define only if the application is modular.
//
"mainModule": "com.acme.demo",
// The application's entry point.
// If left undefined, will use ${project.java.mainClass}.
//
"mainClass": "com.acme.Main",
// Maven coordinates: groupId.
// If left undefined, will use ${project.java.groupId}.
//
"groupId": "com.acme",
// Maven coordinates: artifactId.
// If left undefined, will use ${project.java.artifactId}.
//
"artifactId": "app",
// The minimum Java version required by consumers to run the application.
// If left undefined, will use ${project.java.version}.
//
"version": "8",
// Identifies the project as being member of a multi-project build.
// If left undefined, will use ${project.java.multiProject}.
//
"multiProject": false,
// Additional properties used when evaluating templates.
//
"extraProperties": {
// Key will be capitalized and prefixed with `java`, i.e, `javaFoo`.
"foo": "bar"
}
},
// Defines a list of additional files as globs.
// These files will be added to the assembled Zip file.
//
"files": [
{
// The pattern to use.
// May use glob or regex pattern syntax.
//
"pattern": "path/to/**/*.txt"
}
],
// Defines a list of additional files as filesets.
// These files will be added to the assembled Zip file.
//
"fileSets": [
{
// The input directory to copy files from.
//
"input": "path/to/input/directory",
// The target path inside the archive.
// If left undefined, defaults to the root of the archive.
//
"output": "path/to/archive/entry",
// Fail if the given `input` does not exist.
// Defaults to `true`.
//
"failOnMissingInput": false,
// A set of files and directory to include.
//
"includes": ["name_or_regex"],
// A set of files and directory to exclude.
//
"excludes": ["name_or_regex"],
// Additional properties used when evaluating templates.
//
"extraProperties": {
// Key will be capitalized and prefixed with `artifact`, i.e, `artifactFoo`.
"foo": "bar"
}
}
]
}
}
}
}
<jreleaser>
<!--
-->
<assemble>
<!--
-->
<jlink>
<!--
Assemblers require a name.
-->
<app>
<!--
Enables or disables the distribution.
Supported values are [`NEVER`, `ALWAYS`, `RELEASE`, `SNAPSHOT`].
Defaults to `ALWAYS`.
-->
<active>ALWAYS</active>
<!--
Export the assembled artifacts as a matching named distribution.
Defaults to `true`.
-->
<exported>true</exported>
<!--
The stereotype of this assembler.
Supported values are [`NONE`, `CLI`, `DESKTOP`, `WEB`, `MOBILE`].
Defaults to `${project.stereotype}`.
-->
<stereotype>CLI</stereotype>
<!--
Additional properties used when evaluating templates.
-->
<extraProperties>
<!--
Key will be capitalized and prefixed with `jlink`, i.e, `jlinkFoo`.
-->
<foo>bar</foo>
</extraProperties>
<!--
-->
<platform>
<!--
Key value pairs.
Keys match a full platform or an os.name, os.arch.
Same rules apply as in Platform.
-->
<replacements>
<osx-x86_64>mac</osx-x86_64>
<aarch_64>aarch64</aarch_64>
<x86_64>amd64</x86_64>
<linux_musl>alpine</linux_musl>
</replacements>
</platform>
<!--
Name of the executable launcher.
If left undefined, will use ${distribution.name}.
-->
<executable>app</executable>
<!--
Directory with file templates used to prepare the Jlink assembler.
Defaults to `src/jreleaser/assemblers/${distribution.name}/jlink`.
If specified, path must exist.
-->
<templateDirectory>path/to/brew/templates</templateDirectory>
<!--
Name of the generated image.
If left undefined, will use
${project.java.groupId}.${project.java.artifactId}-${project.version}.
Generated artifacts always have the platform as suffix.
-->
<imageName>app-{{projectVersion}}</imageName>
<!--
Name transformation of the generated image.
Transformed artifacts always have the platform as suffix.
-->
<imageNameTransform>app</imageNameTransform>
<!--
List of module names.
Overrides modules found by jdeps.
Setting any values here automatically disables jdeps.
-->
<moduleNames>
<moduleName>java.base</moduleName>
<moduleName>com.acme.demo</moduleName>
</moduleNames>
<!--
List of additional module names.
Additional required modules but not detected by jdeps.
-->
<additionalModuleNames>
<additionalModuleName>jdk.crypto.ec</additionalModuleName>
<additionalModuleName>jdk.localedata</additionalModuleName>
</additionalModuleNames>
<!--
List of JDKs for generating cross-platform images.
-->
<targetJdks>
<targetJdk>
<path>path/to/jdk</path>
<platform>osx-x86_64</platform>
</targetJdk>
<targetJdk>
<path>path/to/jdk</path>
<platform>linux-x86_64</platform>
</targetJdk>
</targetJdks>
<!--
The JDK to use.
If undefined, will find a matching JDK.
-->
<jdk>
<path>path/to/jdk</path>
<platform>linux-x86_64</platform>
</jdk>
<!--
Configuration flags for Jdeps
-->
<jdeps>
<!--
Enables or disables jdeps
If disabled then [`java.base`] is set as default value for `moduleNames`,
you may define an explicit value for `moduleNames` or use `additionalModuleNames`.
Defaults to `true`
-->
<enabled>true</enabled>
<!--
Specifies the version when processing multi-release jar files.
Value should be integer >= 9 or `base`.
Defaults to empty
-->
<multiRelease>base</multiRelease>
<!--
Ignore missing dependences.
Defaults to `false`
-->
<ignoreMissingDeps>true</ignoreMissingDeps>
<!--
Use wildcard expression in classpath.
Defaults to `true`
-->
<useWildcardInPath>false</useWildcardInPath>
<!--
JARs or classes used to limit the module search
Must be defined as paths.
Defaults to empty.
-->
<targets>
<target>${project.build.directory}/classes/com/acme/Main.class</target>
</targets>
</jdeps>
<!--
A list of build arguments.
Defaults are shown.
-->
<args>
<arg>--no-header-files</arg>
<arg>--no-man-pages</arg>
<arg>--compress=2</arg>
<arg>--strip-debug</arg>
</args>
<!--
Copy main and input JARs into archive.
Defaults to `true`.
-->
<copyJars>true</copyJars>
<!--
The executable JAR that contains the application.
-->
<mainJar>
<path>path/to/app.jar</path>
</mainJar>
<!--
Defines a list of additional JARs as globs.
-->
<jars>
<jar>
<!--
The pattern to use.
May use glob or regex pattern syntax.
-->
<pattern>path/to/**/*.jar</pattern>
</jar>
</jars>
<!--
-->
<java>
<!--
Name of main module (if any).
Define only if the application is modular.
-->
<mainModule>com.acme.demo</mainModule>
<!--
The application's entry point.
If left undefined, will use ${project.java.mainClass}.
-->
<mainClass>com.acme.Main</mainClass>
<!--
Maven coordinates>groupId.
If left undefined, will use ${project.java.groupId}.
-->
<groupId>com.acme</groupId>
<!--
Maven coordinates>artifactId.
If left undefined, will use ${project.java.artifactId}.
-->
<artifactId>app</artifactId>
<!--
The minimum Java version required by consumers to run the application.
If left undefined, will use ${project.java.version}.
-->
<version>8</version>
<!--
Identifies the project as being member of a multi-project build.
If left undefined, will use ${project.java.multiProject}.
-->
<multiProject>false</multiProject>
<!--
Additional properties used when evaluating templates.
-->
<extraProperties>
<!--
Key will be capitalized and prefixed with `java`, i.e, `javaFoo`.
-->
<foo>bar</foo>
</extraProperties>
</java>
<!--
Defines a list of additional files as globs.
These files will be added to the assembled Zip file.
-->
<files>
<file>
<!--
The pattern to use.
May use glob or regex pattern syntax.
-->
<pattern>path/to/**/*.txt</pattern>
</file>
</files>
<!--
Defines a list of additional files as filesets.
These files will be added to the assembled Zip file.
-->
<fileSets>
<fileSet>
<!--
The input directory to copy files from.
-->
<input>path/to/input/directory</input>
<!--
The target path inside the archive.
If left undefined, defaults to the root of the archive.
-->
<output>path/to/archive/entry</output>
<!--
Fail if the given `input` does not exist.
Defaults to `true`.
-->
<failOnMissingInput>false</failOnMissingInput>
<!--
A set of files and directory to include.
-->
<includes>
<include>name_or_regex</include>
</includes>
<!--
A set of files and directory to exclude.
-->
<excludes>
<exclude>name_or_regex</exclude>
</excludes>
<!--
Additional properties used when evaluating templates.
-->
<extraProperties>
<!--
Key will be capitalized and prefixed with `artifact`, i.e, `artifactFoo`.
-->
<foo>bar</foo>
</extraProperties>
</fileSet>
</fileSets>
</app>
</jlink>
</assemble>
</jreleaser>
jreleaser {
//
assemble {
//
jlink {
// Assemblers require a name.
//
app {
// Enables or disables the assembler.
// Supported values are [`NEVER`, `ALWAYS`, `RELEASE`, `SNAPSHOT`].
// Defaults to `NEVER`.
//
active = 'ALWAYS'
// Export the assembled artifacts as a matching named distribution.
// Defaults to `true`.
//
exported = true
// The stereotype of this assembler.
// Supported values are [`NONE`, `CLI`, `DESKTOP`, `WEB`, `MOBILE`].
// Defaults to `${project.stereotype}`.
//
stereotype = 'CLI'
// Additional properties used when evaluating templates.
// Key will be capitalized and prefixed with `jlink`, i.e, `jlinkFoo`.
//
extraProperties.put('foo', 'bar')
//
platform {
// Key value pairs.
// Keys match a full platform or an os.name, os.arch.
// Same rules apply as in Platform.
//
replacements = [
'osx-x86_64': 'mac',
aarch_64: 'aarch64',
x86_64: 'amd64',
linux_musl: 'alpine'
]
}
// Name of the executable launcher.
// If left undefined, will use ${assembler.name}.
//
executable = 'app'
// Directory with file templates used to prepare the Jlink assembler.
// Defaults to `src/jreleaser/assemblers/${distribution.name}/jlink`.
// If specified, path must exist.
//
templateDirectory = 'path/to/jlink/templates'
// Name of the generated image.
// If left undefined, will use
// ${project.java.groupId}.${project.java.artifactId}-${project.version}.
// Generated artifacts always have the platform as suffix.
//
imageName = 'app-{{projectVersion}}'
// Name transformation of the generated image.
// Transformed artifacts always have the platform as suffix.
//
imageNameTransform = 'app-{{projectEffectiveVersion}}'
// List of module names.
// Overrides modules found by jdeps.
// Setting any values here automatically disables jdeps.
//
moduleNames = [
'java.base',
'com.acme.demo'
]
// List of additional module names.
// Additional required modules but not detected by jdeps.
//
additionalModuleNames = [
'jdk.crypto.ec',
'jdk.localedata'
]
// List of JDKs for generating cross-platform images.
//
targetJdk {
path = 'path/to/jdk'
platform = 'osx-x86_64'
}
targetJdk {
path = 'path/to/jdk'
platform = 'linux-x86_64'
}
// The JDK to use.
// If undefined, will find a matching JDK.
//
jdk {
path = 'path/to/jdk'
platform = 'linux-x86_64'
}
// Configuration flags for Jdeps
//
jdeps {
// Enables or disables jdeps
// If disabled then [`java.base`] is set as default value for `moduleNames`,
// you may define an explicit value for `moduleNames` or use `additionalModuleNames`.
// Defaults to `true`
//
enabled = true
// Specifies the version when processing multi-release jar files.
// Value should be integer >= 9 or `base`.
// Defaults to empty
//
multiRelease = 'base'
// Ignore missing dependences.
// Defaults to `false`
//
ignoreMissingDeps = true
// Use wildcard expression in classpath.
// Defaults to `true`
//
useWildcardInPath = false
// JARs or classes used to limit the module search
// Must be defined as paths.
// Defaults to empty.
//
targets = [ 'build/classes/com/acme/Main.class' ]
}
// A list of build arguments.
// Defaults are shown.
//
arg('--install-exit-handlers')
arg('--no-header-files')
arg('--no-man-pages')
arg('--compress=2')
arg('--strip-debug')
// Copy main and input JARs into archive.
// Defaults to `true`.
//
copyJars = true
// The executable JAR that contains the application.
//
mainJar {
path = 'path/to/app.jar'
}
// Defines a list of additional JARs as globs.
//
jars {
// The pattern to use.
// May use glob or regex pattern syntax.
//
pattern = 'path/to/**/*.jar'
}
//
java {
// Name of main module (if any).
// Define only if the application is modular.
//
mainModule = 'com.acme.demo'
// The application's entry point.
// If left undefined, will use ${project.java.mainClass}.
//
mainClass = 'com.acme.Main'
// Maven coordinates = groupId.
// If left undefined, will use ${project.java.groupId}.
//
groupId = 'com.acme'
// Maven coordinates = artifactId.
// If left undefined, will use ${project.java.artifactId}.
//
artifactId = 'app'
// The minimum Java version required by consumers to run the application.
// If left undefined, will use ${project.java.version}.
//
version = '8'
// Identifies the project as being member of a multi-project build.
// If left undefined, will use ${project.java.multiProject}.
//
multiProject = false
// Additional properties used when evaluating templates.
// Key will be capitalized and prefixed with `java`, i.e, `javaFoo`.
//
extraProperties.put('foo', 'bar')
}
// Defines a list of additional files as globs.
// These files will be added to the assembled Zip file.
//
files {
// The pattern to use.
// May use glob or regex pattern syntax.
//
pattern = 'path/to/**/*.txt'
}
// Defines a list of additional files as filesets.
// These files will be added to the assembled Zip file.
//
fileSet {
// The input directory to copy files from.
//
input = 'path/to/input/directory'
// The target path inside the archive.
// If left undefined, defaults to the root of the archive.
//
output = 'path/to/archive/entry'
// Fail if the given `input` does not exist.
// Defaults to `true`.
//
failOnMissingInput = false
// A set of files and directory to include.
//
includes = ['name_or_regex']
// A set of files and directory to exclude.
//
excludes = ['name_or_regex']
// Additional properties used when evaluating templates.
// Key will be capitalized and prefixed with `artifact`, i.e, `artifactFoo`.
//
extraProperties.put('foo', 'bar')
}
}
}
}
}
Archive Format
By default all archive use the Zip format, however you may change this by setting and extra property named archiveFormat
on a given targetJdk
. the Jlink assembler will use it as a hint to select the appropriate archiving format, for example
here’s how the format may be changed for archives that target Linux platforms:
assemble:
jlink:
app:
active: always
targetJdks:
- path: '{{jdkPathPrefix}}/zulu17Osx/{{jdkFilePrefix}}-macosx_x64/zulu-17.jdk/Contents/Home'
platform: 'osx-x86_64'
- path: '{{jdkPathPrefix}}/zulu17Linux/{{jdkFilePrefix}}-linux_x64'
platform: 'linux-x86_64'
extraProperties:
archiveFormat: TGZ
- path: '{{jdkPathPrefix}}/zulu17LinuxMusl/{{jdkFilePrefix}}-linux_musl_x64'
platform: 'linux_musl-x86_64'
extraProperties:
archiveFormat: TGZ
- path: '{{jdkPathPrefix}}/zulu17Windows/{{jdkFilePrefix}}-win_x64'
platform: 'windows-x86_64'
Supported values for the archiveFormat
property are [ZIP
, TAR
, TAR_BZ2
, TAR_GZ
, TAR_XZ
, TBZ2
, TGZ
, TXZ
], with ZIP
being the
default if left unspecified.
JDKs
You may specify a value for both jdk
and targetJdks
, either, or none. The following rules apply when resolving which
JDKs will be used to generate custom Java runtimes:
-
If both
jdk
andtargetJdks
are specified then they must match the same major version. -
If only
jdk
is specified then thetargetJdks
will contain a single entry matching the givenjdk
. -
If no
jdk
is specified then a matching JDK will be searched intargetJdks
. -
If no match is found in rule #3 then the currently executing JDK will be used leading to the same result as rule #2.
Paths for jdk
and targetJdks
must exist in the file system. You may use the
jdks-maven-plugin or
jdks-gradle-plugin to download required JDKs.