This entire system is developed to build JLink, JMod and JPackage images.
Using maven you can configure this up quite easily, but you do need to have a multi-module pom structure
<packaging>jlink</packaging>
 <build>
    <plugins>
        <plugin>
            <artifactId>maven-jlink-plugin</artifactId>
            <version>3.0.0-alpha-2-SNAPSHOT</version>
            <extensions>true</extensions>
            <configuration>
                <noHeaderFiles>true</noHeaderFiles>
                <noManPages>true</noManPages>
                <stripDebug>true</stripDebug>
                <verbose>true</verbose>
                <compress>2</compress>
                <launcher>customjrelauncher=my.module.app/MyMainClass</launcher>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>org.ow2.asm</groupId>
                    <artifactId>asm</artifactId>
                    <version>8.0.1</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>
This will create a zip file, and an exploded directory containing your JLink image

Running the built module

Depending on what combination of the above you used (like main class not being present, or skipping jmod entirely), it could be like this You can then use any mechanism of your choice to run your application. If you choose to set it per module being run, edit the generated script (in the example above would be customjrelauncher - and set the variable at the top to the specified value
Run your application with java -m my.module.app