diff --git a/pom.xml b/pom.xml
index 56c7cf3..09d631e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,5 +1,4 @@
-<?xml version='1.0' encoding='UTF-8'?>
-
+<?xml version="1.0" encoding="UTF-8"?>
 <!--
   Licensed to the Apache Software Foundation (ASF) under one
   or more contributor license agreements. See the NOTICE file
@@ -18,14 +17,13 @@
   specific language governing permissions and limitations
   under the License.
 -->
-
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
 
   <parent>
     <groupId>org.apache.maven.plugins</groupId>
     <artifactId>maven-plugins</artifactId>
-    <version>34</version>
+    <version>39</version>
     <relativePath />
   </parent>
 
@@ -45,8 +43,8 @@
   <scm>
     <connection>scm:git:https://gitbox.apache.org/repos/asf/maven-jlink-plugin.git</connection>
     <developerConnection>scm:git:https://gitbox.apache.org/repos/asf/maven-jlink-plugin.git</developerConnection>
-    <url>https://github.com/apache/maven-jlink-plugin/tree/${project.scm.tag}</url>
     <tag>HEAD</tag>
+    <url>https://github.com/apache/maven-jlink-plugin/tree/${project.scm.tag}</url>
   </scm>
 
   <issueManagement>
@@ -65,14 +63,31 @@
   </distributionManagement>
 
   <properties>
-    <!-- required due to conflict with asm:asm:3.3.1 in Maven 3.1.0, see MNG-5499. -->
-    <mavenVersion>3.1.1</mavenVersion>
+    <mavenVersion>3.6.3</mavenVersion>
     <maven.compiler.release>11</maven.compiler.release>
     <!-- needed for enforce-bytecode-version in maven-parent-pom. -->
     <maven.compiler.target>${maven.compiler.release}</maven.compiler.target>
     <project.build.outputTimestamp>2020-12-21T12:52:28Z</project.build.outputTimestamp>
   </properties>
 
+  <dependencyManagement>
+    <dependencies>
+      <dependency>
+        <groupId>org.codehaus.plexus</groupId>
+        <artifactId>plexus-utils</artifactId>
+        <version>3.5.1</version>
+      </dependency>
+
+      <dependency>
+        <groupId>org.junit</groupId>
+        <artifactId>junit-bom</artifactId>
+        <version>5.9.2</version>
+        <type>pom</type>
+        <scope>import</scope>
+      </dependency>
+    </dependencies>
+  </dependencyManagement>
+
   <dependencies>
     <dependency>
       <groupId>org.apache.maven.plugin-tools</groupId>
@@ -93,9 +108,9 @@
       <scope>provided</scope>
     </dependency>
     <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-archiver</artifactId>
-      <version>3.5.1</version>
+      <groupId>org.apache.maven.shared</groupId>
+      <artifactId>maven-shared-utils</artifactId>
+      <version>3.4.2</version>
     </dependency>
     <dependency>
       <groupId>org.codehaus.plexus</groupId>
@@ -136,25 +151,13 @@
     </dependency>
   </dependencies>
 
-  <dependencyManagement>
-    <dependencies>
-      <dependency>
-        <groupId>org.codehaus.plexus</groupId>
-        <artifactId>plexus-utils</artifactId>
-        <version>3.5.1</version>
-      </dependency>
-
-      <dependency>
-        <groupId>org.junit</groupId>
-        <artifactId>junit-bom</artifactId>
-        <version>5.9.2</version>
-        <type>pom</type>
-        <scope>import</scope>
-      </dependency>
-    </dependencies>
-  </dependencyManagement>
-
   <build>
+    <resources>
+      <resource>
+        <filtering>true</filtering>
+        <directory>src/main/filtered-resources</directory>
+      </resource>
+    </resources>
     <pluginManagement>
       <plugins>
         <!-- remove with next parent upgrade -->
@@ -186,12 +189,6 @@
         </plugin>
       </plugins>
     </pluginManagement>
-    <resources>
-      <resource>
-        <directory>src/main/filtered-resources</directory>
-        <filtering>true</filtering>
-      </resource>
-    </resources>
   </build>
 
   <reporting>
@@ -215,14 +212,6 @@
             <groupId>org.codehaus.mojo</groupId>
             <artifactId>mrm-maven-plugin</artifactId>
             <version>1.5.0</version>
-            <executions>
-              <execution>
-                <goals>
-                  <goal>start</goal>
-                  <goal>stop</goal>
-                </goals>
-              </execution>
-            </executions>
             <configuration>
               <propertyName>mrm.repository.url</propertyName>
               <repositories>
@@ -232,11 +221,19 @@
                 <proxyRepo />
               </repositories>
             </configuration>
+            <executions>
+              <execution>
+                <goals>
+                  <goal>start</goal>
+                  <goal>stop</goal>
+                </goals>
+              </execution>
+            </executions>
           </plugin>
           <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-invoker-plugin</artifactId>
-			<version>3.5.1</version>
+            <version>3.5.1</version>
             <configuration>
               <localRepositoryPath>${project.build.directory}/local-repo</localRepositoryPath>
               <environmentVariables>
@@ -264,7 +261,7 @@
               <filterProperties>
                 <mrm.repository.url>${mrm.repository.url}</mrm.repository.url>
               </filterProperties>
-			  <streamLogsOnFailures>true</streamLogsOnFailures>
+              <streamLogsOnFailures>true</streamLogsOnFailures>
               <goals>
                 <goal>clean</goal>
                 <goal>package</goal>
diff --git a/src/main/java/org/apache/maven/plugins/jlink/AbstractJLinkExecutor.java b/src/main/java/org/apache/maven/plugins/jlink/AbstractJLinkExecutor.java
index 3213736..91ec4b4 100644
--- a/src/main/java/org/apache/maven/plugins/jlink/AbstractJLinkExecutor.java
+++ b/src/main/java/org/apache/maven/plugins/jlink/AbstractJLinkExecutor.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.apache.maven.plugins.jlink;
 
 /*
@@ -19,17 +37,16 @@
  * under the License.
  */
 
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.logging.Log;
-
 import java.io.File;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 import java.util.Optional;
 
