Since Apache Ant 1.10.6
Assembles jmod files into an executable image. Equivalent to the JDK's jlink tool.
Requires Java 9 or later.
| Attribute | Description | Required | 
|---|---|---|
| destDir | Root directory of created image. | Yes | 
| modulepath | Path-like sequence of jmod files to link in order to create image. | One of these is required, unless a nested <modulepath>is present. | 
| modulepathref | Path-like sequence of jmod files to link in order to create image, given as a reference to a path defined elsewhere. | |
| modules | Comma-separated list of modules to place in the linked image. | Yes, unless one or more nested <module>elements
        are present. | 
| observableModules | Comma-separated list of explicit modules that comprise "universe" visible to link tool while linking. | No | 
| launchers | Comma-separated list of commands, each of the form
        name =module or
        name=module/mainclass | No | 
| locales | Comma-separated list of extra locales, or wildcard patterns matching
        multiple locale names, to include.
        Requires jdk.localedatamodule. | No | 
| excludeResources | Comma-separated list of patterns specifying resources to exclude
        from source jmods.  Each is either a
        standard PathMatcher pattern
        or @filename, indicating a text file with
        one resource name per line. | No | 
| excludeFiles | Comma-separated list of patterns specifying files to exclude
        from linked image.  Each is either a
        standard PathMatcher pattern
        or @filename, indicating a text file with
        one file name per line. | No | 
| resourceOrder | Comma-separated list of patterns specifying resource search order.
        Each is either a
        standard PathMatcher pattern
        or @filename, indicating a text file with
        one resource name per line. | No | 
| bindServices | Boolean, whether to include in linked image any service providers found in module path corresponding to service provider interfaces used by explicitly linked modules. | No, default is false | 
| ignoreSigning | Boolean, whether to allow signed jar files. (Note: As of Java 11, this is ignored and is always treated as true.) | No, default is false | 
| includeHeaders | Boolean, whether to include header files in linked image. | No, default is true | 
| includeManPages | Boolean, whether to include man pages in linked image. | No, default is true | 
| includeNativeCommands | Boolean, whether to include native executables in linked image. | No, default is true | 
| debug | Boolean, whether to include debug information. | No, default is true | 
| verboseLevel | If set, the linker will produce verbose output, which will be logged at
        the specified Ant log level ( DEBUG,VERBOSE,INFO,WARN, orERR). | No, default is no verbose output | 
| compress | Compression level of linked image. One of: 
 | No, default is no compression | 
| endianness | Byte order of linked image, must be littleorbig | No, default is native byte order | 
| checkDuplicateLegal | Boolean. When merging legal notices from different modules because they have the same name, verify that their contents are identical. | No, default is false, which means any license files with the same name are assumed to have the same content, and no checking is done. | 
| vmType | Hotspot VM in image. One of: 
 | No, default is all | 
<link> can have the following nested elements:
Path-like structure pointing to jmod files to link into image.
Names a single module to be placed in the linked image. This may be specified multiple times.
Attributes:
| Attribute | Description | Required | 
|---|---|---|
| name | Name of module to add. | Yes | 
Names a module visible to the linking process, instead of every module in the module path being considered. This may be specified multiple times.
Attributes:
| Attribute | Description | Required | 
|---|---|---|
| name | Name of module to add to list of observable modules. | Yes | 
Specifies an executable file which will be added to the linked image, which executes a particular module's main class. Attributes:
| Attribute | Description | Required | 
|---|---|---|
| name | Name of launcher. This typically is used for the name of the executable file. | Yes | 
| module | Name of module to execute. | Yes | 
| mainClass | Name of entry point class in module to execute. | Required unless module has its own main class defined. | 
Specifies locales to include in linked image.  May be specified multiple
times.  Requires jdk.localedata module.  Attributes:
| Attribute | Description | Required | 
|---|---|---|
| name | Name of locale, or wildcard pattern with that matches multiple locale names. | Yes | 
Explicit resource search order in linked image. May be specified multiple times. Attributes:
| Attribute | Description | Required | 
|---|---|---|
| pattern | A standard PathMatcher pattern for matching resources | Exactly one of these | 
| listFile | Text file containing list of resource names (not patterns), one per line | 
If the resourceOrder attribute is also present on the task, its
patterns are treated as if they occur before patterns in nested
<resourceOrder> elements.
Excludes files from linked image tree. May be specified multiple times. Attributes:
| Attribute | Description | Required | 
|---|---|---|
| pattern | A standard PathMatcher pattern for matching resources | Exactly one of these | 
| listFile | Text file containing list of resource names (not patterns), one per line | 
Excludes files from linked image. May be specified multiple times. Attributes:
| Attribute | Description | Required | 
|---|---|---|
| pattern | A standard PathMatcher pattern for matching files | Exactly one of these | 
| listFile | Text file containing list of file names (not patterns), one per line | 
Describes how image should be compressed. Attributes:
| Attribute | Description | Required | 
|---|---|---|
| level | Compression level of linked image. One of: 
 | Yes | 
| files | Comma-separated list of patterns matching files to compress.
        Each pattern either a
        standard PathMatcher pattern
        or @filename, indicating a text file with
        one file name per line. | No | 
<compress> can also have any number of nested
<files> elements, with these attributes:
| Attribute | Description | Required | 
|---|---|---|
| pattern | A standard PathMatcher pattern for matching files | Exactly one of these | 
| listFile | Text file containing list of file names (not patterns), one per line | 
Replaces, augments, or trims the image's release info properties. Can be specified multiple times. Attributes:
| Attribute | Description | Required | 
|---|---|---|
| file | Java properties file containing new release info properties that will entirely replace the current ones. | No | 
| delete | Comma-separated property keys to remove from application's release info | No | 
<releaseInfo> can also have any number of these nested elements:
Specifies additional release info properties. Attributes:
| Attribute | Description | Required | 
|---|---|---|
| key | Key of single property to add. | Yes, unless fileis specified | 
| value | Value of single property to add. | |
| file | Java property file containing any number of properties to add. | Yes, unless keyandvalueare specified | 
| charset | Character set of property file. | No, default is ISO_8859_1, in accordance with
        java.util.Properties class. | 
Property keys to remove from applicaiton's release info. Attributes:
| Attribute | Description | Required | 
|---|---|---|
| key | Key of property to remove. | Yes | 
<jmod destfile="MyApp.jmod" classpath="build/myapp.jar"/>
<link destDir="build/image" modulepath="MyApp.jmod"
      modules="com.example.myapp"/>
This will cause a bin/MyEditor script to appear in the image:
<jmod destfile="MyApp.jmod" classpath="build/myapp.jar"/>
<link destDir="build/image" modulepath="MyApp.jmod"
      modules="com.example.myapp"
      launchers="MyEditor=com.example.myapp/com.example.myapp.editors.EditorMain"/>
Same thing, using a nested launcher element:
<jmod destfile="MyApp.jmod" classpath="build/myapp.jar"/>
<link destDir="build/image" modulepath="MyApp.jmod"
      modules="com.example.myapp">
    <launcher name="MyEditor" module="com.example.myapp"
              mainClass="com.example.myapp.editors.EditorMain"/>
</link>
Include just the locales needed by the application from the jdk.localedata module:
<jmod destfile="MyApp.jmod" classpath="build/myapp.jar"/>
<link destDir="build/image" modulepath="MyApp.jmod"
      modules="com.example.myapp,jdk.localedata"
      locales="zh,jp-*"/>
Compress entire image:
<jmod destfile="MyApp.jmod" classpath="build/myapp.jar"/>
<link destDir="build/image" modulepath="MyApp.jmod"
      modules="com.example.myapp,jdk.localedata"
      compress="zip"/>
Compress only some files in the image:
<jmod destfile="MyApp.jmod" classpath="build/myapp.jar"/>
<link destDir="build/image" modulepath="MyApp.jmod"
      modules="com.example.myapp,jdk.localedata">
    <compress level="zip" files=".*\.xml"/>
</link>
To create an image for a different platform:
jmod describe "$FOREIGN_JDK_HOME"/jmods/java.base.jmod | grep '^platform'
<jmod destfile="MyApp.jmod" classpath="build/myapp.jar" platform="windows-amd64"/>
<link destDir="build/image"
      modulepath="MyApp.jmod;${foreign-jdk-home}/jmods"
      modules="com.example.myapp"/>