-abstract class AbstractJLinkExecutor
-{
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.logging.Log;
+
+abstract class AbstractJLinkExecutor {
     protected static final String JMODS = "jmods";
 
     private final Log log;
@@ -37,27 +54,23 @@
     private final List<String> modulesToAdd = new ArrayList<>();
     private final List<String> modulePaths = new ArrayList<>();
 
-    AbstractJLinkExecutor( Log log )
-    {
+    AbstractJLinkExecutor(Log log) {
         this.log = log;
     }
 
-    protected Log getLog()
-    {
+    protected Log getLog() {
         return this.log;
     }
 
-    public abstract Optional<File> getJmodsFolder( /* nullable */ File sourceJdkModules );
+    public abstract Optional<File> getJmodsFolder(/* nullable */ File sourceJdkModules);
 
-    public abstract int executeJlink( List<String> jlinkArgs ) throws MojoExecutionException;
+    public abstract int executeJlink(List<String> jlinkArgs) throws MojoExecutionException;
 
-    public void addAllModules( Collection<String> modulesToAdd )
-    {
-        this.modulesToAdd.addAll( modulesToAdd );
+    public void addAllModules(Collection<String> modulesToAdd) {
+        this.modulesToAdd.addAll(modulesToAdd);
     }
 
-    public void addAllModulePaths( Collection<String> pathsOfModules )
-    {
-        this.modulePaths.addAll( pathsOfModules );
+    public void addAllModulePaths(Collection<String> pathsOfModules) {
+        this.modulePaths.addAll(pathsOfModules);
     }
 }
diff --git a/src/main/java/org/apache/maven/plugins/jlink/AbstractJLinkMojo.java b/src/main/java/org/apache/maven/plugins/jlink/AbstractJLinkMojo.java
index 1ed65a0..c99ac2f 100644
--- a/src/main/java/org/apache/maven/plugins/jlink/AbstractJLinkMojo.java
+++ b/src/main/java/org/apache/maven/plugins/jlink/AbstractJLinkMojo.java
@@ -1,221 +1,213 @@
-package org.apache.maven.plugins.jlink;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import java.io.File;
-import java.lang.reflect.Method;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-
-import org.apache.maven.execution.MavenSession;
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugins.annotations.Component;
-import org.apache.maven.plugins.annotations.Parameter;
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.toolchain.Toolchain;
-import org.apache.maven.toolchain.ToolchainManager;
-
-/**
- * @author Karl Heinz Marbaise <a href="mailto:khmarbaise@apache.org">khmarbaise@apache.org</a>
- */
-public abstract class AbstractJLinkMojo
-    extends AbstractMojo
-{
-    /**
-     * <p>
-     * Specify the requirements for this jdk toolchain. This overrules the toolchain selected by the
-     * maven-toolchain-plugin.
-     * </p>
-     * <strong>note:</strong> requires at least Maven 3.3.1
-     */
-    @Parameter
-    private Map<String, String> jdkToolchain;
-
-    @Parameter( defaultValue = "${project}", readonly = true, required = true )
-    private MavenProject project;
-
-    @Parameter( defaultValue = "${session}", readonly = true, required = true )
-    private MavenSession session;
-
-    @Component
-    private ToolchainManager toolchainManager;
-
-    /**
-     * Overload this to produce a zip with another classifier, for example a jlink-zip.
-     * @return get the classifier.
-     */
-    protected abstract String getClassifier();
-
-    protected JLinkExecutor getJlinkExecutor()
-    {
-        return new JLinkExecutor( getToolchain().orElse( null ), getLog() );
-    }
-
-    protected Optional<Toolchain> getToolchain()
-    {
-        Toolchain tc = null;
-
-        if ( jdkToolchain != null )
-        {
-            // Maven 3.3.1 has plugin execution scoped Toolchain Support
-            try
-            {
-                Method getToolchainsMethod = toolchainManager.getClass().getMethod( "getToolchains",
-                        MavenSession.class, String.class, Map.class );
-
-                @SuppressWarnings( "unchecked" )
-                List<Toolchain> tcs = (List<Toolchain>) getToolchainsMethod.invoke( toolchainManager, getSession(),
-                        "jdk", jdkToolchain );
-
-                if ( tcs != null && tcs.size() > 0 )
-                {
-                    tc = tcs.get( 0 );
-                }
-            }
-            catch ( ReflectiveOperationException | SecurityException | IllegalArgumentException e )
-            {
-                // ignore
-            }
-        }
-
-        if ( tc == null )
-        {
-            // TODO: Check if we should make the type configurable?
-            tc = toolchainManager.getToolchainFromBuildContext( "jdk", getSession() );
-        }
-
-        return Optional.ofNullable( tc );
-    }
-
-    protected MavenProject getProject()
-    {
-        return project;
-    }
-
-    protected MavenSession getSession()
-    {
-        return session;
-    }
-
-    /**
-     * Returns the archive file to generate, based on an optional classifier.
-     *
-     * @param basedir the output directory
-     * @param finalName the name of the ear file
-     * @param classifier an optional classifier
-     * @param archiveExt The extension of the file.
-     * @return the file to generate
-     */
-    protected File getArchiveFile( File basedir, String finalName, String classifier, String archiveExt )
-    {
-        if ( basedir == null )
-        {
-            throw new IllegalArgumentException( "basedir is not allowed to be null" );
-        }
-        if ( finalName == null )
-        {
-            throw new IllegalArgumentException( "finalName is not allowed to be null" );
-        }
-        if ( archiveExt == null )
-        {
-            throw new IllegalArgumentException( "archiveExt is not allowed to be null" );
-        }
-
-        if ( finalName.isEmpty() )
-        {
-            throw new IllegalArgumentException( "finalName is not allowed to be empty." );
-        }
-        if ( archiveExt.isEmpty() )
-        {
-            throw new IllegalArgumentException( "archiveExt is not allowed to be empty." );
-        }
-
-        StringBuilder fileName = new StringBuilder( finalName );
-
-        if ( hasClassifier( classifier ) )
-        {
-            fileName.append( "-" ).append( classifier );
-        }
-
-        fileName.append( '.' );
-        fileName.append( archiveExt );
-
-        return new File( basedir, fileName.toString() );
-    }
-
-    protected boolean hasClassifier( String classifier )
-    {
-        boolean result = false;
-        if ( classifier != null && !classifier.isEmpty() )
-        {
-            result = true;
-        }
-
-        return result;
-    }
-
-    /**
-     * This will convert a module path separated by either {@code :} or {@code ;} into a string which uses the platform
-     * depend path separator uniformly.
-     * 
-     * @param pluginModulePath The module path.
-     * @return The platform separated module path.
-     */
-    protected StringBuilder convertSeparatedModulePathToPlatformSeparatedModulePath( String pluginModulePath )
-    {
-        StringBuilder sb = new StringBuilder();
-        // Split the module path by either ":" or ";" linux/windows path separator and
-        // convert uniformly to the platform used separator.
-        String[] splitModule = pluginModulePath.split( "[;:]" );
-        for ( String module : splitModule )
-        {
-            if ( sb.length() > 0 )
-            {
-                sb.append( File.pathSeparatorChar );
-            }
-            sb.append( module );
-        }
-        return sb;
-    }
-
-    /**
-     * Convert a list into a string which is separated by platform depend path separator.
-     * 
-     * @param modulePaths The list of elements.
-     * @return The string which contains the elements separated by {@link File#pathSeparatorChar}.
-     */
-    protected String getPlatformDependSeparateList( Collection<String> modulePaths )
-    {
-        return String.join( Character.toString( File.pathSeparatorChar ), modulePaths );
-    }
-
-    /**
-     * Convert a list into a 
-     * @param modules The list of modules.
-     * @return The string with the module list which is separated by {@code ,}.
-     */
-    protected String getCommaSeparatedList( Collection<String> modules )
-    {
-        return String.join( ",", modules );
-    }
-
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.maven.plugins.jlink;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.io.File;
+import java.lang.reflect.Method;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+import org.apache.maven.execution.MavenSession;
+import org.apache.maven.plugin.AbstractMojo;
+import org.apache.maven.plugins.annotations.Component;
+import org.apache.maven.plugins.annotations.Parameter;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.toolchain.Toolchain;
+import org.apache.maven.toolchain.ToolchainManager;
+
+/**
+ * @author Karl Heinz Marbaise <a href="mailto:khmarbaise@apache.org">khmarbaise@apache.org</a>
+ */
+public abstract class AbstractJLinkMojo extends AbstractMojo {
+    /**
+     * <p>
+     * Specify the requirements for this jdk toolchain. This overrules the toolchain selected by the
+     * maven-toolchain-plugin.
+     * </p>
+     * <strong>note:</strong> requires at least Maven 3.3.1
+     */
+    @Parameter
+    private Map<String, String> jdkToolchain;
+
+    @Parameter(defaultValue = "${project}", readonly = true, required = true)
+    private MavenProject project;
+
+    @Parameter(defaultValue = "${session}", readonly = true, required = true)
+    private MavenSession session;
+
+    @Component
+    private ToolchainManager toolchainManager;
+
+    /**
+     * Overload this to produce a zip with another classifier, for example a jlink-zip.
+     * @return get the classifier.
+     */
+    protected abstract String getClassifier();
+
+    protected JLinkExecutor getJlinkExecutor() {
+        return new JLinkExecutor(getToolchain().orElse(null), getLog());
+    }
+
+    protected Optional<Toolchain> getToolchain() {
+        Toolchain tc = null;
+
+        if (jdkToolchain != null) {
+            // Maven 3.3.1 has plugin execution scoped Toolchain Support
+            try {
+                Method getToolchainsMethod = toolchainManager
+                        .getClass()
+                        .getMethod("getToolchains", MavenSession.class, String.class, Map.class);
+
+                @SuppressWarnings("unchecked")
+                List<Toolchain> tcs = (List<Toolchain>)
+                        getToolchainsMethod.invoke(toolchainManager, getSession(), "jdk", jdkToolchain);
+
+                if (tcs != null && tcs.size() > 0) {
+                    tc = tcs.get(0);
+                }
+            } catch (ReflectiveOperationException | SecurityException | IllegalArgumentException e) {
+                // ignore
+            }
+        }
+
+        if (tc == null) {
+            // TODO: Check if we should make the type configurable?
+            tc = toolchainManager.getToolchainFromBuildContext("jdk", getSession());
+        }
+
+        return Optional.ofNullable(tc);
+    }
+
+    protected MavenProject getProject() {
+        return project;
+    }
+
+    protected MavenSession getSession() {
+        return session;
+    }
+
+    /**
+     * Returns the archive file to generate, based on an optional classifier.
+     *
+     * @param basedir the output directory
+     * @param finalName the name of the ear file
+     * @param classifier an optional classifier
+     * @param archiveExt The extension of the file.
+     * @return the file to generate
+     */
+    protected File getArchiveFile(File basedir, String finalName, String classifier, String archiveExt) {
+        if (basedir == null) {
+            throw new IllegalArgumentException("basedir is not allowed to be null");
+        }
+        if (finalName == null) {
+            throw new IllegalArgumentException("finalName is not allowed to be null");
+        }
+        if (archiveExt == null) {
+            throw new IllegalArgumentException("archiveExt is not allowed to be null");
+        }
+
+        if (finalName.isEmpty()) {
+            throw new IllegalArgumentException("finalName is not allowed to be empty.");
+        }
+        if (archiveExt.isEmpty()) {
+            throw new IllegalArgumentException("archiveExt is not allowed to be empty.");
+        }
+
+        StringBuilder fileName = new StringBuilder(finalName);
+
+        if (hasClassifier(classifier)) {
+            fileName.append("-").append(classifier);
+        }
+
+        fileName.append('.');
+        fileName.append(archiveExt);
+
+        return new File(basedir, fileName.toString());
+    }
+
+    protected boolean hasClassifier(String classifier) {
+        boolean result = false;
+        if (classifier != null && !classifier.isEmpty()) {
+            result = true;
+        }
+
+        return result;
+    }
+
+    /**
+     * This will convert a module path separated by either {@code :} or {@code ;} into a string which uses the platform
+     * depend path separator uniformly.
+     *
+     * @param pluginModulePath The module path.
+     * @return The platform separated module path.
+     */
+    protected StringBuilder convertSeparatedModulePathToPlatformSeparatedModulePath(String pluginModulePath) {
+        StringBuilder sb = new StringBuilder();
+        // Split the module path by either ":" or ";" linux/windows path separator and
+        // convert uniformly to the platform used separator.
+        String[] splitModule = pluginModulePath.split("[;:]");
+        for (String module : splitModule) {
+            if (sb.length() > 0) {
+                sb.append(File.pathSeparatorChar);
+            }
+            sb.append(module);
+        }
+        return sb;
+    }
+
+    /**
+     * Convert a list into a string which is separated by platform depend path separator.
+     *
+     * @param modulePaths The list of elements.
+     * @return The string which contains the elements separated by {@link File#pathSeparatorChar}.
+     */
+    protected String getPlatformDependSeparateList(Collection<String> modulePaths) {
+        return String.join(Character.toString(File.pathSeparatorChar), modulePaths);
+    }
+
+    /**
+     * Convert a list into a
+     * @param modules The list of modules.
+     * @return The string with the module list which is separated by {@code ,}.
+     */
+    protected String getCommaSeparatedList(Collection<String> modules) {
+        return String.join(",", modules);
+    }
+}
diff --git a/src/main/java/org/apache/maven/plugins/jlink/AbstractJLinkToolchainExecutor.java b/src/main/java/org/apache/maven/plugins/jlink/AbstractJLinkToolchainExecutor.java
index f08406e..086492c 100644
--- a/src/main/java/org/apache/maven/plugins/jlink/AbstractJLinkToolchainExecutor.java
+++ b/src/main/java/org/apache/maven/plugins/jlink/AbstractJLinkToolchainExecutor.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.apache.maven.plugins.jlink;
 
 /*
@@ -19,6 +37,11 @@
  * under the License.
  */
 
+import java.io.File;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.Optional;
+
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.SystemUtils;
 import org.apache.maven.plugin.MojoExecutionException;
@@ -28,24 +51,16 @@
 import org.apache.maven.shared.utils.cli.Commandline;
 import org.apache.maven.toolchain.Toolchain;
 
-import java.io.File;
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.Optional;
-
-abstract class AbstractJLinkToolchainExecutor extends AbstractJLinkExecutor
-{
+abstract class AbstractJLinkToolchainExecutor extends AbstractJLinkExecutor {
     private final Toolchain toolchain;
 
-    AbstractJLinkToolchainExecutor( Toolchain toolchain, Log log )
-    {
-        super( log );
+    AbstractJLinkToolchainExecutor(Toolchain toolchain, Log log) {
+        super(log);
         this.toolchain = toolchain;
     }
 
-    protected Optional<Toolchain> getToolchain()
-    {
-        return Optional.ofNullable( this.toolchain );
+    protected Optional<Toolchain> getToolchain() {
+        return Optional.ofNullable(this.toolchain);
     }
 
     /**
@@ -54,151 +69,128 @@
      * @return the exit code ({@code 0} on success).
      */
     @Override
-    public int executeJlink( List<String> jlinkArgs ) throws MojoExecutionException
-    {
+    public int executeJlink(List<String> jlinkArgs) throws MojoExecutionException {
         File jlinkExecutable = getJlinkExecutable();
-        getLog().info( "Toolchain in maven-jlink-plugin: jlink [ " + jlinkExecutable + " ]" );
+        getLog().info("Toolchain in maven-jlink-plugin: jlink [ " + jlinkExecutable + " ]");
 
-        Commandline cmd = createJLinkCommandLine( jlinkArgs );
-        cmd.setExecutable( jlinkExecutable.getAbsolutePath() );
+        Commandline cmd = createJLinkCommandLine(jlinkArgs);
+        cmd.setExecutable(jlinkExecutable.getAbsolutePath());
 
-        return executeCommand( cmd );
+        return executeCommand(cmd);
     }
 
-    private File getJlinkExecutable()
-    {
-        return new File( getJLinkExecutable() );
+    private File getJlinkExecutable() {
+        return new File(getJLinkExecutable());
     }
 
     @Override
-    public Optional<File> getJmodsFolder( /* nullable */ File sourceJdkModules )
-    {
+    public Optional<File> getJmodsFolder(/* nullable */ File sourceJdkModules) {
         // Really Hacky...do we have a better solution to find the jmods directory of the JDK?
         File jLinkParent = getJlinkExecutable().getParentFile().getParentFile();
         File jmodsFolder;
-        if ( sourceJdkModules != null && sourceJdkModules.isDirectory() )
-        {
-            jmodsFolder = new File( sourceJdkModules, JMODS );
-        }
-        else
-        {
-            jmodsFolder = new File( jLinkParent, JMODS );
+        if (sourceJdkModules != null && sourceJdkModules.isDirectory()) {
+            jmodsFolder = new File(sourceJdkModules, JMODS);
+        } else {
+            jmodsFolder = new File(jLinkParent, JMODS);
         }
 
-        getLog().debug( " Parent: " + jLinkParent.getAbsolutePath() );
-        getLog().debug( " jmodsFolder: " + jmodsFolder.getAbsolutePath() );
+        getLog().debug(" Parent: " + jLinkParent.getAbsolutePath());
+        getLog().debug(" jmodsFolder: " + jmodsFolder.getAbsolutePath());
 
-        return Optional.of( jmodsFolder );
+        return Optional.of(jmodsFolder);
     }
 
-    private Commandline createJLinkCommandLine( List<String> jlinkArgs )
-    {
+    private Commandline createJLinkCommandLine(List<String> jlinkArgs) {
         Commandline cmd = new Commandline();
-        jlinkArgs.forEach( arg -> cmd.createArg().setValue( arg ) );
+        jlinkArgs.forEach(arg -> cmd.createArg().setValue(arg));
 
         return cmd;
     }
 
-    private String getJLinkExecutable()
-    {
+    private String getJLinkExecutable() {
         Optional<Toolchain> toolchain = getToolchain();
 
-        if ( !toolchain.isPresent() )
-        {
-            getLog().error( "Either JDK9+ or a toolchain "
-                    + "pointing to a JDK9+ containing a jlink binary is required." );
-            getLog().info( "See https://maven.apache.org/guides/mini/guide-using-toolchains.html "
-                    + "for mor information." );
-            throw new IllegalStateException( "Running on JDK8 and no toolchain found." );
+        if (!toolchain.isPresent()) {
+            getLog().error("Either JDK9+ or a toolchain "
+                    + "pointing to a JDK9+ containing a jlink binary is required.");
+            getLog().info("See https://maven.apache.org/guides/mini/guide-using-toolchains.html "
+                    + "for mor information.");
+            throw new IllegalStateException("Running on JDK8 and no toolchain found.");
         }
 
-        String jLinkExecutable = toolchain.orElseThrow( NoSuchElementException::new ).findTool( "jlink" );
+        String jLinkExecutable =
+                toolchain.orElseThrow(NoSuchElementException::new).findTool("jlink");
 
-        if ( jLinkExecutable.isEmpty() )
-        {
-            throw new IllegalStateException( "The jlink executable '"
-                    + jLinkExecutable + "' doesn't exist or is not a file." );
+        if (jLinkExecutable.isEmpty()) {
+            throw new IllegalStateException(
+                    "The jlink executable '" + jLinkExecutable + "' doesn't exist or is not a file.");
         }
 
         // TODO: Check if there exist a more elegant way?
-        String jLinkCommand = "jlink" + ( SystemUtils.IS_OS_WINDOWS ? ".exe" : "" );
+        String jLinkCommand = "jlink" + (SystemUtils.IS_OS_WINDOWS ? ".exe" : "");
 
-        File jLinkExe = new File( jLinkExecutable );
+        File jLinkExe = new File(jLinkExecutable);
 
-        if ( jLinkExe.isDirectory() )
-        {
-            jLinkExe = new File( jLinkExe, jLinkCommand );
+        if (jLinkExe.isDirectory()) {
+            jLinkExe = new File(jLinkExe, jLinkCommand);
         }
 
-        if ( SystemUtils.IS_OS_WINDOWS && jLinkExe.getName().indexOf( '.' ) < 0 )
-        {
-            jLinkExe = new File( jLinkExe.getPath() + ".exe" );
+        if (SystemUtils.IS_OS_WINDOWS && jLinkExe.getName().indexOf('.') < 0) {
+            jLinkExe = new File(jLinkExe.getPath() + ".exe");
         }
 
-        if ( !jLinkExe.isFile() )
-        {
-            throw new IllegalStateException( "The jlink executable '"
-                    + jLinkExe + "' doesn't exist or is not a file." );
+        if (!jLinkExe.isFile()) {
+            throw new IllegalStateException("The jlink executable '" + jLinkExe + "' doesn't exist or is not a file.");
         }
         return jLinkExe.getAbsolutePath();
     }
 
-    private int executeCommand( Commandline cmd )
-            throws MojoExecutionException
-    {
-        if ( getLog().isDebugEnabled() )
-        {
+    private int executeCommand(Commandline cmd) throws MojoExecutionException {
+        if (getLog().isDebugEnabled()) {
             // no quoted arguments ???
-            getLog().debug( CommandLineUtils.toString( cmd.getCommandline() ).replaceAll( "'", "" ) );
+            getLog().debug(CommandLineUtils.toString(cmd.getCommandline()).replaceAll("'", ""));
         }
 
         CommandLineUtils.StringStreamConsumer err = new CommandLineUtils.StringStreamConsumer();
         CommandLineUtils.StringStreamConsumer out = new CommandLineUtils.StringStreamConsumer();
-        try
-        {
-            int exitCode = CommandLineUtils.executeCommandLine( cmd, out, err );
+        try {
+            int exitCode = CommandLineUtils.executeCommandLine(cmd, out, err);
 
-            String output = StringUtils.isEmpty( out.getOutput() ) ? null : '\n' + out.getOutput().trim();
+            String output = StringUtils.isEmpty(out.getOutput())
+                    ? null
+                    : '\n' + out.getOutput().trim();
 
-            if ( exitCode != 0 )
-            {
+            if (exitCode != 0) {
 
-                if ( output != null && !output.isEmpty() )
-                {
+                if (output != null && !output.isEmpty()) {
                     // Reconsider to use WARN / ERROR ?
                     //  getLog().error( output );
-                    for ( String outputLine : output.split( "\n" ) )
-                    {
-                        getLog().error( outputLine );
+                    for (String outputLine : output.split("\n")) {
+                        getLog().error(outputLine);
                     }
                 }
 
-                StringBuilder msg = new StringBuilder( "\nExit code: " );
-                msg.append( exitCode );
-                if ( StringUtils.isNotEmpty( err.getOutput() ) )
-                {
-                    msg.append( " - " ).append( err.getOutput() );
+                StringBuilder msg = new StringBuilder("\nExit code: ");
+                msg.append(exitCode);
+                if (StringUtils.isNotEmpty(err.getOutput())) {
+                    msg.append(" - ").append(err.getOutput());
                 }
-                msg.append( '\n' );
-                msg.append( "Command line was: " ).append( cmd ).append( '\n' ).append( '\n' );
+                msg.append('\n');
+                msg.append("Command line was: ").append(cmd).append('\n').append('\n');
 
-                throw new MojoExecutionException( msg.toString() );
+                throw new MojoExecutionException(msg.toString());
             }
 
-            if ( output != null && !output.isEmpty() )
-            {
-                //getLog().info( output );
-                for ( String outputLine : output.split( "\n" ) )
-                {
-                    getLog().info( outputLine );
+            if (output != null && !output.isEmpty()) {
+                // getLog().info( output );
+                for (String outputLine : output.split("\n")) {
+                    getLog().info(outputLine);
                 }
             }
 
             return exitCode;
-        }
-        catch ( CommandLineException e )
-        {
-            throw new MojoExecutionException( "Unable to execute jlink command: " + e.getMessage(), e );
+        } catch (CommandLineException e) {
+            throw new MojoExecutionException("Unable to execute jlink command: " + e.getMessage(), e);
         }
     }
 }
diff --git a/src/main/java/org/apache/maven/plugins/jlink/JLinkExecutor.java b/src/main/java/org/apache/maven/plugins/jlink/JLinkExecutor.java
index 9953b50..e8e72fb 100644
--- a/src/main/java/org/apache/maven/plugins/jlink/JLinkExecutor.java
+++ b/src/main/java/org/apache/maven/plugins/jlink/JLinkExecutor.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.apache.maven.plugins.jlink;
 
 /*
@@ -26,6 +44,7 @@
 import java.util.List;
 import java.util.Optional;
 import java.util.spi.ToolProvider;
+
 import org.apache.commons.lang3.StringUtils;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.logging.Log;
@@ -37,103 +56,87 @@
  * <p>This implementation uses the JDK9+ Toolprovider SPI to find and execute jlink.
  * This way, no fork needs to be created.</p>
  */
-class JLinkExecutor extends AbstractJLinkToolchainExecutor
-{
+class JLinkExecutor extends AbstractJLinkToolchainExecutor {
     private final ToolProvider toolProvider;
 
-    JLinkExecutor( Toolchain toolchain, Log log )
-    {
-        super( toolchain, log );
+    JLinkExecutor(Toolchain toolchain, Log log) {
+        super(toolchain, log);
         this.toolProvider = getJLinkExecutable();
     }
 
-    protected final ToolProvider getJLinkExecutable()
-    {
-        return ToolProvider
-                .findFirst( "jlink" )
-                .orElseThrow( () -> new IllegalStateException( "No jlink tool found." ) );
+    protected final ToolProvider getJLinkExecutable() {
+        return ToolProvider.findFirst("jlink").orElseThrow(() -> new IllegalStateException("No jlink tool found."));
     }
 
     @Override
-    public int executeJlink( List<String> jlinkArgs ) throws MojoExecutionException
-    {
-        if ( getToolchain().isPresent() )
-        {
-            return super.executeJlink( jlinkArgs );
+    public int executeJlink(List<String> jlinkArgs) throws MojoExecutionException {
+        if (getToolchain().isPresent()) {
+            return super.executeJlink(jlinkArgs);
         }
 
-        if ( getLog().isDebugEnabled() )
-        {
+        if (getLog().isDebugEnabled()) {
             // no quoted arguments ???
-            getLog().debug( this.toolProvider.name() + " " + jlinkArgs );
+            getLog().debug(this.toolProvider.name() + " " + jlinkArgs);
         }
 
-        try ( StringWriter strErr = new StringWriter();
-              PrintWriter err = new PrintWriter( strErr );
-              StringWriter strOut = new StringWriter();
-              PrintWriter out = new PrintWriter( strOut ) )
-        {
-            int exitCode = this.toolProvider.run( out, err, jlinkArgs.toArray( new String[0] ) );
+        try (StringWriter strErr = new StringWriter();
+                PrintWriter err = new PrintWriter(strErr);
+                StringWriter strOut = new StringWriter();
+                PrintWriter out = new PrintWriter(strOut)) {
+            int exitCode = this.toolProvider.run(out, err, jlinkArgs.toArray(new String[0]));
             out.flush();
             err.flush();
 
             String outAsString = strOut.toString();
-            String output = ( StringUtils.isEmpty( outAsString ) ? null : '\n' + outAsString.trim() );
+            String output = (StringUtils.isEmpty(outAsString) ? null : '\n' + outAsString.trim());
 
-            if ( exitCode != 0 )
-            {
-                if ( StringUtils.isNotEmpty( output ) )
-                {
+            if (exitCode != 0) {
+                if (StringUtils.isNotEmpty(output)) {
                     // Reconsider to use WARN / ERROR ?
                     //  getLog().error( output );
-                    for ( String outputLine : output.split( "\n" ) )
-                    {
-                        getLog().error( outputLine );
+                    for (String outputLine : output.split("\n")) {
+                        getLog().error(outputLine);
                     }
                 }
 
-                StringBuilder msg = new StringBuilder( "\nExit code: " );
-                msg.append( exitCode );
+                StringBuilder msg = new StringBuilder("\nExit code: ");
+                msg.append(exitCode);
                 String errAsString = strErr.toString();
-                if ( StringUtils.isNotEmpty( errAsString ) )
-                {
-                    msg.append( " - " ).append( errAsString );
+                if (StringUtils.isNotEmpty(errAsString)) {
+                    msg.append(" - ").append(errAsString);
                 }
-                msg.append( '\n' );
-                msg.append( "Command line was: " ).append( this.toolProvider.name() ).append( ' ' ).append(
-                        jlinkArgs ).append( '\n' ).append( '\n' );
+                msg.append('\n');
+                msg.append("Command line was: ")
+                        .append(this.toolProvider.name())
+                        .append(' ')
+                        .append(jlinkArgs)
+                        .append('\n')
+                        .append('\n');
 
-                throw new MojoExecutionException( msg.toString() );
+                throw new MojoExecutionException(msg.toString());
             }
 
-            if ( StringUtils.isNotEmpty( output ) )
-            {
-                //getLog().info( output );
-                for ( String outputLine : output.split( "\n" ) )
-                {
-                    getLog().info( outputLine );
+            if (StringUtils.isNotEmpty(output)) {
+                // getLog().info( output );
+                for (String outputLine : output.split("\n")) {
+                    getLog().info(outputLine);
                 }
             }
 
             return exitCode;
-        }
-        catch ( IOException e )
-        {
-            throw new MojoExecutionException( "Unable to execute jlink command: " + e.getMessage(), e );
+        } catch (IOException e) {
+            throw new MojoExecutionException("Unable to execute jlink command: " + e.getMessage(), e);
         }
     }
 
     @Override
-    public Optional<File> getJmodsFolder( /* nullable */ File sourceJdkModules )
-    {
-        if ( getToolchain().isPresent() )
-        {
-            return super.getJmodsFolder( sourceJdkModules );
+    public Optional<File> getJmodsFolder(/* nullable */ File sourceJdkModules) {
+        if (getToolchain().isPresent()) {
+            return super.getJmodsFolder(sourceJdkModules);
         }
 
-        if ( sourceJdkModules != null && sourceJdkModules.isDirectory() )
-        {
-            return Optional.of( new File( sourceJdkModules, JMODS ) );
+        if (sourceJdkModules != null && sourceJdkModules.isDirectory()) {
+            return Optional.of(new File(sourceJdkModules, JMODS));
         }
 
         // ToolProvider does not need jmods folder to be set.
diff --git a/src/main/java/org/apache/maven/plugins/jlink/JLinkMojo.java b/src/main/java/org/apache/maven/plugins/jlink/JLinkMojo.java
index b0b273b..a5f203d 100644
--- a/src/main/java/org/apache/maven/plugins/jlink/JLinkMojo.java
+++ b/src/main/java/org/apache/maven/plugins/jlink/JLinkMojo.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.apache.maven.plugins.jlink;
 
 /*
@@ -60,13 +78,11 @@
  * The JLink goal is intended to create a Java Run Time Image file based on
  * <a href="https://openjdk.java.net/jeps/282">https://openjdk.java.net/jeps/282</a>,
  * <a href="https://openjdk.java.net/jeps/220">https://openjdk.java.net/jeps/220</a>.
- * 
+ *
  * @author Karl Heinz Marbaise <a href="mailto:khmarbaise@apache.org">khmarbaise@apache.org</a>
  */
-@Mojo( name = "jlink", requiresDependencyResolution = ResolutionScope.RUNTIME, defaultPhase = LifecyclePhase.PACKAGE )
-public class JLinkMojo
-    extends AbstractJLinkMojo
-{
+@Mojo(name = "jlink", requiresDependencyResolution = ResolutionScope.RUNTIME, defaultPhase = LifecyclePhase.PACKAGE)
+public class JLinkMojo extends AbstractJLinkMojo {
     @Component
     private LocationManager locationManager;
 
@@ -84,7 +100,7 @@
      * This is intended to strip debug information out. The command line equivalent of <code>jlink</code> is:
      * <code>-G, --strip-debug</code> strip debug information.
      */
-    @Parameter( defaultValue = "false" )
+    @Parameter(defaultValue = "false")
     private boolean stripDebug;
 
     /**
@@ -126,7 +142,7 @@
     /**
      * Limit the universe of observable modules. The following gives an example of the configuration which can be used
      * in the <code>pom.xml</code> file.
-     * 
+     *
      * <pre>
      *   &lt;limitModules&gt;
      *     &lt;limitModule&gt;mod1&lt;/limitModule&gt;
@@ -135,7 +151,7 @@
      *     .
      *   &lt;/limitModules&gt;
      * </pre>
-     * 
+     *
      * This configuration is the equivalent of the command line option:
      * <code>--limit-modules &lt;mod&gt;[,&lt;mod&gt;...]</code>
      */
@@ -150,7 +166,7 @@
      * By using the --add-modules you can define the root modules to be resolved. The configuration in
      * <code>pom.xml</code> file can look like this:
      * </p>
-     * 
+     *
      * <pre>
      * &lt;addModules&gt;
      *   &lt;addModule&gt;mod1&lt;/addModule&gt;
@@ -159,7 +175,7 @@
      *   .
      * &lt;/addModules&gt;
      * </pre>
-     * 
+     *
      * The command line equivalent for jlink is: <code>--add-modules &lt;mod&gt;[,&lt;mod&gt;...]</code>.
      */
     @Parameter
@@ -180,13 +196,13 @@
      * otherwise {@code default} will be used as subdirectory.
      * This ensures that multiple executions using classifiers will not overwrite the previous run’s image.</p>
      */
-    @Parameter( defaultValue = "${project.build.directory}/maven-jlink", required = true, readonly = true )
+    @Parameter(defaultValue = "${project.build.directory}/maven-jlink", required = true, readonly = true)
     private File outputDirectoryImage;
 
-    @Parameter( defaultValue = "${project.build.directory}", required = true, readonly = true )
+    @Parameter(defaultValue = "${project.build.directory}", required = true, readonly = true)
     private File buildDirectory;
 
-    @Parameter( defaultValue = "${project.build.outputDirectory}", required = true, readonly = true )
+    @Parameter(defaultValue = "${project.build.outputDirectory}", required = true, readonly = true)
     private File outputDirectory;
 
     /**
@@ -207,7 +223,7 @@
     /**
      * Add the option <code>--bind-services</code> or not.
      */
-    @Parameter( defaultValue = "false" )
+    @Parameter(defaultValue = "false")
     private boolean bindServices;
 
     /**
@@ -219,26 +235,26 @@
     /**
      * <code>--ignore-signing-information</code>
      */
-    @Parameter( defaultValue = "false" )
+    @Parameter(defaultValue = "false")
     private boolean ignoreSigningInformation;
 
     /**
      * This will suppress to have an <code>includes</code> directory in the resulting Java Run Time Image. The JLink
      * command line equivalent is: <code>--no-header-files</code>
      */
-    @Parameter( defaultValue = "false" )
+    @Parameter(defaultValue = "false")
     private boolean noHeaderFiles;
 
     /**
      * This will suppress to have the <code>man</code> directory in the resulting Java Run Time Image. The JLink command
      * line equivalent is: <code>--no-man-pages</code>
      */
-    @Parameter( defaultValue = "false" )
+    @Parameter(defaultValue = "false")
     private boolean noManPages;
 
     /**
      * Suggest providers that implement the given service types from the module path.
-     * 
+     *
      * <pre>
      * &lt;suggestProviders&gt;
      *   &lt;suggestProvider&gt;name-a&lt;/suggestProvider&gt;
@@ -247,7 +263,7 @@
      *   .
      * &lt;/suggestProviders&gt;
      * </pre>
-     * 
+     *
      * The jlink command linke equivalent: <code>--suggest-providers [&lt;name&gt;,...]</code>
      */
     @Parameter
@@ -277,13 +293,13 @@
     /**
      * This will turn on verbose mode. The jlink command line equivalent is: <code>--verbose</code>
      */
-    @Parameter( defaultValue = "false" )
+    @Parameter(defaultValue = "false")
     private boolean verbose;
 
     /**
      * The JAR archiver needed for archiving the environments.
      */
-    @Component( role = Archiver.class, hint = "zip" )
+    @Component(role = Archiver.class, hint = "zip")
     private ZipArchiver zipArchiver;
 
     /**
@@ -305,7 +321,7 @@
      * Name of the generated ZIP file in the <code>target</code> directory. This will not change the name of the
      * installed/deployed file.
      */
-    @Parameter( defaultValue = "${project.build.finalName}", readonly = true )
+    @Parameter(defaultValue = "${project.build.finalName}", readonly = true)
     private String finalName;
 
     /**
@@ -315,8 +331,7 @@
     private MavenProjectHelper projectHelper;
 
     @Override
-    public void execute() throws MojoExecutionException, MojoFailureException
-    {
+    public void execute() throws MojoExecutionException, MojoFailureException {
         failIfParametersAreNotInTheirValidValueRanges();
 
         setOutputDirectoryImage();
@@ -325,168 +340,141 @@
 
         JLinkExecutor jLinkExec = getExecutor();
         Collection<String> modulesToAdd = new ArrayList<>();
-        if ( addModules != null )
-        {
-            modulesToAdd.addAll( addModules );
+        if (addModules != null) {
+            modulesToAdd.addAll(addModules);
         }
-        jLinkExec.addAllModules( modulesToAdd );
+        jLinkExec.addAllModules(modulesToAdd);
 
         Collection<String> pathsOfModules = new ArrayList<>();
-        if ( modulePaths != null )
-        {
-            pathsOfModules.addAll( modulePaths );
+        if (modulePaths != null) {
+            pathsOfModules.addAll(modulePaths);
         }
 
-        for ( Entry<String, File> item : getModulePathElements().entrySet() )
-        {
-            getLog().info( " -> module: " + item.getKey() + " ( " + item.getValue().getPath() + " )" );
+        for (Entry<String, File> item : getModulePathElements().entrySet()) {
+            getLog().info(" -> module: " + item.getKey() + " ( "
+                    + item.getValue().getPath() + " )");
 
             // We use the real module name and not the artifact Id...
-            modulesToAdd.add( item.getKey() );
-            pathsOfModules.add( item.getValue().getPath() );
+            modulesToAdd.add(item.getKey());
+            pathsOfModules.add(item.getValue().getPath());
         }
 
         // The jmods directory of the JDK
-        jLinkExec.getJmodsFolder( this.sourceJdkModules ).ifPresent(
-                jmodsFolder -> pathsOfModules.add( jmodsFolder.getAbsolutePath() )
-        );
-        jLinkExec.addAllModulePaths( pathsOfModules );
+        jLinkExec
+                .getJmodsFolder(this.sourceJdkModules)
+                .ifPresent(jmodsFolder -> pathsOfModules.add(jmodsFolder.getAbsolutePath()));
+        jLinkExec.addAllModulePaths(pathsOfModules);
 
-        List<String> jlinkArgs = createJlinkArgs( pathsOfModules, modulesToAdd );
+        List<String> jlinkArgs = createJlinkArgs(pathsOfModules, modulesToAdd);
 
-        try
-        {
-            jLinkExec.executeJlink( jlinkArgs );
-        }
-        catch ( IllegalStateException e )
-        {
-            throw new MojoFailureException( "Unable to find jlink command: " + e.getMessage(), e );
+        try {
+            jLinkExec.executeJlink(jlinkArgs);
+        } catch (IllegalStateException e) {
+            throw new MojoFailureException("Unable to find jlink command: " + e.getMessage(), e);
         }
 
-        File createZipArchiveFromImage = createZipArchiveFromImage( buildDirectory, outputDirectoryImage );
+        File createZipArchiveFromImage = createZipArchiveFromImage(buildDirectory, outputDirectoryImage);
 
-        if ( hasClassifier() )
-        {
-            projectHelper.attachArtifact( getProject(), "jlink", getClassifier(), createZipArchiveFromImage );
-        }
-        else
-        {
-            if ( projectHasAlreadySetAnArtifact() )
-            {
-                throw new MojoExecutionException( "You have to use a classifier "
-                        + "to attach supplemental artifacts to the project instead of replacing them." );
+        if (hasClassifier()) {
+            projectHelper.attachArtifact(getProject(), "jlink", getClassifier(), createZipArchiveFromImage);
+        } else {
+            if (projectHasAlreadySetAnArtifact()) {
+                throw new MojoExecutionException("You have to use a classifier "
+                        + "to attach supplemental artifacts to the project instead of replacing them.");
             }
-            getProject().getArtifact().setFile( createZipArchiveFromImage );
+            getProject().getArtifact().setFile(createZipArchiveFromImage);
         }
     }
 
-    private List<File> getCompileClasspathElements( MavenProject project )
-    {
-        List<File> list = new ArrayList<>( project.getArtifacts().size() + 1 );
+    private List<File> getCompileClasspathElements(MavenProject project) {
+        List<File> list = new ArrayList<>(project.getArtifacts().size() + 1);
 
-        for ( Artifact a : project.getArtifacts() )
-        {
-            getLog().debug( "Artifact: " + a.getGroupId() + ":" + a.getArtifactId() + ":" + a.getVersion() );
-            list.add( a.getFile() );
+        for (Artifact a : project.getArtifacts()) {
+            getLog().debug("Artifact: " + a.getGroupId() + ":" + a.getArtifactId() + ":" + a.getVersion());
+            list.add(a.getFile());
         }
         return list;
     }
 
-    private Map<String, File> getModulePathElements()
-        throws MojoFailureException
-    {
+    private Map<String, File> getModulePathElements() throws MojoFailureException {
         // For now only allow named modules. Once we can create a graph with ASM we can specify exactly the modules
         // and we can detect if auto modules are used. In that case, MavenProject.setFile() should not be used, so
         // you cannot depend on this project and so it won't be distributed.
 
         Map<String, File> modulepathElements = new HashMap<>();
 
-        try
-        {
-            Collection<File> dependencyArtifacts = getCompileClasspathElements( getProject() );
+        try {
+            Collection<File> dependencyArtifacts = getCompileClasspathElements(getProject());
 
-            ResolvePathsRequest<File> request = ResolvePathsRequest.ofFiles( dependencyArtifacts );
+            ResolvePathsRequest<File> request = ResolvePathsRequest.ofFiles(dependencyArtifacts);
 
             Optional<Toolchain> toolchain = getToolchain();
-            if ( toolchain.isPresent()
-                    && toolchain.orElseThrow( NoSuchElementException::new ) instanceof DefaultJavaToolChain )
-            {
-                Toolchain toolcahin1 = toolchain.orElseThrow( NoSuchElementException::new );
-                request.setJdkHome( new File( ( (DefaultJavaToolChain) toolcahin1 ).getJavaHome() ) );
+            if (toolchain.isPresent()
+                    && toolchain.orElseThrow(NoSuchElementException::new) instanceof DefaultJavaToolChain) {
+                Toolchain toolcahin1 = toolchain.orElseThrow(NoSuchElementException::new);
+                request.setJdkHome(new File(((DefaultJavaToolChain) toolcahin1).getJavaHome()));
             }
 
-            ResolvePathsResult<File> resolvePathsResult = locationManager.resolvePaths( request );
+            ResolvePathsResult<File> resolvePathsResult = locationManager.resolvePaths(request);
 
-            for ( Map.Entry<File, JavaModuleDescriptor> entry : resolvePathsResult.getPathElements().entrySet() )
-            {
+            for (Map.Entry<File, JavaModuleDescriptor> entry :
+                    resolvePathsResult.getPathElements().entrySet()) {
                 JavaModuleDescriptor descriptor = entry.getValue();
-                if ( descriptor == null )
-                {
+                if (descriptor == null) {
                     String message = "The given dependency " + entry.getKey()
-                        + " does not have a module-info.java file. So it can't be linked.";
-                    getLog().error( message );
-                    throw new MojoFailureException( message );
+                            + " does not have a module-info.java file. So it can't be linked.";
+                    getLog().error(message);
+                    throw new MojoFailureException(message);
                 }
 
                 // Don't warn for automatic modules, let the jlink tool do that
-                getLog().debug( " module: " + descriptor.name() + " automatic: " + descriptor.isAutomatic() );
-                if ( modulepathElements.containsKey( descriptor.name() ) )
-                {
-                    getLog().warn( "The module name " + descriptor.name() + " does already exists." );
+                getLog().debug(" module: " + descriptor.name() + " automatic: " + descriptor.isAutomatic());
+                if (modulepathElements.containsKey(descriptor.name())) {
+                    getLog().warn("The module name " + descriptor.name() + " does already exists.");
                 }
-                modulepathElements.put( descriptor.name(), entry.getKey() );
+                modulepathElements.put(descriptor.name(), entry.getKey());
             }
 
             // This part is for the module in target/classes ? (Hacky..)
             // FIXME: Is there a better way to identify that code exists?
-            if ( outputDirectory.exists() )
-            {
-                List<File> singletonList = Collections.singletonList( outputDirectory );
+            if (outputDirectory.exists()) {
+                List<File> singletonList = Collections.singletonList(outputDirectory);
 
-                ResolvePathsRequest<File> singleModuls = ResolvePathsRequest.ofFiles( singletonList );
+                ResolvePathsRequest<File> singleModuls = ResolvePathsRequest.ofFiles(singletonList);
 
-                ResolvePathsResult<File> resolvePaths = locationManager.resolvePaths( singleModuls );
-                for ( Entry<File, JavaModuleDescriptor> entry : resolvePaths.getPathElements().entrySet() )
-                {
+                ResolvePathsResult<File> resolvePaths = locationManager.resolvePaths(singleModuls);
+                for (Entry<File, JavaModuleDescriptor> entry :
+                        resolvePaths.getPathElements().entrySet()) {
                     JavaModuleDescriptor descriptor = entry.getValue();
-                    if ( descriptor == null )
-                    {
+                    if (descriptor == null) {
                         String message = "The given project " + entry.getKey()
-                            + " does not contain a module-info.java file. So it can't be linked.";
-                        getLog().error( message );
-                        throw new MojoFailureException( message );
+                                + " does not contain a module-info.java file. So it can't be linked.";
+                        getLog().error(message);
+                        throw new MojoFailureException(message);
                     }
-                    if ( modulepathElements.containsKey( descriptor.name() ) )
-                    {
-                        getLog().warn( "The module name " + descriptor.name() + " does already exists." );
+                    if (modulepathElements.containsKey(descriptor.name())) {
+                        getLog().warn("The module name " + descriptor.name() + " does already exists.");
                     }
-                    modulepathElements.put( descriptor.name(), entry.getKey() );
+                    modulepathElements.put(descriptor.name(), entry.getKey());
                 }
             }
 
-        }
-        catch ( IOException e )
-        {
-            getLog().error( e.getMessage() );
-            throw new MojoFailureException( e.getMessage() );
+        } catch (IOException e) {
+            getLog().error(e.getMessage());
+            throw new MojoFailureException(e.getMessage());
         }
 
         return modulepathElements;
     }
 
-    private JLinkExecutor getExecutor()
-    {
+    private JLinkExecutor getExecutor() {
         return getJlinkExecutor();
     }
 
-    private boolean projectHasAlreadySetAnArtifact( )
-    {
-        if ( getProject().getArtifact().getFile() != null )
-        {
+    private boolean projectHasAlreadySetAnArtifact() {
+        if (getProject().getArtifact().getFile() != null) {
             return getProject().getArtifact().getFile().isFile();
-        }
-        else
-        {
+        } else {
             return false;
         }
     }
@@ -494,86 +482,68 @@
     /**
      * @return true in case where the classifier is not {@code null} and contains something else than white spaces.
      */
-    protected boolean hasClassifier()
-    {
+    protected boolean hasClassifier() {
         boolean result = false;
-        if ( getClassifier() != null && !getClassifier().isEmpty() )
-        {
+        if (getClassifier() != null && !getClassifier().isEmpty()) {
             result = true;
         }
 
         return result;
     }
 
-    private File createZipArchiveFromImage( File outputDirectory, File outputDirectoryImage )
-        throws MojoExecutionException
-    {
-        zipArchiver.addDirectory( outputDirectoryImage );
+    private File createZipArchiveFromImage(File outputDirectory, File outputDirectoryImage)
+            throws MojoExecutionException {
+        zipArchiver.addDirectory(outputDirectoryImage);
 
-        File resultArchive = getArchiveFile( outputDirectory, finalName, getClassifier(), "zip" );
+        File resultArchive = getArchiveFile(outputDirectory, finalName, getClassifier(), "zip");
 
-        zipArchiver.setDestFile( resultArchive );
-        try
-        {
+        zipArchiver.setDestFile(resultArchive);
+        try {
             zipArchiver.createArchive();
-        }
-        catch ( ArchiverException | IOException e )
-        {
-            getLog().error( e.getMessage(), e );
-            throw new MojoExecutionException( e.getMessage(), e );
+        } catch (ArchiverException | IOException e) {
+            getLog().error(e.getMessage(), e);
+            throw new MojoExecutionException(e.getMessage(), e);
         }
 
         return resultArchive;
-
     }
 
-    private void failIfParametersAreNotInTheirValidValueRanges()
-        throws MojoFailureException
-    {
-        if ( compress != null && ( compress < 0 || compress > 2 ) )
-        {
+    private void failIfParametersAreNotInTheirValidValueRanges() throws MojoFailureException {
+        if (compress != null && (compress < 0 || compress > 2)) {
             String message = "The given compress parameters " + compress + " is not in the valid value range from 0..2";
-            getLog().error( message );
-            throw new MojoFailureException( message );
+            getLog().error(message);
+            throw new MojoFailureException(message);
         }
 
-        if ( endian != null && ( !"big".equals( endian ) && !"little".equals( endian ) ) )
-        {
+        if (endian != null && (!"big".equals(endian) && !"little".equals(endian))) {
             String message = "The given endian parameter " + endian
                     + " does not contain one of the following values: 'little' or 'big'.";
-            getLog().error( message );
-            throw new MojoFailureException( message );
+            getLog().error(message);
+            throw new MojoFailureException(message);
         }
 
-        if ( addOptions != null && !addOptions.isEmpty() )
-        {
+        if (addOptions != null && !addOptions.isEmpty()) {
             requireJdk14();
         }
     }
 
-    private void requireJdk14() throws MojoFailureException
-    {
+    private void requireJdk14() throws MojoFailureException {
         // needs JDK 14+
         Optional<Toolchain> optToolchain = getToolchain();
         String java14reqMsg = "parameter 'addOptions' needs at least a Java 14 runtime or a Java 14 toolchain.";
 
-        if ( optToolchain.isPresent() )
-        {
-            Toolchain toolchain = optToolchain.orElseThrow( NoSuchElementException::new );
-            if ( !( toolchain instanceof ToolchainPrivate ) )
-            {
-                getLog().warn( "Unable to check toolchain java version." );
+        if (optToolchain.isPresent()) {
+            Toolchain toolchain = optToolchain.orElseThrow(NoSuchElementException::new);
+            if (!(toolchain instanceof ToolchainPrivate)) {
+                getLog().warn("Unable to check toolchain java version.");
                 return;
             }
             ToolchainPrivate toolchainPrivate = (ToolchainPrivate) toolchain;
-            if ( !toolchainPrivate.matchesRequirements( singletonMap( "jdk", "14" ) ) )
-            {
-                throw new MojoFailureException( java14reqMsg );
+            if (!toolchainPrivate.matchesRequirements(singletonMap("jdk", "14"))) {
+                throw new MojoFailureException(java14reqMsg);
             }
-        }
-        else if ( !JavaVersion.JAVA_VERSION.isAtLeast( "14" ) )
-        {
-            throw new MojoFailureException( java14reqMsg );
+        } else if (!JavaVersion.JAVA_VERSION.isAtLeast("14")) {
+            throw new MojoFailureException(java14reqMsg);
         }
     }
 
@@ -583,178 +553,142 @@
      * <p>Rationale: If a user creates multiple jlink artifacts using classifiers,
      * the directories should not overwrite themselves for each execution.</p>
      */
-    private void setOutputDirectoryImage()
-    {
-        if ( hasClassifier() )
-        {
-            final File classifiersDirectory = new File( outputDirectoryImage, "classifiers" );
-            outputDirectoryImage = new File( classifiersDirectory, classifier );
-        }
-        else
-        {
-            outputDirectoryImage = new File( outputDirectoryImage, "default" );
+    private void setOutputDirectoryImage() {
+        if (hasClassifier()) {
+            final File classifiersDirectory = new File(outputDirectoryImage, "classifiers");
+            outputDirectoryImage = new File(classifiersDirectory, classifier);
+        } else {
+            outputDirectoryImage = new File(outputDirectoryImage, "default");
         }
     }
 
-    private void ifOutputDirectoryExistsDelteIt()
-        throws MojoExecutionException
-    {
-        if ( outputDirectoryImage.exists() )
-        {
+    private void ifOutputDirectoryExistsDelteIt() throws MojoExecutionException {
+        if (outputDirectoryImage.exists()) {
             // Delete the output folder of JLink before we start
             // otherwise JLink will fail with a message "Error: directory already exists: ..."
-            try
-            {
-                getLog().debug( "Deleting existing " + outputDirectoryImage.getAbsolutePath() );
-                FileUtils.forceDelete( outputDirectoryImage );
-            }
-            catch ( IOException e )
-            {
-                getLog().error( "IOException", e );
-                throw new MojoExecutionException( "Failure during deletion of " + outputDirectoryImage.getAbsolutePath()
-                    + " occured." );
+            try {
+                getLog().debug("Deleting existing " + outputDirectoryImage.getAbsolutePath());
+                FileUtils.forceDelete(outputDirectoryImage);
+            } catch (IOException e) {
+                getLog().error("IOException", e);
+                throw new MojoExecutionException(
+                        "Failure during deletion of " + outputDirectoryImage.getAbsolutePath() + " occured.");
             }
         }
     }
 
-    private List<String> createJlinkArgs( Collection<String> pathsOfModules,
-                                      Collection<String> modulesToAdd )
-    {
+    private List<String> createJlinkArgs(Collection<String> pathsOfModules, Collection<String> modulesToAdd) {
         List<String> jlinkArgs = new ArrayList<>();
 
-        if ( stripDebug )
-        {
-            jlinkArgs.add( "--strip-debug" );
+        if (stripDebug) {
+            jlinkArgs.add("--strip-debug");
         }
 
-        if ( bindServices )
-        {
-            jlinkArgs.add( "--bind-services" );
+        if (bindServices) {
+            jlinkArgs.add("--bind-services");
         }
 
-        if ( endian != null )
-        {
-            jlinkArgs.add( "--endian" );
-            jlinkArgs.add( endian );
+        if (endian != null) {
+            jlinkArgs.add("--endian");
+            jlinkArgs.add(endian);
         }
-        if ( ignoreSigningInformation )
-        {
-            jlinkArgs.add( "--ignore-signing-information" );
+        if (ignoreSigningInformation) {
+            jlinkArgs.add("--ignore-signing-information");
         }
-        if ( compress != null )
-        {
-            jlinkArgs.add( "--compress" );
-            jlinkArgs.add( compress + "" );
+        if (compress != null) {
+            jlinkArgs.add("--compress");
+            jlinkArgs.add(compress + "");
         }
-        if ( launcher != null )
-        {
-            jlinkArgs.add( "--launcher" );
-            jlinkArgs.add( launcher );
+        if (launcher != null) {
+            jlinkArgs.add("--launcher");
+            jlinkArgs.add(launcher);
         }
-        if ( addOptions != null && !addOptions.isEmpty() )
-        {
-            jlinkArgs.add( "--add-options" );
-            jlinkArgs.add( String.format( "\"%s\"", String.join( " ", addOptions ) ) );
+        if (addOptions != null && !addOptions.isEmpty()) {
+            jlinkArgs.add("--add-options");
+            jlinkArgs.add(String.format("\"%s\"", String.join(" ", addOptions)));
         }
 
-        if ( disablePlugin != null )
-        {
-            jlinkArgs.add( "--disable-plugin" );
-            jlinkArgs.add( disablePlugin );
-
+        if (disablePlugin != null) {
+            jlinkArgs.add("--disable-plugin");
+            jlinkArgs.add(disablePlugin);
         }
-        if ( pathsOfModules != null )
-        {
+        if (pathsOfModules != null) {
             // @formatter:off
-            jlinkArgs.add( "--module-path" );
-            jlinkArgs.add( getPlatformDependSeparateList( pathsOfModules ).replace( "\\", "\\\\" ) );
+            jlinkArgs.add("--module-path");
+            jlinkArgs.add(getPlatformDependSeparateList(pathsOfModules).replace("\\", "\\\\"));
             // @formatter:off
         }
 
-        if ( noHeaderFiles )
-        {
-            jlinkArgs.add( "--no-header-files" );
+        if (noHeaderFiles) {
+            jlinkArgs.add("--no-header-files");
         }
 
-        if ( noManPages )
-        {
-            jlinkArgs.add( "--no-man-pages" );
+        if (noManPages) {
+            jlinkArgs.add("--no-man-pages");
         }
 
-        if ( hasSuggestProviders() )
-        {
-            jlinkArgs.add( "--suggest-providers" );
-            String sb = getCommaSeparatedList( suggestProviders );
-            jlinkArgs.add( sb );
+        if (hasSuggestProviders()) {
+            jlinkArgs.add("--suggest-providers");
+            String sb = getCommaSeparatedList(suggestProviders);
+            jlinkArgs.add(sb);
         }
 
-        if ( hasLimitModules() )
-        {
-            jlinkArgs.add( "--limit-modules" );
-            String sb = getCommaSeparatedList( limitModules );
-            jlinkArgs.add( sb );
+        if (hasLimitModules()) {
+            jlinkArgs.add("--limit-modules");
+            String sb = getCommaSeparatedList(limitModules);
+            jlinkArgs.add(sb);
         }
 
-        if ( !modulesToAdd.isEmpty() )
-        {
-            jlinkArgs.add( "--add-modules" );
+        if (!modulesToAdd.isEmpty()) {
+            jlinkArgs.add("--add-modules");
             // This must be name of the module and *NOT* the name of the
             // file! Can we somehow pre check this information to fail early?
-            String sb = getCommaSeparatedList( modulesToAdd );
-            jlinkArgs.add( sb.replace( "\\", "\\\\" ) );
+            String sb = getCommaSeparatedList(modulesToAdd);
+            jlinkArgs.add(sb.replace("\\", "\\\\"));
         }
 
-        if ( hasIncludeLocales() )
-        {
-            jlinkArgs.add( "--add-modules" );
-            jlinkArgs.add( "jdk.localedata" );
-            jlinkArgs.add( "--include-locales" );
-            String sb = getCommaSeparatedList( includeLocales );
-            jlinkArgs.add( sb );
+        if (hasIncludeLocales()) {
+            jlinkArgs.add("--add-modules");
+            jlinkArgs.add("jdk.localedata");
+            jlinkArgs.add("--include-locales");
+            String sb = getCommaSeparatedList(includeLocales);
+            jlinkArgs.add(sb);
         }
 
-        if ( pluginModulePath != null )
-        {
-            jlinkArgs.add( "--plugin-module-path" );
-            StringBuilder sb = convertSeparatedModulePathToPlatformSeparatedModulePath( pluginModulePath );
-            jlinkArgs.add( sb.toString().replace( "\\", "\\\\" ) );
+        if (pluginModulePath != null) {
+            jlinkArgs.add("--plugin-module-path");
+            StringBuilder sb = convertSeparatedModulePathToPlatformSeparatedModulePath(pluginModulePath);
+            jlinkArgs.add(sb.toString().replace("\\", "\\\\"));
         }
 
-        if ( buildDirectory != null )
-        {
-            jlinkArgs.add( "--output" );
-            jlinkArgs.add( outputDirectoryImage.getAbsolutePath() );
+        if (buildDirectory != null) {
+            jlinkArgs.add("--output");
+            jlinkArgs.add(outputDirectoryImage.getAbsolutePath());
         }
 
-        if ( verbose )
-        {
-            jlinkArgs.add( "--verbose" );
+        if (verbose) {
+            jlinkArgs.add("--verbose");
         }
 
-        return Collections.unmodifiableList( jlinkArgs );
+        return Collections.unmodifiableList(jlinkArgs);
     }
 
-    private boolean hasIncludeLocales()
-    {
+    private boolean hasIncludeLocales() {
         return includeLocales != null && !includeLocales.isEmpty();
     }
 
-    private boolean hasSuggestProviders()
-    {
+    private boolean hasSuggestProviders() {
         return suggestProviders != null && !suggestProviders.isEmpty();
     }
 
-    private boolean hasLimitModules()
-    {
+    private boolean hasLimitModules() {
         return limitModules != null && !limitModules.isEmpty();
     }
 
     /**
      * {@inheritDoc}
      */
-    protected String getClassifier()
-    {
+    protected String getClassifier() {
         return classifier;
     }
-
 }
diff --git a/src/test/java/org/apache/maven/plugins/jlink/AbstractJLinkMojoTest.java b/src/test/java/org/apache/maven/plugins/jlink/AbstractJLinkMojoTest.java
index 1aef05a..fc82183 100644
--- a/src/test/java/org/apache/maven/plugins/jlink/AbstractJLinkMojoTest.java
+++ b/src/test/java/org/apache/maven/plugins/jlink/AbstractJLinkMojoTest.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.apache.maven.plugins.jlink;
 
 /*
@@ -19,10 +37,6 @@
  * under the License.
  */
 
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
 import java.io.File;
 import java.util.Arrays;
 import java.util.Collections;
@@ -33,91 +47,83 @@
 import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
 
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
 /**
  * @author Karl Heinz Marbaise <a href="mailto:khmarbaise@apache.org">khmarbaise@apache.org</a>
  */
-public class AbstractJLinkMojoTest
-{
+public class AbstractJLinkMojoTest {
     private AbstractJLinkMojo mojoMock;
 
     @BeforeEach
-    public void before()
-    {
-        this.mojoMock = mock( AbstractJLinkMojo.class, Mockito.CALLS_REAL_METHODS );
-        when( mojoMock.getLog() ).thenReturn( mock( Log.class ) );
+    public void before() {
+        this.mojoMock = mock(AbstractJLinkMojo.class, Mockito.CALLS_REAL_METHODS);
+        when(mojoMock.getLog()).thenReturn(mock(Log.class));
     }
 
     @Test
-    @DisplayName( "convert should return single characters" )
-    public void convertShouldReturnSingleCharacter()
-    {
-        StringBuilder result = mojoMock.convertSeparatedModulePathToPlatformSeparatedModulePath( "x" );
-        assertThat( result ).isNotEmpty().hasToString( "x" );
+    @DisplayName("convert should return single characters")
+    public void convertShouldReturnSingleCharacter() {
+        StringBuilder result = mojoMock.convertSeparatedModulePathToPlatformSeparatedModulePath("x");
+        assertThat(result).isNotEmpty().hasToString("x");
     }
 
     @Test
-    @DisplayName( "convert should two characters separated by path separator" )
-    public void convertShouldReturnTwoCharactersSeparatedByPathSeparator()
-    {
-        StringBuilder result = mojoMock.convertSeparatedModulePathToPlatformSeparatedModulePath( "x;a" );
-        assertThat( result ).hasToString( "x" + File.pathSeparatorChar + "a" );
+    @DisplayName("convert should two characters separated by path separator")
+    public void convertShouldReturnTwoCharactersSeparatedByPathSeparator() {
+        StringBuilder result = mojoMock.convertSeparatedModulePathToPlatformSeparatedModulePath("x;a");
+        assertThat(result).hasToString("x" + File.pathSeparatorChar + "a");
     }
 
     @Test
-    @DisplayName( "convert using differential delimiter should return two characters separated by path separator" )
-    public void convertUsingDifferentDelimiterShouldReturnTwoCharactersSeparatedByPathSeparator()
-    {
-        StringBuilder result = mojoMock.convertSeparatedModulePathToPlatformSeparatedModulePath( "x:a" );
-        assertThat( result ).hasToString( "x" + File.pathSeparatorChar + "a" );
+    @DisplayName("convert using differential delimiter should return two characters separated by path separator")
+    public void convertUsingDifferentDelimiterShouldReturnTwoCharactersSeparatedByPathSeparator() {
+        StringBuilder result = mojoMock.convertSeparatedModulePathToPlatformSeparatedModulePath("x:a");
+        assertThat(result).hasToString("x" + File.pathSeparatorChar + "a");
     }
 
     @Test
-    @DisplayName( "convertSeparatedModulePathToPlatformSeparatedModulePath() "
-                          + "should return two characters separated by path separator" )
-    public void convertUsingMultipleDelimitersShouldReturnTwoCharactersSeparatedByPathSeparator()
-    {
-        StringBuilder result = mojoMock.convertSeparatedModulePathToPlatformSeparatedModulePath( "x:a::" );
-        assertThat( result ).hasToString( "x" + File.pathSeparatorChar + "a" );
+    @DisplayName("convertSeparatedModulePathToPlatformSeparatedModulePath() "
+            + "should return two characters separated by path separator")
+    public void convertUsingMultipleDelimitersShouldReturnTwoCharactersSeparatedByPathSeparator() {
+        StringBuilder result = mojoMock.convertSeparatedModulePathToPlatformSeparatedModulePath("x:a::");
+        assertThat(result).hasToString("x" + File.pathSeparatorChar + "a");
     }
 
     @Test
-    @DisplayName( "getPlatformDependSeparateList() should return a single character" )
-    public void getPlatformDependSeparateListShouldReturnASingleCharacter()
-    {
-        String result = mojoMock.getPlatformDependSeparateList( Collections.singletonList( "A" ) );
-        assertThat( result ).isEqualTo( "A" );
+    @DisplayName("getPlatformDependSeparateList() should return a single character")
+    public void getPlatformDependSeparateListShouldReturnASingleCharacter() {
+        String result = mojoMock.getPlatformDependSeparateList(Collections.singletonList("A"));
+        assertThat(result).isEqualTo("A");
     }
 
     @Test
-    @DisplayName( "getPlatformDependSeparateList() should return two characters separated" )
-    public void getPlatformDependSeparateListShouldReturnTwoCharactersSeparated()
-    {
-        String result = mojoMock.getPlatformDependSeparateList( Arrays.asList( "A", "B" ) );
-        assertThat( result ).isEqualTo( "A" + File.pathSeparatorChar + "B" );
+    @DisplayName("getPlatformDependSeparateList() should return two characters separated")
+    public void getPlatformDependSeparateListShouldReturnTwoCharactersSeparated() {
+        String result = mojoMock.getPlatformDependSeparateList(Arrays.asList("A", "B"));
+        assertThat(result).isEqualTo("A" + File.pathSeparatorChar + "B");
     }
 
     @Test
-    @DisplayName( "getPlatformDependSeparateList() should return three characters separated" )
-    public void getPlatformDependSeparateListShouldReturnThreeCharactersSeparated()
-    {
-        String result = mojoMock.getPlatformDependSeparateList( Arrays.asList( "A", "B", "C" ) );
-        assertThat( result ).isEqualTo( "A" + File.pathSeparatorChar + "B" + File.pathSeparatorChar + "C" );
+    @DisplayName("getPlatformDependSeparateList() should return three characters separated")
+    public void getPlatformDependSeparateListShouldReturnThreeCharactersSeparated() {
+        String result = mojoMock.getPlatformDependSeparateList(Arrays.asList("A", "B", "C"));
+        assertThat(result).isEqualTo("A" + File.pathSeparatorChar + "B" + File.pathSeparatorChar + "C");
     }
 
     @Test
-    @DisplayName( "getCommaSeparatedList() should return a single character" )
-    public void getCommaSeparatedListShouldReturnASingleCharacter()
-    {
-        String result = mojoMock.getCommaSeparatedList( Collections.singletonList( "A" ) );
-        assertThat( result ).isEqualTo( "A" );
+    @DisplayName("getCommaSeparatedList() should return a single character")
+    public void getCommaSeparatedListShouldReturnASingleCharacter() {
+        String result = mojoMock.getCommaSeparatedList(Collections.singletonList("A"));
+        assertThat(result).isEqualTo("A");
     }
 
     @Test
-    @DisplayName( "getCommaSeparatedList() should return two characters separated by comma" )
-    public void getCommaSeparatedListShouldReturnTwoCharactersSeparatedByComma()
-    {
-        String result = mojoMock.getCommaSeparatedList( Arrays.asList( "A", "B" ) );
-        assertThat( result ).isEqualTo( "A,B" );
+    @DisplayName("getCommaSeparatedList() should return two characters separated by comma")
+    public void getCommaSeparatedListShouldReturnTwoCharactersSeparatedByComma() {
+        String result = mojoMock.getCommaSeparatedList(Arrays.asList("A", "B"));
+        assertThat(result).isEqualTo("A,B");
     }
-
 }
