New Upstream Release - maven-dependency-analyzer

Ready changes

Summary

Merged new upstream version: 1.13.2 (was: 1.13.0).

Diff

diff --git a/.asf.yaml b/.asf.yaml
index 1f485c3..58bbfcd 100644
--- a/.asf.yaml
+++ b/.asf.yaml
@@ -23,3 +23,14 @@ github:
     - build-management
     - maven-shared
     - maven
+  enabled_merge_buttons:
+    squash: true
+    merge: false
+    rebase: true
+  autolink_jira:
+    - MSHARED
+notifications:
+  commits: commits@maven.apache.org
+  issues: issues@maven.apache.org
+  pullrequests: issues@maven.apache.org
+  jira_options: link label comment
diff --git a/.github/workflows/maven-verify.yml b/.github/workflows/maven-verify.yml
index 0041346..dd80d36 100644
--- a/.github/workflows/maven-verify.yml
+++ b/.github/workflows/maven-verify.yml
@@ -25,5 +25,7 @@ jobs:
     name: Verify
     uses: apache/maven-gh-actions-shared/.github/workflows/maven-verify.yml@v3
     with:
-      maven-matrix: '[ "3.2.5", "3.8.6" ]'
-      ff-maven: "3.8.6"
+      maven-matrix: '[ "3.2.5", "3.9.1" ]'
+      jdk-matrix: '[ "8", "11", "17", "20" ]'
+      ff-maven: '3.9.1'
+      ff-jdk: '17'
diff --git a/README.md b/README.md
index 7771b0c..297ed4f 100644
--- a/README.md
+++ b/README.md
@@ -20,7 +20,7 @@ Contributing to [Apache Maven Dependency Analyzer](https://maven.apache.org/shar
 [![ASF Jira](https://img.shields.io/endpoint?url=https%3A%2F%2Fmaven.apache.org%2Fbadges%2Fasf_jira-MSHARED.json)][jira]
 [![Apache License, Version 2.0, January 2004](https://img.shields.io/github/license/apache/maven.svg?label=License)][license]
 [![Maven Central](https://img.shields.io/maven-central/v/org.apache.maven.shared/maven-dependency-analyzer.svg?label=Maven%20Central)](https://search.maven.org/artifact/org.apache.maven.shared/maven-dependency-analyzer)
-[![Reproducible Builds](https://img.shields.io/badge/Reproducible_Builds-ok-green?labelColor=blue)](https://github.com/jvm-repo-rebuild/reproducible-central#org.apache.maven.shared:maven-dependency-analyzer)
+[![Reproducible Builds](https://img.shields.io/badge/Reproducible_Builds-ok-green?labelColor=blue)](https://github.com/jvm-repo-rebuild/reproducible-central/blob/master/content/org/apache/maven/shared/maven-dependency-analyzer/README.md)
 [![Jenkins Status](https://img.shields.io/jenkins/s/https/ci-maven.apache.org/job/Maven/job/maven-box/job/maven-dependency-analyzer/job/master.svg)][build]
 [![Jenkins tests](https://img.shields.io/jenkins/t/https/ci-maven.apache.org/job/Maven/job/maven-box/job/maven-dependency-analyzer/job/master.svg)][test-results]
 
diff --git a/debian/changelog b/debian/changelog
index ee0b51c..a4fefbb 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+maven-dependency-analyzer (1.13.2-1) UNRELEASED; urgency=low
+
+  * New upstream release.
+
+ -- Debian Janitor <janitor@jelmer.uk>  Fri, 09 Jun 2023 15:43:00 -0000
+
 maven-dependency-analyzer (1.13.0-1) unstable; urgency=medium
 
   * Team upload.
diff --git a/pom.xml b/pom.xml
index b33ae85..36dd41b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,5 +1,5 @@
-<?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
  * distributed with this work for additional information
@@ -24,24 +24,22 @@
   <parent>
     <groupId>org.apache.maven.shared</groupId>
     <artifactId>maven-shared-components</artifactId>
-    <version>37</version>
+    <version>39</version>
     <relativePath />
   </parent>
 
   <artifactId>maven-dependency-analyzer</artifactId>
+  <version>1.13.2</version>
   <packaging>jar</packaging>
-  <version>1.13.0</version>
 
   <name>Apache Maven Dependency Analyzer</name>
-  <description>
-    Analyzes the dependencies of a project for undeclared or unused artifacts.
-  </description>
+  <description>Analyzes the dependencies of a project for undeclared or unused artifacts.</description>
 
   <scm>
     <connection>scm:git:https://gitbox.apache.org/repos/asf/maven-dependency-analyzer.git</connection>
     <developerConnection>scm:git:https://gitbox.apache.org/repos/asf/maven-dependency-analyzer.git</developerConnection>
+    <tag>maven-dependency-analyzer-1.13.2</tag>
     <url>https://github.com/apache/maven-dependency-analyzer/tree/${project.scm.tag}</url>
-    <tag>maven-dependency-analyzer-1.13.0</tag>
   </scm>
   <issueManagement>
     <system>jira</system>
@@ -60,8 +58,11 @@
 
   <properties>
     <mavenVersion>3.2.5</mavenVersion>
+    <slf4jVersion>1.7.36</slf4jVersion>
     <javaVersion>8</javaVersion>
-    <project.build.outputTimestamp>2022-08-20T15:25:20Z</project.build.outputTimestamp>
+    <project.build.outputTimestamp>2023-04-30T22:19:36Z</project.build.outputTimestamp>
+    <!-- TODO check with next parent -->
+    <maven.plugin.tools.version>3.8.1</maven.plugin.tools.version>
   </properties>
 
   <dependencies>
@@ -76,6 +77,11 @@
       <artifactId>maven-artifact</artifactId>
       <version>${mavenVersion}</version>
     </dependency>
+    <dependency>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-model</artifactId>
+      <version>${mavenVersion}</version>
+    </dependency>
 
     <dependency>
       <groupId>javax.inject</groupId>
@@ -83,36 +89,41 @@
       <version>1</version>
     </dependency>
 
-    <dependency>
-      <groupId>org.codehaus.plexus</groupId>
-      <artifactId>plexus-utils</artifactId>
-      <version>3.4.2</version>
-    </dependency>
-
     <dependency>
       <groupId>org.ow2.asm</groupId>
       <artifactId>asm</artifactId>
-      <version>9.3</version>
+      <version>9.5</version>
     </dependency>
 
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+      <version>${slf4jVersion}</version>
+    </dependency>
 
-    <!-- testing support -->
     <dependency>
       <groupId>commons-io</groupId>
       <artifactId>commons-io</artifactId>
       <version>2.11.0</version>
-      <scope>test</scope>
     </dependency>
+
+    <!-- testing support -->
     <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>4.13.2</version>
+      <groupId>org.junit.jupiter</groupId>
+      <artifactId>junit-jupiter-api</artifactId>
+      <version>5.9.3</version>
       <scope>test</scope>
     </dependency>
     <dependency>
       <groupId>org.assertj</groupId>
       <artifactId>assertj-core</artifactId>
-      <version>3.23.1</version>
+      <version>3.24.2</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-simple</artifactId>
+      <version>${slf4jVersion}</version>
       <scope>test</scope>
     </dependency>
   </dependencies>
@@ -123,6 +134,16 @@
         <groupId>org.eclipse.sisu</groupId>
         <artifactId>sisu-maven-plugin</artifactId>
       </plugin>
+      <plugin>
+        <groupId>org.apache.rat</groupId>
+        <artifactId>apache-rat-plugin</artifactId>
+        <configuration>
+          <excludes combine.children="append">
+            <!-- binary class for unit test -->
+            <exclude>**/*.classx</exclude>
+          </excludes>
+        </configuration>
+      </plugin>
     </plugins>
   </build>
 
@@ -134,15 +155,8 @@
           <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-invoker-plugin</artifactId>
-            <executions>
-              <execution>
-                <goals>
-                  <goal>install</goal>
-                  <goal>integration-test</goal>
-                  <goal>verify</goal>
-                </goals>
-              </execution>
-            </executions>
+            <!-- TODO check with next parent -->
+            <version>3.5.1</version>
             <configuration>
               <cloneProjectsTo>${project.build.directory}/it</cloneProjectsTo>
               <localRepositoryPath>target/local-repo</localRepositoryPath>
@@ -157,6 +171,15 @@
                 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
               </properties>
             </configuration>
+            <executions>
+              <execution>
+                <goals>
+                  <goal>install</goal>
+                  <goal>integration-test</goal>
+                  <goal>verify</goal>
+                </goals>
+              </execution>
+            </executions>
           </plugin>
         </plugins>
       </build>
diff --git a/src/it/checkingNameWithTypeReferencesRequired/consumer/pom.xml b/src/it/checkingNameWithTypeReferencesRequired/consumer/pom.xml
new file mode 100644
index 0000000..bd64c28
--- /dev/null
+++ b/src/it/checkingNameWithTypeReferencesRequired/consumer/pom.xml
@@ -0,0 +1,38 @@
+<!--
+  ~ 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.
+  --><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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>example</groupId>
+    <artifactId>root</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+  </parent>
+  <artifactId>consumer</artifactId>
+  <dependencies>
+    <dependency>
+      <groupId>example</groupId>
+      <artifactId>provider</artifactId>
+      <version>0.0.1-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>example</groupId>
+      <artifactId>library</artifactId>
+      <version>0.0.1-SNAPSHOT</version>
+    </dependency>
+  </dependencies>
+</project>
\ No newline at end of file
diff --git a/src/it/checkingNameWithTypeReferencesRequired/consumer/src/main/java/consumer/ActualImplementationClass.java b/src/it/checkingNameWithTypeReferencesRequired/consumer/src/main/java/consumer/ActualImplementationClass.java
new file mode 100644
index 0000000..ffc3671
--- /dev/null
+++ b/src/it/checkingNameWithTypeReferencesRequired/consumer/src/main/java/consumer/ActualImplementationClass.java
@@ -0,0 +1,27 @@
+/*
+ * 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 consumer;
+
+import provider.AbstractBaseClass;
+
+public class ActualImplementationClass extends AbstractBaseClass
+{
+    private void doSomething() {
+        this.getObject();
+    }
+}
diff --git a/src/it/checkingNameWithTypeReferencesRequired/consumer/src/test/java/consumer/ActualImplementationClassTest.java b/src/it/checkingNameWithTypeReferencesRequired/consumer/src/test/java/consumer/ActualImplementationClassTest.java
new file mode 100644
index 0000000..8b3735a
--- /dev/null
+++ b/src/it/checkingNameWithTypeReferencesRequired/consumer/src/test/java/consumer/ActualImplementationClassTest.java
@@ -0,0 +1,27 @@
+/*
+ * 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 consumer;
+
+import library.LibraryObject;
+
+public class ActualImplementationClassTest
+{
+    void someTest() {
+        new LibraryObject();
+    }
+}
diff --git a/src/it/checkingNameWithTypeReferencesRequired/library/pom.xml b/src/it/checkingNameWithTypeReferencesRequired/library/pom.xml
new file mode 100644
index 0000000..3870152
--- /dev/null
+++ b/src/it/checkingNameWithTypeReferencesRequired/library/pom.xml
@@ -0,0 +1,26 @@
+<!--
+  ~ 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.
+  --><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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>example</groupId>
+    <artifactId>root</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+  </parent>
+  <artifactId>library</artifactId>
+</project>
\ No newline at end of file
diff --git a/src/it/checkingNameWithTypeReferencesRequired/library/src/main/java/library/LibraryObject.java b/src/it/checkingNameWithTypeReferencesRequired/library/src/main/java/library/LibraryObject.java
new file mode 100644
index 0000000..a8dd277
--- /dev/null
+++ b/src/it/checkingNameWithTypeReferencesRequired/library/src/main/java/library/LibraryObject.java
@@ -0,0 +1,23 @@
+/*
+ * 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 library;
+
+public class LibraryObject
+{
+
+}
diff --git a/src/it/checkingNameWithTypeReferencesRequired/pom.xml b/src/it/checkingNameWithTypeReferencesRequired/pom.xml
new file mode 100644
index 0000000..63f9376
--- /dev/null
+++ b/src/it/checkingNameWithTypeReferencesRequired/pom.xml
@@ -0,0 +1,53 @@
+<!--
+  ~ 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.
+  -->
+<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>example</groupId>
+  <artifactId>root</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>pom</packaging>
+  
+  <properties>
+    <maven.compiler.target>1.8</maven.compiler.target>
+    <maven.compiler.source>1.8</maven.compiler.source>
+  </properties>
+  
+  <modules>
+    <module>consumer</module>
+    <module>provider</module>
+    <module>library</module>
+  </modules>
+  
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.shared.dependency-analyzer.tests</groupId>
+        <artifactId>maven-mock-plugin</artifactId>
+        <version>1.0</version>
+        <executions>
+          <execution>
+            <goals>
+              <goal>mock-analyze</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+</project>
\ No newline at end of file
diff --git a/src/it/checkingNameWithTypeReferencesRequired/provider/pom.xml b/src/it/checkingNameWithTypeReferencesRequired/provider/pom.xml
new file mode 100644
index 0000000..6bb550a
--- /dev/null
+++ b/src/it/checkingNameWithTypeReferencesRequired/provider/pom.xml
@@ -0,0 +1,33 @@
+<!--
+  ~ 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.
+  --><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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>example</groupId>
+    <artifactId>root</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+  </parent>
+  <artifactId>provider</artifactId>
+  <dependencies>
+    <dependency>
+      <groupId>example</groupId>
+      <artifactId>library</artifactId>
+      <version>0.0.1-SNAPSHOT</version>
+    </dependency>
+  </dependencies>
+</project>
\ No newline at end of file
diff --git a/src/it/checkingNameWithTypeReferencesRequired/provider/src/main/java/provider/AbstractBaseClass.java b/src/it/checkingNameWithTypeReferencesRequired/provider/src/main/java/provider/AbstractBaseClass.java
new file mode 100644
index 0000000..62e307e
--- /dev/null
+++ b/src/it/checkingNameWithTypeReferencesRequired/provider/src/main/java/provider/AbstractBaseClass.java
@@ -0,0 +1,27 @@
+/*
+ * 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 provider;
+
+import library.LibraryObject;
+
+public abstract class AbstractBaseClass
+{
+    protected LibraryObject getObject() {
+        return new LibraryObject();
+    }
+}
diff --git a/src/it/checkingNameWithTypeReferencesRequired/verify.groovy b/src/it/checkingNameWithTypeReferencesRequired/verify.groovy
new file mode 100644
index 0000000..0a0f57e
--- /dev/null
+++ b/src/it/checkingNameWithTypeReferencesRequired/verify.groovy
@@ -0,0 +1,34 @@
+/*
+ * 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.
+ */
+
+def analysis = new File( basedir, 'consumer/target/analysis.txt' ).text
+
+def expected = '''
+UsedDeclaredArtifacts:
+ example:provider:jar:0.0.1-SNAPSHOT:compile
+ example:library:jar:0.0.1-SNAPSHOT:compile
+
+UsedUndeclaredArtifactsWithClasses:
+
+UnusedDeclaredArtifacts:
+
+TestArtifactsWithNonTestScope:
+'''
+
+assert analysis == expected
diff --git a/src/main/java/org/apache/maven/shared/dependency/analyzer/ClassAnalyzer.java b/src/main/java/org/apache/maven/shared/dependency/analyzer/ClassAnalyzer.java
index 0ba08df..679b4d6 100644
--- a/src/main/java/org/apache/maven/shared/dependency/analyzer/ClassAnalyzer.java
+++ b/src/main/java/org/apache/maven/shared/dependency/analyzer/ClassAnalyzer.java
@@ -1,5 +1,3 @@
-package org.apache.maven.shared.dependency.analyzer;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@ package org.apache.maven.shared.dependency.analyzer;
  * "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
+ *   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
@@ -18,6 +16,7 @@ package org.apache.maven.shared.dependency.analyzer;
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.shared.dependency.analyzer;
 
 import java.io.IOException;
 import java.net.URL;
@@ -28,8 +27,7 @@ import java.util.Set;
  *
  * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
  */
-public interface ClassAnalyzer
-{
+public interface ClassAnalyzer {
 
     /**
      * <p>analyze.</p>
@@ -38,6 +36,5 @@ public interface ClassAnalyzer
      * @return a {@link java.util.Set} object
      * @throws java.io.IOException if any
      */
-    Set<String> analyze( URL url )
-        throws IOException;
+    Set<String> analyze(URL url) throws IOException;
 }
diff --git a/src/main/java/org/apache/maven/shared/dependency/analyzer/ClassFileVisitor.java b/src/main/java/org/apache/maven/shared/dependency/analyzer/ClassFileVisitor.java
index ffa87d5..27d1d1b 100644
--- a/src/main/java/org/apache/maven/shared/dependency/analyzer/ClassFileVisitor.java
+++ b/src/main/java/org/apache/maven/shared/dependency/analyzer/ClassFileVisitor.java
@@ -1,5 +1,3 @@
-package org.apache.maven.shared.dependency.analyzer;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@ package org.apache.maven.shared.dependency.analyzer;
  * "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
+ *   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
@@ -18,6 +16,7 @@ package org.apache.maven.shared.dependency.analyzer;
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.shared.dependency.analyzer;
 
 import java.io.InputStream;
 
@@ -26,13 +25,12 @@ import java.io.InputStream;
  *
  * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
  */
-public interface ClassFileVisitor
-{
+public interface ClassFileVisitor {
     /**
      * <p>visitClass.</p>
      *
      * @param className a {@link java.lang.String} object.
      * @param in a {@link java.io.InputStream} object.
      */
-    void visitClass( String className, InputStream in );
+    void visitClass(String className, InputStream in);
 }
diff --git a/src/main/java/org/apache/maven/shared/dependency/analyzer/ClassFileVisitorUtils.java b/src/main/java/org/apache/maven/shared/dependency/analyzer/ClassFileVisitorUtils.java
index 412b02a..b2211c3 100644
--- a/src/main/java/org/apache/maven/shared/dependency/analyzer/ClassFileVisitorUtils.java
+++ b/src/main/java/org/apache/maven/shared/dependency/analyzer/ClassFileVisitorUtils.java
@@ -1,5 +1,3 @@
-package org.apache.maven.shared.dependency.analyzer;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@ package org.apache.maven.shared.dependency.analyzer;
  * "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
+ *   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
@@ -18,134 +16,107 @@ package org.apache.maven.shared.dependency.analyzer;
  * specific language governing permissions and limitations
  * under the License.
  */
-
-import org.codehaus.plexus.util.DirectoryScanner;
+package org.apache.maven.shared.dependency.analyzer;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.net.URL;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.List;
 import java.util.jar.JarEntry;
 import java.util.jar.JarInputStream;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * Utility to visit classes in a library given either as a jar file or an exploded directory.
  *
  * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
  */
-public final class ClassFileVisitorUtils
-{
+public final class ClassFileVisitorUtils {
 
-    private ClassFileVisitorUtils()
-    {
+    private ClassFileVisitorUtils() {
         // private constructor for utility class
     }
 
     /**
-     * <p>accept.</p>
-     *
-     * @param url a {@link java.net.URL} object.
-     * @param visitor a {@link org.apache.maven.shared.dependency.analyzer.ClassFileVisitor} object.
-     * @throws java.io.IOException if any.
+     * @param url     a {@link java.net.URL} object
+     * @param visitor a {@link org.apache.maven.shared.dependency.analyzer.ClassFileVisitor} object
+     * @throws java.io.IOException if any
      */
-    public static void accept( URL url, ClassFileVisitor visitor )
-        throws IOException
-    {
-        if ( url.getPath().endsWith( ".jar" ) )
-        {
-            acceptJar( url, visitor );
-        }
-        else if ( url.getProtocol().equalsIgnoreCase( "file" ) )
-        {
-            try
-            {
-                File file = new File( new URI( url.toString() ) );
-
-                if ( file.isDirectory() )
-                {
-                    acceptDirectory( file, visitor );
-                }
-                else if ( file.exists() )
-                {
-                    throw new IllegalArgumentException( "Cannot accept visitor on URL: " + url );
+    public static void accept(URL url, ClassFileVisitor visitor) throws IOException {
+        if (url.getPath().endsWith(".jar")) {
+            acceptJar(url, visitor);
+        } else if (url.getProtocol().equalsIgnoreCase("file")) {
+            try {
+                File file = new File(new URI(url.toString()));
+
+                if (file.isDirectory()) {
+                    acceptDirectory(file, visitor);
+                } else if (file.exists()) {
+                    throw new IllegalArgumentException("Cannot accept visitor on URL: " + url);
                 }
+            } catch (URISyntaxException exception) {
+                throw new IllegalArgumentException("Cannot accept visitor on URL: " + url, exception);
             }
-            catch ( URISyntaxException exception )
-            {
-                throw new IllegalArgumentException( "Cannot accept visitor on URL: " + url,
-                        exception );
-            }
-        }
-        else
-        {
-            throw new IllegalArgumentException( "Cannot accept visitor on URL: " + url );
+        } else {
+            throw new IllegalArgumentException("Cannot accept visitor on URL: " + url);
         }
     }
 
     // private methods --------------------------------------------------------
 
-    private static void acceptJar( URL url, ClassFileVisitor visitor )
-        throws IOException
-    {
-        try ( JarInputStream in = new JarInputStream( url.openStream() ) )
-        {
+    private static void acceptJar(URL url, ClassFileVisitor visitor) throws IOException {
+        try (JarInputStream in = new JarInputStream(url.openStream())) {
             JarEntry entry;
-            while ( ( entry = in.getNextJarEntry() ) != null )
-            {
+            while ((entry = in.getNextJarEntry()) != null) {
                 String name = entry.getName();
                 // ignore files like package-info.class and module-info.class
-                if ( name.endsWith( ".class" ) && name.indexOf( '-' ) == -1 )
-                {
-                    visitClass( name, in, visitor );
+                if (name.endsWith(".class") && name.indexOf('-') == -1) {
+                    // Jars(ZIP) always use / as the separator character
+                    visitClass(name, in, visitor, '/');
                 }
             }
         }
     }
 
-    private static void acceptDirectory( File directory, ClassFileVisitor visitor )
-        throws IOException
-    {
-        if ( !directory.isDirectory() )
-        {
-            throw new IllegalArgumentException( "File is not a directory" );
-        }
+    private static void acceptDirectory(File directory, ClassFileVisitor visitor) throws IOException {
 
-        DirectoryScanner scanner = new DirectoryScanner();
-
-        scanner.setBasedir( directory );
-        scanner.setIncludes( new String[] { "**/*.class" } );
-
-        scanner.scan();
-
-        String[] paths = scanner.getIncludedFiles();
-
-        for ( String path : paths )
-        {
-            path = path.replace( File.separatorChar, '/' );
-
-            File file = new File( directory, path );
+        List<Path> classFiles;
+        try (Stream<Path> walk = Files.walk(directory.toPath())) {
+            classFiles = walk.filter(path -> path.getFileName().toString().endsWith(".class"))
+                    .collect(Collectors.toList());
+        }
 
-            try ( InputStream in = new FileInputStream( file ) )
-            {
-                visitClass( path, in, visitor );
+        for (Path path : classFiles) {
+            try (InputStream in = Files.newInputStream(path)) {
+                try {
+                    visitClass(directory, path, in, visitor);
+                } catch (RuntimeException e) {
+                    // visitClass throws RuntimeException
+                    throw new RuntimeException(
+                            String.format("%s from directory = %s, path = %s", e.getMessage(), directory, path), e);
+                }
             }
         }
     }
 
-    private static void visitClass( String path, InputStream in, ClassFileVisitor visitor )
-    {
-        if ( !path.endsWith( ".class" ) )
-        {
-            throw new IllegalArgumentException( "Path is not a class" );
-        }
+    private static void visitClass(File baseDirectory, Path path, InputStream in, ClassFileVisitor visitor) {
+        // getPath() returns a String, not a java.nio.file.Path
+        String stringPath =
+                path.toFile().getPath().substring(baseDirectory.getPath().length() + 1);
+        visitClass(stringPath, in, visitor, File.separatorChar);
+    }
 
-        String className = path.substring( 0, path.length() - 6 );
+    private static void visitClass(String stringPath, InputStream in, ClassFileVisitor visitor, char separator) {
+        String className = stringPath.substring(0, stringPath.length() - 6);
 
-        className = className.replace( '/', '.' );
+        className = className.replace(separator, '.');
 
-        visitor.visitClass( className, in );
+        visitor.visitClass(className, in);
     }
 }
diff --git a/src/main/java/org/apache/maven/shared/dependency/analyzer/CollectorClassFileVisitor.java b/src/main/java/org/apache/maven/shared/dependency/analyzer/CollectorClassFileVisitor.java
index d9226a8..bdbd3c7 100644
--- a/src/main/java/org/apache/maven/shared/dependency/analyzer/CollectorClassFileVisitor.java
+++ b/src/main/java/org/apache/maven/shared/dependency/analyzer/CollectorClassFileVisitor.java
@@ -1,5 +1,3 @@
-package org.apache.maven.shared.dependency.analyzer;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@ package org.apache.maven.shared.dependency.analyzer;
  * "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
+ *   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
@@ -18,6 +16,7 @@ package org.apache.maven.shared.dependency.analyzer;
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.shared.dependency.analyzer;
 
 import java.io.InputStream;
 import java.util.HashSet;
@@ -29,26 +28,21 @@ import java.util.Set;
  * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
  * @see #getClasses()
  */
-public class CollectorClassFileVisitor
-    implements ClassFileVisitor
-{
+public class CollectorClassFileVisitor implements ClassFileVisitor {
     private final Set<String> classes;
 
     /**
      * <p>Constructor for CollectorClassFileVisitor.</p>
      */
-    public CollectorClassFileVisitor()
-    {
+    public CollectorClassFileVisitor() {
         classes = new HashSet<>();
     }
 
     /** {@inheritDoc} */
-    public void visitClass( String className, InputStream in )
-    {
+    public void visitClass(String className, InputStream in) {
         // inner classes have equivalent compilation requirement as container class
-        if ( className.indexOf( '$' ) < 0 )
-        {
-            classes.add( className );
+        if (className.indexOf('$') < 0) {
+            classes.add(className);
         }
     }
 
@@ -57,8 +51,7 @@ public class CollectorClassFileVisitor
      *
      * @return a {@link java.util.Set} object.
      */
-    public Set<String> getClasses()
-    {
+    public Set<String> getClasses() {
         return classes;
     }
 }
diff --git a/src/main/java/org/apache/maven/shared/dependency/analyzer/DefaultClassAnalyzer.java b/src/main/java/org/apache/maven/shared/dependency/analyzer/DefaultClassAnalyzer.java
index 6a79d4d..21e7afa 100644
--- a/src/main/java/org/apache/maven/shared/dependency/analyzer/DefaultClassAnalyzer.java
+++ b/src/main/java/org/apache/maven/shared/dependency/analyzer/DefaultClassAnalyzer.java
@@ -1,5 +1,3 @@
-package org.apache.maven.shared.dependency.analyzer;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@ package org.apache.maven.shared.dependency.analyzer;
  * "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
+ *   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
@@ -18,6 +16,7 @@ package org.apache.maven.shared.dependency.analyzer;
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.shared.dependency.analyzer;
 
 import javax.inject.Named;
 import javax.inject.Singleton;
@@ -34,27 +33,19 @@ import java.util.zip.ZipException;
  */
 @Named
 @Singleton
-public class DefaultClassAnalyzer
-    implements ClassAnalyzer
-{
+public class DefaultClassAnalyzer implements ClassAnalyzer {
 
     /** {@inheritDoc} */
-    public Set<String> analyze( URL url )
-        throws IOException
-    {
+    public Set<String> analyze(URL url) throws IOException {
         CollectorClassFileVisitor visitor = new CollectorClassFileVisitor();
 
-        try
-        {
-            ClassFileVisitorUtils.accept( url, visitor );
-        }
-        catch ( ZipException e )
-        {
+        try {
+            ClassFileVisitorUtils.accept(url, visitor);
+        } catch (ZipException e) {
             // since the current ZipException gives no indication what jar file is corrupted
             // we prefer to wrap another ZipException for better error visibility
-            ZipException ze =
-                new ZipException( "Cannot process Jar entry on URL: " + url + " due to " + e.getMessage() );
-            ze.initCause( e );
+            ZipException ze = new ZipException("Cannot process Jar entry on URL: " + url + " due to " + e.getMessage());
+            ze.initCause(e);
             throw ze;
         }
 
diff --git a/src/main/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzer.java b/src/main/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzer.java
index 6115334..4578842 100644
--- a/src/main/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzer.java
+++ b/src/main/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzer.java
@@ -1,5 +1,3 @@
-package org.apache.maven.shared.dependency.analyzer;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@ package org.apache.maven.shared.dependency.analyzer;
  * "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
+ *   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
@@ -18,6 +16,7 @@ package org.apache.maven.shared.dependency.analyzer;
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.shared.dependency.analyzer;
 
 import javax.inject.Inject;
 import javax.inject.Named;
@@ -47,9 +46,7 @@ import org.apache.maven.project.MavenProject;
  */
 @Named
 @Singleton
-public class DefaultProjectDependencyAnalyzer
-    implements ProjectDependencyAnalyzer
-{
+public class DefaultProjectDependencyAnalyzer implements ProjectDependencyAnalyzer {
     /**
      * ClassAnalyzer
      */
@@ -63,49 +60,47 @@ public class DefaultProjectDependencyAnalyzer
     private DependencyAnalyzer dependencyAnalyzer;
 
     /** {@inheritDoc} */
-    public ProjectDependencyAnalysis analyze( MavenProject project )
-        throws ProjectDependencyAnalyzerException
-    {
-        try
-        {
-            Map<Artifact, Set<String>> artifactClassMap = buildArtifactClassMap( project );
+    public ProjectDependencyAnalysis analyze(MavenProject project) throws ProjectDependencyAnalyzerException {
+        try {
+            Map<Artifact, Set<String>> artifactClassMap = buildArtifactClassMap(project);
 
-            Set<String> mainDependencyClasses = buildMainDependencyClasses( project );
-            Set<String> testDependencyClasses = buildTestDependencyClasses( project );
+            Set<String> mainDependencyClasses = buildMainDependencyClasses(project);
+            Set<String> testDependencyClasses = buildTestDependencyClasses(project);
 
             Set<String> dependencyClasses = new HashSet<>();
-            dependencyClasses.addAll( mainDependencyClasses );
-            dependencyClasses.addAll( testDependencyClasses );
+            dependencyClasses.addAll(mainDependencyClasses);
+            dependencyClasses.addAll(testDependencyClasses);
 
-            Set<String> testOnlyDependencyClasses = buildTestOnlyDependencyClasses( mainDependencyClasses,
-                                                                                    testDependencyClasses );
+            Set<String> testOnlyDependencyClasses =
+                    buildTestOnlyDependencyClasses(mainDependencyClasses, testDependencyClasses);
 
-            Map<Artifact, Set<String>> usedArtifacts = buildUsedArtifacts( artifactClassMap, dependencyClasses );
-            Set<Artifact> mainUsedArtifacts = buildUsedArtifacts( artifactClassMap, mainDependencyClasses ).keySet();
+            Map<Artifact, Set<String>> usedArtifacts = buildUsedArtifacts(artifactClassMap, dependencyClasses);
+            Set<Artifact> mainUsedArtifacts =
+                    buildUsedArtifacts(artifactClassMap, mainDependencyClasses).keySet();
 
-            Set<Artifact> testArtifacts = buildUsedArtifacts( artifactClassMap, testOnlyDependencyClasses ).keySet();
-            Set<Artifact> testOnlyArtifacts = removeAll( testArtifacts, mainUsedArtifacts );
+            Set<Artifact> testArtifacts = buildUsedArtifacts(artifactClassMap, testOnlyDependencyClasses)
+                    .keySet();
+            Set<Artifact> testOnlyArtifacts = removeAll(testArtifacts, mainUsedArtifacts);
 
-            Set<Artifact> declaredArtifacts = buildDeclaredArtifacts( project );
-            Set<Artifact> usedDeclaredArtifacts = new LinkedHashSet<>( declaredArtifacts );
-            usedDeclaredArtifacts.retainAll( usedArtifacts.keySet() );
+            Set<Artifact> declaredArtifacts = buildDeclaredArtifacts(project);
+            Set<Artifact> usedDeclaredArtifacts = new LinkedHashSet<>(declaredArtifacts);
+            usedDeclaredArtifacts.retainAll(usedArtifacts.keySet());
 
-            Map<Artifact, Set<String>> usedUndeclaredArtifactsWithClasses = new LinkedHashMap<>( usedArtifacts );
-            Set<Artifact> usedUndeclaredArtifacts = removeAll(
-                usedUndeclaredArtifactsWithClasses.keySet(), declaredArtifacts );
-            usedUndeclaredArtifactsWithClasses.keySet().retainAll( usedUndeclaredArtifacts );
+            Map<Artifact, Set<String>> usedUndeclaredArtifactsWithClasses = new LinkedHashMap<>(usedArtifacts);
+            Set<Artifact> usedUndeclaredArtifacts =
+                    removeAll(usedUndeclaredArtifactsWithClasses.keySet(), declaredArtifacts);
+            usedUndeclaredArtifactsWithClasses.keySet().retainAll(usedUndeclaredArtifacts);
 
-            Set<Artifact> unusedDeclaredArtifacts = new LinkedHashSet<>( declaredArtifacts );
-            unusedDeclaredArtifacts = removeAll( unusedDeclaredArtifacts, usedArtifacts.keySet() );
+            Set<Artifact> unusedDeclaredArtifacts = new LinkedHashSet<>(declaredArtifacts);
+            unusedDeclaredArtifacts = removeAll(unusedDeclaredArtifacts, usedArtifacts.keySet());
 
-            Set<Artifact> testArtifactsWithNonTestScope = getTestArtifactsWithNonTestScope( testOnlyArtifacts );
+            Set<Artifact> testArtifactsWithNonTestScope = getTestArtifactsWithNonTestScope(testOnlyArtifacts);
 
-            return new ProjectDependencyAnalysis( usedDeclaredArtifacts, usedUndeclaredArtifactsWithClasses,
-                                                  unusedDeclaredArtifacts, testArtifactsWithNonTestScope );
-        }
-        catch ( IOException exception )
-        {
-            throw new ProjectDependencyAnalyzerException( "Cannot analyze dependencies", exception );
+            return new ProjectDependencyAnalysis(
+                    usedDeclaredArtifacts, usedUndeclaredArtifactsWithClasses,
+                    unusedDeclaredArtifacts, testArtifactsWithNonTestScope);
+        } catch (IOException exception) {
+            throw new ProjectDependencyAnalyzerException("Cannot analyze dependencies", exception);
         }
     }
 
@@ -117,166 +112,133 @@ public class DefaultProjectDependencyAnalyzer
      * @param remove set to exclude
      * @return set with remove excluded
      */
-    private static Set<Artifact> removeAll( Set<Artifact> start, Set<Artifact> remove )
-    {
-        Set<Artifact> results = new LinkedHashSet<>( start.size() );
+    private static Set<Artifact> removeAll(Set<Artifact> start, Set<Artifact> remove) {
+        Set<Artifact> results = new LinkedHashSet<>(start.size());
 
-        for ( Artifact artifact : start )
-        {
+        for (Artifact artifact : start) {
             boolean found = false;
 
-            for ( Artifact artifact2 : remove )
-            {
-                if ( artifact.getDependencyConflictId().equals( artifact2.getDependencyConflictId() ) )
-                {
+            for (Artifact artifact2 : remove) {
+                if (artifact.getDependencyConflictId().equals(artifact2.getDependencyConflictId())) {
                     found = true;
                     break;
                 }
             }
 
-            if ( !found )
-            {
-                results.add( artifact );
+            if (!found) {
+                results.add(artifact);
             }
         }
 
         return results;
     }
 
-    private static Set<Artifact> getTestArtifactsWithNonTestScope( Set<Artifact> testOnlyArtifacts )
-    {
+    private static Set<Artifact> getTestArtifactsWithNonTestScope(Set<Artifact> testOnlyArtifacts) {
         Set<Artifact> nonTestScopeArtifacts = new LinkedHashSet<>();
 
-        for ( Artifact artifact : testOnlyArtifacts )
-        {
-            if ( artifact.getScope().equals( "compile" ) )
-            {
-                nonTestScopeArtifacts.add( artifact );
+        for (Artifact artifact : testOnlyArtifacts) {
+            if (artifact.getScope().equals("compile")) {
+                nonTestScopeArtifacts.add(artifact);
             }
         }
 
         return nonTestScopeArtifacts;
     }
 
-    private Map<Artifact, Set<String>> buildArtifactClassMap( MavenProject project )
-        throws IOException
-    {
+    private Map<Artifact, Set<String>> buildArtifactClassMap(MavenProject project) throws IOException {
         Map<Artifact, Set<String>> artifactClassMap = new LinkedHashMap<>();
 
         Set<Artifact> dependencyArtifacts = project.getArtifacts();
 
-        for ( Artifact artifact : dependencyArtifacts )
-        {
+        for (Artifact artifact : dependencyArtifacts) {
             File file = artifact.getFile();
 
-            if ( file != null && file.getName().endsWith( ".jar" ) )
-            {
+            if (file != null && file.getName().endsWith(".jar")) {
                 // optimized solution for the jar case
 
-                try ( JarFile jarFile = new JarFile( file ) )
-                {
+                try (JarFile jarFile = new JarFile(file)) {
                     Enumeration<JarEntry> jarEntries = jarFile.entries();
 
                     Set<String> classes = new HashSet<>();
 
-                    while ( jarEntries.hasMoreElements() )
-                    {
+                    while (jarEntries.hasMoreElements()) {
                         String entry = jarEntries.nextElement().getName();
-                        if ( entry.endsWith( ".class" ) )
-                        {
-                            String className = entry.replace( '/', '.' );
-                            className = className.substring( 0, className.length() - ".class".length() );
-                            classes.add( className );
+                        if (entry.endsWith(".class")) {
+                            String className = entry.replace('/', '.');
+                            className = className.substring(0, className.length() - ".class".length());
+                            classes.add(className);
                         }
                     }
 
-                    artifactClassMap.put( artifact, classes );
+                    artifactClassMap.put(artifact, classes);
                 }
-            }
-            else if ( file != null && file.isDirectory() )
-            {
+            } else if (file != null && file.isDirectory()) {
                 URL url = file.toURI().toURL();
-                Set<String> classes = classAnalyzer.analyze( url );
+                Set<String> classes = classAnalyzer.analyze(url);
 
-                artifactClassMap.put( artifact, classes );
+                artifactClassMap.put(artifact, classes);
             }
         }
 
         return artifactClassMap;
     }
 
-    private static Set<String> buildTestOnlyDependencyClasses( Set<String> mainDependencyClasses,
-                                                               Set<String> testDependencyClasses )
-    {
-        Set<String> testOnlyDependencyClasses = new HashSet<>( testDependencyClasses );
-        testOnlyDependencyClasses.removeAll( mainDependencyClasses );
+    private static Set<String> buildTestOnlyDependencyClasses(
+            Set<String> mainDependencyClasses, Set<String> testDependencyClasses) {
+        Set<String> testOnlyDependencyClasses = new HashSet<>(testDependencyClasses);
+        testOnlyDependencyClasses.removeAll(mainDependencyClasses);
         return testOnlyDependencyClasses;
     }
 
-    private Set<String> buildMainDependencyClasses( MavenProject project )
-        throws IOException
-    {
+    private Set<String> buildMainDependencyClasses(MavenProject project) throws IOException {
         String outputDirectory = project.getBuild().getOutputDirectory();
-        return buildDependencyClasses( outputDirectory );
+        return buildDependencyClasses(outputDirectory);
     }
 
-    private Set<String> buildTestDependencyClasses( MavenProject project )
-        throws IOException
-    {
+    private Set<String> buildTestDependencyClasses(MavenProject project) throws IOException {
         String testOutputDirectory = project.getBuild().getTestOutputDirectory();
-        return buildDependencyClasses( testOutputDirectory );
+        return buildDependencyClasses(testOutputDirectory);
     }
 
-    private Set<String> buildDependencyClasses( String path )
-        throws IOException
-    {
-        URL url = new File( path ).toURI().toURL();
+    private Set<String> buildDependencyClasses(String path) throws IOException {
+        URL url = new File(path).toURI().toURL();
 
-        return dependencyAnalyzer.analyze( url );
+        return dependencyAnalyzer.analyze(url);
     }
 
-    private static Set<Artifact> buildDeclaredArtifacts( MavenProject project )
-    {
+    private static Set<Artifact> buildDeclaredArtifacts(MavenProject project) {
         Set<Artifact> declaredArtifacts = project.getDependencyArtifacts();
 
-        if ( declaredArtifacts == null )
-        {
+        if (declaredArtifacts == null) {
             declaredArtifacts = Collections.emptySet();
         }
 
         return declaredArtifacts;
     }
 
-    private static Map<Artifact, Set<String>> buildUsedArtifacts( Map<Artifact, Set<String>> artifactClassMap,
-                                                                  Set<String> dependencyClasses )
-    {
+    private static Map<Artifact, Set<String>> buildUsedArtifacts(
+            Map<Artifact, Set<String>> artifactClassMap, Set<String> dependencyClasses) {
         Map<Artifact, Set<String>> usedArtifacts = new HashMap<>();
 
-        for ( String className : dependencyClasses )
-        {
-            Artifact artifact = findArtifactForClassName( artifactClassMap, className );
+        for (String className : dependencyClasses) {
+            Artifact artifact = findArtifactForClassName(artifactClassMap, className);
 
-            if ( artifact != null )
-            {
-                Set<String> classesFromArtifact = usedArtifacts.get( artifact );
-                if ( classesFromArtifact == null )
-                {
+            if (artifact != null) {
+                Set<String> classesFromArtifact = usedArtifacts.get(artifact);
+                if (classesFromArtifact == null) {
                     classesFromArtifact = new HashSet<String>();
-                    usedArtifacts.put( artifact, classesFromArtifact );
+                    usedArtifacts.put(artifact, classesFromArtifact);
                 }
-                classesFromArtifact.add( className );
+                classesFromArtifact.add(className);
             }
         }
 
         return usedArtifacts;
     }
 
-    private static Artifact findArtifactForClassName( Map<Artifact, Set<String>> artifactClassMap, String className )
-    {
-        for ( Map.Entry<Artifact, Set<String>> entry : artifactClassMap.entrySet() )
-        {
-            if ( entry.getValue().contains( className ) )
-            {
+    private static Artifact findArtifactForClassName(Map<Artifact, Set<String>> artifactClassMap, String className) {
+        for (Map.Entry<Artifact, Set<String>> entry : artifactClassMap.entrySet()) {
+            if (entry.getValue().contains(className)) {
                 return entry.getKey();
             }
         }
diff --git a/src/main/java/org/apache/maven/shared/dependency/analyzer/DependencyAnalyzer.java b/src/main/java/org/apache/maven/shared/dependency/analyzer/DependencyAnalyzer.java
index aed1fb0..d366c6b 100644
--- a/src/main/java/org/apache/maven/shared/dependency/analyzer/DependencyAnalyzer.java
+++ b/src/main/java/org/apache/maven/shared/dependency/analyzer/DependencyAnalyzer.java
@@ -1,5 +1,3 @@
-package org.apache.maven.shared.dependency.analyzer;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@ package org.apache.maven.shared.dependency.analyzer;
  * "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
+ *   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
@@ -18,6 +16,7 @@ package org.apache.maven.shared.dependency.analyzer;
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.shared.dependency.analyzer;
 
 import java.io.IOException;
 import java.net.URL;
@@ -28,8 +27,7 @@ import java.util.Set;
  *
  * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
  */
-public interface DependencyAnalyzer
-{
+public interface DependencyAnalyzer {
 
     /**
      * <p>analyze.</p>
@@ -38,6 +36,5 @@ public interface DependencyAnalyzer
      * @return the set of class names referenced by the library
      * @throws IOException if an error occurs reading a JAR or .class file
      */
-    Set<String> analyze( URL url )
-        throws IOException;
+    Set<String> analyze(URL url) throws IOException;
 }
diff --git a/src/main/java/org/apache/maven/shared/dependency/analyzer/ProjectDependencyAnalysis.java b/src/main/java/org/apache/maven/shared/dependency/analyzer/ProjectDependencyAnalysis.java
index 0be4ffd..dd4f540 100644
--- a/src/main/java/org/apache/maven/shared/dependency/analyzer/ProjectDependencyAnalysis.java
+++ b/src/main/java/org/apache/maven/shared/dependency/analyzer/ProjectDependencyAnalysis.java
@@ -1,5 +1,3 @@
-package org.apache.maven.shared.dependency.analyzer;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@ package org.apache.maven.shared.dependency.analyzer;
  * "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
+ *   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
@@ -18,6 +16,7 @@ package org.apache.maven.shared.dependency.analyzer;
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.shared.dependency.analyzer;
 
 import java.util.Arrays;
 import java.util.Collections;
@@ -35,8 +34,7 @@ import org.apache.maven.artifact.Artifact;
  *
  * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
  */
-public class ProjectDependencyAnalysis
-{
+public class ProjectDependencyAnalysis {
     // fields -----------------------------------------------------------------
 
     private final Set<Artifact> usedDeclaredArtifacts;
@@ -50,9 +48,8 @@ public class ProjectDependencyAnalysis
     /**
      * <p>Constructor for ProjectDependencyAnalysis.</p>
      */
-    public ProjectDependencyAnalysis()
-    {
-        this( null, (Map<Artifact, Set<String>>) null, null, null );
+    public ProjectDependencyAnalysis() {
+        this(null, (Map<Artifact, Set<String>>) null, null, null);
     }
 
     /**
@@ -62,11 +59,11 @@ public class ProjectDependencyAnalysis
      * @param usedUndeclaredArtifacts artifacts used but not declared
      * @param unusedDeclaredArtifacts artifacts declared but not used
      */
-    public ProjectDependencyAnalysis( Set<Artifact> usedDeclaredArtifacts, Set<Artifact> usedUndeclaredArtifacts,
-                                      Set<Artifact> unusedDeclaredArtifacts )
-    {
-        this( usedDeclaredArtifacts, usedUndeclaredArtifacts,
-                unusedDeclaredArtifacts, Collections.<Artifact>emptySet() );
+    public ProjectDependencyAnalysis(
+            Set<Artifact> usedDeclaredArtifacts,
+            Set<Artifact> usedUndeclaredArtifacts,
+            Set<Artifact> unusedDeclaredArtifacts) {
+        this(usedDeclaredArtifacts, usedUndeclaredArtifacts, unusedDeclaredArtifacts, Collections.<Artifact>emptySet());
     }
 
     /**
@@ -77,25 +74,27 @@ public class ProjectDependencyAnalysis
      * @param unusedDeclaredArtifacts artifacts declared but not used
      * @param testArtifactsWithNonTestScope artifacts only used in tests but not declared with test scope
      */
-    public ProjectDependencyAnalysis( Set<Artifact> usedDeclaredArtifacts, Set<Artifact> usedUndeclaredArtifacts,
-                                      Set<Artifact> unusedDeclaredArtifacts,
-                                      Set<Artifact> testArtifactsWithNonTestScope )
-    {
-        this( usedDeclaredArtifacts,
-                mapWithKeys( usedUndeclaredArtifacts ),
+    public ProjectDependencyAnalysis(
+            Set<Artifact> usedDeclaredArtifacts,
+            Set<Artifact> usedUndeclaredArtifacts,
+            Set<Artifact> unusedDeclaredArtifacts,
+            Set<Artifact> testArtifactsWithNonTestScope) {
+        this(
+                usedDeclaredArtifacts,
+                mapWithKeys(usedUndeclaredArtifacts),
                 unusedDeclaredArtifacts,
-                testArtifactsWithNonTestScope );
+                testArtifactsWithNonTestScope);
     }
 
-    public ProjectDependencyAnalysis( Set<Artifact> usedDeclaredArtifacts,
+    public ProjectDependencyAnalysis(
+            Set<Artifact> usedDeclaredArtifacts,
             Map<Artifact, Set<String>> usedUndeclaredArtifacts,
             Set<Artifact> unusedDeclaredArtifacts,
-            Set<Artifact> testArtifactsWithNonTestScope )
-    {
-        this.usedDeclaredArtifacts = safeCopy( usedDeclaredArtifacts );
-        this.usedUndeclaredArtifacts = safeCopy( usedUndeclaredArtifacts );
-        this.unusedDeclaredArtifacts = safeCopy( unusedDeclaredArtifacts );
-        this.testArtifactsWithNonTestScope = safeCopy( testArtifactsWithNonTestScope );
+            Set<Artifact> testArtifactsWithNonTestScope) {
+        this.usedDeclaredArtifacts = safeCopy(usedDeclaredArtifacts);
+        this.usedUndeclaredArtifacts = safeCopy(usedUndeclaredArtifacts);
+        this.unusedDeclaredArtifacts = safeCopy(unusedDeclaredArtifacts);
+        this.testArtifactsWithNonTestScope = safeCopy(testArtifactsWithNonTestScope);
     }
 
     /**
@@ -103,9 +102,8 @@ public class ProjectDependencyAnalysis
      *
      * @return artifacts both used and declared
      */
-    public Set<Artifact> getUsedDeclaredArtifacts()
-    {
-        return safeCopy( usedDeclaredArtifacts );
+    public Set<Artifact> getUsedDeclaredArtifacts() {
+        return safeCopy(usedDeclaredArtifacts);
     }
 
     /**
@@ -113,9 +111,8 @@ public class ProjectDependencyAnalysis
      *
      * @return artifacts used but not declared
      */
-    public Set<Artifact> getUsedUndeclaredArtifacts()
-    {
-        return safeCopy( usedUndeclaredArtifacts.keySet() );
+    public Set<Artifact> getUsedUndeclaredArtifacts() {
+        return safeCopy(usedUndeclaredArtifacts.keySet());
     }
 
     /**
@@ -123,9 +120,8 @@ public class ProjectDependencyAnalysis
      *
      * @return artifacts used but not declared
      */
-    public Map<Artifact, Set<String>> getUsedUndeclaredArtifactsWithClasses()
-    {
-        return safeCopy( usedUndeclaredArtifacts );
+    public Map<Artifact, Set<String>> getUsedUndeclaredArtifactsWithClasses() {
+        return safeCopy(usedUndeclaredArtifacts);
     }
 
     /**
@@ -133,9 +129,8 @@ public class ProjectDependencyAnalysis
      *
      * @return artifacts declared but not used
      */
-    public Set<Artifact> getUnusedDeclaredArtifacts()
-    {
-        return safeCopy( unusedDeclaredArtifacts );
+    public Set<Artifact> getUnusedDeclaredArtifacts() {
+        return safeCopy(unusedDeclaredArtifacts);
     }
 
     /**
@@ -143,9 +138,8 @@ public class ProjectDependencyAnalysis
      *
      * @return  artifacts only used in tests but not declared with test scope
      */
-    public Set<Artifact> getTestArtifactsWithNonTestScope()
-    {
-        return safeCopy( testArtifactsWithNonTestScope );
+    public Set<Artifact> getTestArtifactsWithNonTestScope() {
+        return safeCopy(testArtifactsWithNonTestScope);
     }
 
     /**
@@ -154,13 +148,12 @@ public class ProjectDependencyAnalysis
      * @return updated project dependency analysis
      * @since 1.3
      */
-    public ProjectDependencyAnalysis ignoreNonCompile()
-    {
-        Set<Artifact> filteredUnusedDeclared = new HashSet<>( unusedDeclaredArtifacts );
-        filteredUnusedDeclared.removeIf( artifact -> !artifact.getScope().equals( Artifact.SCOPE_COMPILE ) );
+    public ProjectDependencyAnalysis ignoreNonCompile() {
+        Set<Artifact> filteredUnusedDeclared = new HashSet<>(unusedDeclaredArtifacts);
+        filteredUnusedDeclared.removeIf(artifact -> !artifact.getScope().equals(Artifact.SCOPE_COMPILE));
 
-        return new ProjectDependencyAnalysis( usedDeclaredArtifacts, usedUndeclaredArtifacts, filteredUnusedDeclared,
-                testArtifactsWithNonTestScope );
+        return new ProjectDependencyAnalysis(
+                usedDeclaredArtifacts, usedUndeclaredArtifacts, filteredUnusedDeclared, testArtifactsWithNonTestScope);
     }
 
     /**
@@ -174,59 +167,50 @@ public class ProjectDependencyAnalysis
      *                                            used
      * @since 1.3
      */
-    @SuppressWarnings( "UnusedReturnValue" )
-    public ProjectDependencyAnalysis forceDeclaredDependenciesUsage( String[] forceUsedDependencies )
-        throws ProjectDependencyAnalyzerException
-    {
-        Set<String> forced = new HashSet<>( Arrays.asList( forceUsedDependencies ) );
+    @SuppressWarnings("UnusedReturnValue")
+    public ProjectDependencyAnalysis forceDeclaredDependenciesUsage(String[] forceUsedDependencies)
+            throws ProjectDependencyAnalyzerException {
+        Set<String> forced = new HashSet<>(Arrays.asList(forceUsedDependencies));
 
-        Set<Artifact> forcedUnusedDeclared = new HashSet<>( unusedDeclaredArtifacts );
-        Set<Artifact> forcedUsedDeclared = new HashSet<>( usedDeclaredArtifacts );
+        Set<Artifact> forcedUnusedDeclared = new HashSet<>(unusedDeclaredArtifacts);
+        Set<Artifact> forcedUsedDeclared = new HashSet<>(usedDeclaredArtifacts);
 
         Iterator<Artifact> iter = forcedUnusedDeclared.iterator();
-        while ( iter.hasNext() )
-        {
+        while (iter.hasNext()) {
             Artifact artifact = iter.next();
 
-            if ( forced.remove( artifact.getGroupId() + ':' + artifact.getArtifactId() ) )
-            {
+            if (forced.remove(artifact.getGroupId() + ':' + artifact.getArtifactId())) {
                 // ok, change artifact status from unused-declared to used-declared
                 iter.remove();
-                forcedUsedDeclared.add( artifact );
+                forcedUsedDeclared.add(artifact);
             }
         }
 
-        if ( !forced.isEmpty() )
-        {
+        if (!forced.isEmpty()) {
             // trying to force dependencies as used-declared which were not declared or already detected as used
             Set<String> used = new HashSet<>();
-            for ( Artifact artifact : usedDeclaredArtifacts )
-            {
+            for (Artifact artifact : usedDeclaredArtifacts) {
                 String id = artifact.getGroupId() + ':' + artifact.getArtifactId();
-                if ( forced.remove( id ) )
-                {
-                    used.add( id );
+                if (forced.remove(id)) {
+                    used.add(id);
                 }
             }
 
             StringBuilder builder = new StringBuilder();
-            if ( !forced.isEmpty() )
-            {
-                builder.append( "not declared: " ).append( forced );
+            if (!forced.isEmpty()) {
+                builder.append("not declared: ").append(forced);
             }
-            if ( !used.isEmpty() )
-            {
-                if ( builder.length() > 0 )
-                {
-                    builder.append( " and " );
+            if (!used.isEmpty()) {
+                if (builder.length() > 0) {
+                    builder.append(" and ");
                 }
-                builder.append( "declared but already detected as used: " ).append( used );
+                builder.append("declared but already detected as used: ").append(used);
             }
-            throw new ProjectDependencyAnalyzerException( "Trying to force use of dependencies which are " + builder );
+            throw new ProjectDependencyAnalyzerException("Trying to force use of dependencies which are " + builder);
         }
 
-        return new ProjectDependencyAnalysis( forcedUsedDeclared, usedUndeclaredArtifacts, forcedUnusedDeclared,
-                testArtifactsWithNonTestScope );
+        return new ProjectDependencyAnalysis(
+                forcedUsedDeclared, usedUndeclaredArtifacts, forcedUnusedDeclared, testArtifactsWithNonTestScope);
     }
 
     /**
@@ -234,27 +218,24 @@ public class ProjectDependencyAnalysis
      *
      * @return an int
      */
-    public int hashCode()
-    {
+    public int hashCode() {
         int hashCode = getUsedDeclaredArtifacts().hashCode();
-        hashCode = ( hashCode * 37 ) + getUsedUndeclaredArtifacts().hashCode();
-        hashCode = ( hashCode * 37 ) + getUnusedDeclaredArtifacts().hashCode();
-        hashCode = ( hashCode * 37 ) + getTestArtifactsWithNonTestScope().hashCode();
+        hashCode = (hashCode * 37) + getUsedUndeclaredArtifacts().hashCode();
+        hashCode = (hashCode * 37) + getUnusedDeclaredArtifacts().hashCode();
+        hashCode = (hashCode * 37) + getTestArtifactsWithNonTestScope().hashCode();
 
         return hashCode;
     }
 
     /** {@inheritDoc} */
-    public boolean equals( Object object )
-    {
-        if ( object instanceof ProjectDependencyAnalysis )
-        {
+    public boolean equals(Object object) {
+        if (object instanceof ProjectDependencyAnalysis) {
             ProjectDependencyAnalysis analysis = (ProjectDependencyAnalysis) object;
 
-            return getUsedDeclaredArtifacts().equals( analysis.getUsedDeclaredArtifacts() )
-                && getUsedUndeclaredArtifacts().equals( analysis.getUsedUndeclaredArtifacts() )
-                && getUnusedDeclaredArtifacts().equals( analysis.getUnusedDeclaredArtifacts() )
-                && getTestArtifactsWithNonTestScope().equals( analysis.getTestArtifactsWithNonTestScope() );
+            return getUsedDeclaredArtifacts().equals(analysis.getUsedDeclaredArtifacts())
+                    && getUsedUndeclaredArtifacts().equals(analysis.getUsedUndeclaredArtifacts())
+                    && getUnusedDeclaredArtifacts().equals(analysis.getUnusedDeclaredArtifacts())
+                    && getTestArtifactsWithNonTestScope().equals(analysis.getTestArtifactsWithNonTestScope());
         }
 
         return false;
@@ -265,89 +246,74 @@ public class ProjectDependencyAnalysis
      *
      * @return a {@link java.lang.String} object.
      */
-    public String toString()
-    {
+    public String toString() {
         StringBuilder buffer = new StringBuilder();
 
-        if ( !getUsedDeclaredArtifacts().isEmpty() )
-        {
-            buffer.append( "usedDeclaredArtifacts=" ).append( getUsedDeclaredArtifacts() );
+        if (!getUsedDeclaredArtifacts().isEmpty()) {
+            buffer.append("usedDeclaredArtifacts=").append(getUsedDeclaredArtifacts());
         }
 
-        if ( !getUsedUndeclaredArtifacts().isEmpty() )
-        {
-            if ( buffer.length() > 0 )
-            {
-                buffer.append( "," );
+        if (!getUsedUndeclaredArtifacts().isEmpty()) {
+            if (buffer.length() > 0) {
+                buffer.append(",");
             }
 
-            buffer.append( "usedUndeclaredArtifacts=" ).append( getUsedUndeclaredArtifacts() );
+            buffer.append("usedUndeclaredArtifacts=").append(getUsedUndeclaredArtifacts());
         }
 
-        if ( !getUnusedDeclaredArtifacts().isEmpty() )
-        {
-            if ( buffer.length() > 0 )
-            {
-                buffer.append( "," );
+        if (!getUnusedDeclaredArtifacts().isEmpty()) {
+            if (buffer.length() > 0) {
+                buffer.append(",");
             }
 
-            buffer.append( "unusedDeclaredArtifacts=" ).append( getUnusedDeclaredArtifacts() );
+            buffer.append("unusedDeclaredArtifacts=").append(getUnusedDeclaredArtifacts());
         }
 
-        if ( !getTestArtifactsWithNonTestScope().isEmpty() )
-        {
-            if ( buffer.length() > 0 )
-            {
-                buffer.append( "," );
+        if (!getTestArtifactsWithNonTestScope().isEmpty()) {
+            if (buffer.length() > 0) {
+                buffer.append(",");
             }
 
-            buffer.append( "testArtifactsWithNonTestScope=" ).append( getTestArtifactsWithNonTestScope() );
+            buffer.append("testArtifactsWithNonTestScope=").append(getTestArtifactsWithNonTestScope());
         }
 
-        buffer.insert( 0, "[" );
-        buffer.insert( 0, getClass().getName() );
+        buffer.insert(0, "[");
+        buffer.insert(0, getClass().getName());
 
-        buffer.append( "]" );
+        buffer.append("]");
 
         return buffer.toString();
     }
 
     // private methods --------------------------------------------------------
 
-    private Set<Artifact> safeCopy( Set<Artifact> set )
-    {
-        return ( set == null ) ? Collections.emptySet() : Collections.unmodifiableSet( new LinkedHashSet<>( set ) );
+    private Set<Artifact> safeCopy(Set<Artifact> set) {
+        return (set == null) ? Collections.emptySet() : Collections.unmodifiableSet(new LinkedHashSet<>(set));
     }
 
-    private static Map<Artifact, Set<String>> safeCopy( Map<Artifact, Set<String>> origMap )
-    {
-        if ( origMap == null )
-        {
+    private static Map<Artifact, Set<String>> safeCopy(Map<Artifact, Set<String>> origMap) {
+        if (origMap == null) {
             return Collections.emptyMap();
         }
 
         Map<Artifact, Set<String>> map = new HashMap<>();
 
-        for ( Map.Entry<Artifact, Set<String>> e : origMap.entrySet() )
-        {
-            map.put( e.getKey(), Collections.unmodifiableSet( new LinkedHashSet<>( e.getValue() ) ) );
+        for (Map.Entry<Artifact, Set<String>> e : origMap.entrySet()) {
+            map.put(e.getKey(), Collections.unmodifiableSet(new LinkedHashSet<>(e.getValue())));
         }
 
         return map;
     }
 
-    private static Map<Artifact, Set<String>> mapWithKeys( Set<Artifact> keys )
-    {
-        if ( keys == null )
-        {
+    private static Map<Artifact, Set<String>> mapWithKeys(Set<Artifact> keys) {
+        if (keys == null) {
             return Collections.emptyMap();
         }
 
         Map<Artifact, Set<String>> map = new HashMap<>();
 
-        for ( Artifact k : keys )
-        {
-            map.put( k, Collections.<String>emptySet() );
+        for (Artifact k : keys) {
+            map.put(k, Collections.<String>emptySet());
         }
 
         return map;
diff --git a/src/main/java/org/apache/maven/shared/dependency/analyzer/ProjectDependencyAnalyzer.java b/src/main/java/org/apache/maven/shared/dependency/analyzer/ProjectDependencyAnalyzer.java
index ca7f4b8..9503ea3 100644
--- a/src/main/java/org/apache/maven/shared/dependency/analyzer/ProjectDependencyAnalyzer.java
+++ b/src/main/java/org/apache/maven/shared/dependency/analyzer/ProjectDependencyAnalyzer.java
@@ -1,5 +1,3 @@
-package org.apache.maven.shared.dependency.analyzer;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@ package org.apache.maven.shared.dependency.analyzer;
  * "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
+ *   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
@@ -18,6 +16,7 @@ package org.apache.maven.shared.dependency.analyzer;
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.shared.dependency.analyzer;
 
 import org.apache.maven.project.MavenProject;
 
@@ -32,8 +31,7 @@ import org.apache.maven.project.MavenProject;
  *
  * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
  */
-public interface ProjectDependencyAnalyzer
-{
+public interface ProjectDependencyAnalyzer {
     /**
      * <p>analyze.</p>
      *
@@ -41,6 +39,5 @@ public interface ProjectDependencyAnalyzer
      * @return a {@link org.apache.maven.shared.dependency.analyzer.ProjectDependencyAnalysis} object
      * @throws org.apache.maven.shared.dependency.analyzer.ProjectDependencyAnalyzerException if any
      */
-    ProjectDependencyAnalysis analyze( MavenProject project )
-        throws ProjectDependencyAnalyzerException;
+    ProjectDependencyAnalysis analyze(MavenProject project) throws ProjectDependencyAnalyzerException;
 }
diff --git a/src/main/java/org/apache/maven/shared/dependency/analyzer/ProjectDependencyAnalyzerException.java b/src/main/java/org/apache/maven/shared/dependency/analyzer/ProjectDependencyAnalyzerException.java
index de7abaa..02ee693 100644
--- a/src/main/java/org/apache/maven/shared/dependency/analyzer/ProjectDependencyAnalyzerException.java
+++ b/src/main/java/org/apache/maven/shared/dependency/analyzer/ProjectDependencyAnalyzerException.java
@@ -1,5 +1,3 @@
-package org.apache.maven.shared.dependency.analyzer;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@ package org.apache.maven.shared.dependency.analyzer;
  * "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
+ *   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
@@ -18,15 +16,14 @@ package org.apache.maven.shared.dependency.analyzer;
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.shared.dependency.analyzer;
 
 /**
  * <p>ProjectDependencyAnalyzerException class.</p>
  *
  * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
  */
-public class ProjectDependencyAnalyzerException
-    extends Exception
-{
+public class ProjectDependencyAnalyzerException extends Exception {
     /**
      * The serialisation unique ID.
      */
@@ -37,9 +34,8 @@ public class ProjectDependencyAnalyzerException
      *
      * @param message a {@link java.lang.String} object.
      */
-    public ProjectDependencyAnalyzerException( String message )
-    {
-        super( message );
+    public ProjectDependencyAnalyzerException(String message) {
+        super(message);
     }
 
     /**
@@ -48,8 +44,7 @@ public class ProjectDependencyAnalyzerException
      * @param message a {@link java.lang.String} object.
      * @param cause a {@link java.lang.Throwable} object.
      */
-    public ProjectDependencyAnalyzerException( String message, Throwable cause )
-    {
-        super( message, cause );
+    public ProjectDependencyAnalyzerException(String message, Throwable cause) {
+        super(message, cause);
     }
 }
diff --git a/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/ASMDependencyAnalyzer.java b/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/ASMDependencyAnalyzer.java
index ebe2738..98aebf8 100644
--- a/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/ASMDependencyAnalyzer.java
+++ b/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/ASMDependencyAnalyzer.java
@@ -1,5 +1,3 @@
-package org.apache.maven.shared.dependency.analyzer.asm;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@ package org.apache.maven.shared.dependency.analyzer.asm;
  * "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
+ *   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
@@ -18,6 +16,7 @@ package org.apache.maven.shared.dependency.analyzer.asm;
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.shared.dependency.analyzer.asm;
 
 import javax.inject.Named;
 import javax.inject.Singleton;
@@ -36,16 +35,12 @@ import org.apache.maven.shared.dependency.analyzer.DependencyAnalyzer;
  */
 @Named
 @Singleton
-public class ASMDependencyAnalyzer
-    implements DependencyAnalyzer
-{
+public class ASMDependencyAnalyzer implements DependencyAnalyzer {
     /** {@inheritDoc} */
-    public Set<String> analyze( URL url )
-        throws IOException
-    {
+    public Set<String> analyze(URL url) throws IOException {
         DependencyClassFileVisitor visitor = new DependencyClassFileVisitor();
 
-        ClassFileVisitorUtils.accept( url, visitor );
+        ClassFileVisitorUtils.accept(url, visitor);
 
         return visitor.getDependencies();
     }
diff --git a/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/ConstantPoolParser.java b/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/ConstantPoolParser.java
index 4937a97..76da741 100644
--- a/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/ConstantPoolParser.java
+++ b/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/ConstantPoolParser.java
@@ -1,5 +1,3 @@
-package org.apache.maven.shared.dependency.analyzer.asm;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@ package org.apache.maven.shared.dependency.analyzer.asm;
  * "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
+ *   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
@@ -18,6 +16,7 @@ package org.apache.maven.shared.dependency.analyzer.asm;
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.shared.dependency.analyzer.asm;
 
 import java.nio.Buffer;
 import java.nio.ByteBuffer;
@@ -28,6 +27,8 @@ import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 
+import org.objectweb.asm.Type;
+
 /**
  * A small parser to read the constant pool directly, in case it contains references
  * ASM does not support.
@@ -38,9 +39,9 @@ import java.util.Set;
  *
  * @see <a href="https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-4.html#jvms-4.4">JVM 9 Sepc</a>
  * @see <a href="https://docs.oracle.com/javase/specs/jvms/se10/html/jvms-4.html#jvms-4.4">JVM 10 Sepc</a>
+ * @see <a href="https://docs.oracle.com/javase/specs/jvms/se20/html/jvms-4.html#jvms-4.4">JVM 20 Sepc</a>
  */
-public class ConstantPoolParser
-{
+public class ConstantPoolParser {
     /** Constant <code>HEAD=0xcafebabe</code> */
     public static final int HEAD = 0xcafebabe;
 
@@ -85,6 +86,9 @@ public class ConstantPoolParser
     /** Constant <code>CONSTANT_METHOD_TYPE=16</code> */
     public static final byte CONSTANT_METHOD_TYPE = 16;
 
+    /** Constant <code>CONSTANT_INVOKE=17</code> */
+    public static final byte CONSTANT_INVOKE = 17;
+
     /** Constant <code>CONSTANT_INVOKE_DYNAMIC=18</code> */
     public static final byte CONSTANT_INVOKE_DYNAMIC = 18;
 
@@ -100,182 +104,184 @@ public class ConstantPoolParser
 
     private static final int OX3F = 0x3F;
 
-    static Set<String> getConstantPoolClassReferences( byte[] b )
-    {
-        return parseConstantPoolClassReferences( ByteBuffer.wrap( b ) );
+    static Set<String> getConstantPoolClassReferences(byte[] b) {
+        return parseConstantPoolClassReferences(ByteBuffer.wrap(b));
     }
 
-    static Set<String> parseConstantPoolClassReferences( ByteBuffer buf )
-    {
-        if ( buf.order( ByteOrder.BIG_ENDIAN )
-                .getInt() != HEAD )
-        {
+    static Set<String> parseConstantPoolClassReferences(ByteBuffer buf) {
+        if (buf.order(ByteOrder.BIG_ENDIAN).getInt() != HEAD) {
             return Collections.emptySet();
         }
-        buf.getChar() ; buf.getChar(); // minor + ver
-        Set<Integer> classes = new HashSet<>();
+        buf.getChar();
+        buf.getChar(); // minor + ver
+        Set<Integer> classReferences = new HashSet<>();
+        Set<Integer> typeReferences = new HashSet<>();
         Map<Integer, String> stringConstants = new HashMap<>();
-        for ( int ix = 1, num = buf.getChar(); ix < num; ix++ )
-        {
+        for (int ix = 1, num = buf.getChar(); ix < num; ix++) {
             byte tag = buf.get();
-            switch ( tag )
-            {
+            switch (tag) {
                 default:
-                    throw new RuntimeException( "Unknown constant pool type '" + tag + "'" );
+                    throw new RuntimeException("Unknown constant pool type '" + tag + "'");
                 case CONSTANT_UTF8:
-                    stringConstants.put( ix, decodeString( buf ) );
+                    stringConstants.put(ix, decodeString(buf));
                     break;
                 case CONSTANT_CLASS:
-                    classes.add( (int) buf.getChar() );
+                    classReferences.add((int) buf.getChar());
                     break;
                 case CONSTANT_METHOD_TYPE:
-                    consumeMethodType( buf );
+                    consumeMethodType(buf);
                     break;
                 case CONSTANT_FIELDREF:
                 case CONSTANT_METHODREF:
                 case CONSTANT_INTERFACEMETHODREF:
+                    consumeReference(buf);
+                    break;
                 case CONSTANT_NAME_AND_TYPE:
-                    consumeReference( buf );
+                    buf.getChar();
+                    typeReferences.add((int) buf.getChar());
                     break;
                 case CONSTANT_INTEGER:
-                    consumeInt( buf );
+                    consumeInt(buf);
                     break;
                 case CONSTANT_FLOAT:
-                    consumeFloat( buf );
+                    consumeFloat(buf);
                     break;
                 case CONSTANT_DOUBLE:
-                    consumeDouble( buf );
+                    consumeDouble(buf);
                     ix++;
                     break;
                 case CONSTANT_LONG:
-                    consumeLong( buf );
+                    consumeLong(buf);
                     ix++;
                     break;
                 case CONSTANT_STRING:
-                    consumeString( buf );
+                    consumeString(buf);
                     break;
                 case CONSTANT_METHODHANDLE:
-                    consumeMethodHandle( buf );
+                    consumeMethodHandle(buf);
+                    break;
+                case CONSTANT_INVOKE:
+                    consumeDynamic(buf);
                     break;
                 case CONSTANT_INVOKE_DYNAMIC:
-                    consumeInvokeDynamic( buf );
+                    consumeInvokeDynamic(buf);
                     break;
                 case CONSTANT_MODULE:
-                    consumeModule( buf );
+                    consumeModule(buf);
                     break;
                 case CONSTANT_PACKAGE:
-                    consumePackage( buf );
+                    consumePackage(buf);
                     break;
             }
         }
+
         Set<String> result = new HashSet<>();
-        for ( Integer aClass : classes )
-        {
-            String className = stringConstants.get( aClass );
-
-            // filter out things from unnamed package, probably a false-positive
-            if ( isImportableClass( className ) )
-            {
-                result.add( className );
+
+        for (Integer classRef : classReferences) {
+            addClassToResult(result, stringConstants.get(classRef));
+        }
+
+        for (Integer typeRef : typeReferences) {
+            String typeName = stringConstants.get(typeRef);
+
+            if (Type.getType(typeName).getSort() == Type.METHOD) {
+                addClassToResult(result, Type.getReturnType(typeName).getInternalName());
+                Type[] argumentTypes = Type.getArgumentTypes(typeName);
+                for (Type argumentType : argumentTypes) {
+                    addClassToResult(result, argumentType.getInternalName());
+                }
             }
         }
+
         return result;
     }
 
-    private static String decodeString( ByteBuffer buf )
-    {
+    private static void addClassToResult(Set<String> result, String className) {
+        // filter out things from unnamed package, probably a false-positive
+        if (isImportableClass(className)) {
+            result.add(className);
+        }
+    }
+
+    private static String decodeString(ByteBuffer buf) {
         int size = buf.getChar();
         // Explicit cast for compatibility with covariant return type on JDK 9's ByteBuffer
-        @SuppressWarnings( "RedundantCast" )
-        int oldLimit = ( (Buffer) buf ).limit();
-        ( (Buffer) buf ).limit( buf.position() + size );
-        StringBuilder sb = new StringBuilder( size + ( size >> 1 ) + 16 );
-        while ( buf.hasRemaining() )
-        {
+        @SuppressWarnings("RedundantCast")
+        int oldLimit = ((Buffer) buf).limit();
+        ((Buffer) buf).limit(buf.position() + size);
+        StringBuilder sb = new StringBuilder(size + (size >> 1) + 16);
+        while (buf.hasRemaining()) {
             byte b = buf.get();
-            if ( b > 0 )
-            {
-                sb.append( (char) b );
-            }
-            else
-            {
+            if (b > 0) {
+                sb.append((char) b);
+            } else {
                 int b2 = buf.get();
-                if ( ( b & OXF0 ) != OXE0 )
-                {
-                    sb.append( (char) ( ( b & 0x1F ) << 6 | b2 & OX3F ) );
-                }
-                else
-                {
+                if ((b & OXF0) != OXE0) {
+                    sb.append((char) ((b & 0x1F) << 6 | b2 & OX3F));
+                } else {
                     int b3 = buf.get();
-                    sb.append( (char) ( ( b & 0x0F ) << 12 | ( b2 & OX3F ) << 6 | b3 & OX3F ) );
+                    sb.append((char) ((b & 0x0F) << 12 | (b2 & OX3F) << 6 | b3 & OX3F));
                 }
             }
         }
-        ( (Buffer) buf ).limit( oldLimit );
+        ((Buffer) buf).limit(oldLimit);
         return sb.toString();
     }
 
-    private static boolean isImportableClass( String className )
-    {
+    private static boolean isImportableClass(String className) {
         // without a slash, class must be in unnamed package, which can't be imported
-        return className.indexOf( '/' ) != -1;
+        return className.indexOf('/') != -1;
     }
 
-    private static void consumeMethodType( ByteBuffer buf )
-    {
+    private static void consumeMethodType(ByteBuffer buf) {
         buf.getChar();
     }
 
-    private static void consumeReference( ByteBuffer buf )
-    {
+    private static void consumeReference(ByteBuffer buf) {
         buf.getChar();
         buf.getChar();
     }
 
-    private static void consumeInt( ByteBuffer buf )
-    {
+    private static void consumeInt(ByteBuffer buf) {
         buf.getInt();
     }
 
-    private static void consumeFloat( ByteBuffer buf )
-    {
+    private static void consumeFloat(ByteBuffer buf) {
         buf.getFloat();
     }
 
-    private static void consumeDouble( ByteBuffer buf )
-    {
+    private static void consumeDouble(ByteBuffer buf) {
         buf.getDouble();
     }
 
-    private static void consumeLong( ByteBuffer buf )
-    {
+    private static void consumeLong(ByteBuffer buf) {
         buf.getLong();
     }
 
-    private static void consumeString( ByteBuffer buf )
-    {
+    private static void consumeString(ByteBuffer buf) {
         buf.getChar();
     }
 
-    private static void consumeMethodHandle( ByteBuffer buf )
-    {
+    private static void consumeMethodHandle(ByteBuffer buf) {
         buf.get();
         buf.getChar();
     }
 
-    private static void consumeInvokeDynamic( ByteBuffer buf )
-    {
+    private static void consumeDynamic(ByteBuffer buf) {
+        buf.getChar(); // u2 bootstrap_method_attr_index;
+        buf.getChar(); // u2 name_and_type_index;
+    }
+
+    private static void consumeInvokeDynamic(ByteBuffer buf) {
         buf.getChar();
         buf.getChar();
     }
 
-    private static void consumeModule( ByteBuffer buf )
-    {
+    private static void consumeModule(ByteBuffer buf) {
         buf.getChar();
     }
 
-    private static void consumePackage( ByteBuffer buf )
-    {
+    private static void consumePackage(ByteBuffer buf) {
         buf.getChar();
     }
 }
diff --git a/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/DefaultAnnotationVisitor.java b/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/DefaultAnnotationVisitor.java
index 0156e2c..37e1994 100644
--- a/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/DefaultAnnotationVisitor.java
+++ b/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/DefaultAnnotationVisitor.java
@@ -1,5 +1,3 @@
-package org.apache.maven.shared.dependency.analyzer.asm;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@ package org.apache.maven.shared.dependency.analyzer.asm;
  * "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
+ *   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
@@ -18,6 +16,7 @@ package org.apache.maven.shared.dependency.analyzer.asm;
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.shared.dependency.analyzer.asm;
 
 import org.objectweb.asm.AnnotationVisitor;
 import org.objectweb.asm.Opcodes;
@@ -29,9 +28,7 @@ import org.objectweb.asm.Type;
  *
  * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
  */
-public class DefaultAnnotationVisitor
-    extends AnnotationVisitor
-{
+public class DefaultAnnotationVisitor extends AnnotationVisitor {
     private final ResultCollector resultCollector;
 
     /**
@@ -39,39 +36,32 @@ public class DefaultAnnotationVisitor
      *
      * @param resultCollector a {@link org.apache.maven.shared.dependency.analyzer.asm.ResultCollector} object.
      */
-    public DefaultAnnotationVisitor( ResultCollector resultCollector )
-    {
-        super( Opcodes.ASM9 );
+    public DefaultAnnotationVisitor(ResultCollector resultCollector) {
+        super(Opcodes.ASM9);
         this.resultCollector = resultCollector;
     }
 
     /** {@inheritDoc} */
-    public void visit( final String name, final Object value )
-    {
-        if ( value instanceof Type )
-        {
-            resultCollector.addType( (Type) value );
+    public void visit(final String name, final Object value) {
+        if (value instanceof Type) {
+            resultCollector.addType((Type) value);
         }
     }
 
     /** {@inheritDoc} */
-    public void visitEnum( final String name, final String desc, final String value )
-    {
-        resultCollector.addDesc( desc );
+    public void visitEnum(final String name, final String desc, final String value) {
+        resultCollector.addDesc(desc);
     }
 
     /** {@inheritDoc} */
-    public AnnotationVisitor visitAnnotation( final String name, final String desc )
-    {
-        resultCollector.addDesc( desc );
+    public AnnotationVisitor visitAnnotation(final String name, final String desc) {
+        resultCollector.addDesc(desc);
 
         return this;
     }
 
     /** {@inheritDoc} */
-    public AnnotationVisitor visitArray( final String name )
-    {
+    public AnnotationVisitor visitArray(final String name) {
         return this;
     }
-
 }
diff --git a/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/DefaultClassVisitor.java b/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/DefaultClassVisitor.java
index d953188..300b39b 100644
--- a/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/DefaultClassVisitor.java
+++ b/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/DefaultClassVisitor.java
@@ -1,5 +1,3 @@
-package org.apache.maven.shared.dependency.analyzer.asm;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@ package org.apache.maven.shared.dependency.analyzer.asm;
  * "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
+ *   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
@@ -18,6 +16,7 @@ package org.apache.maven.shared.dependency.analyzer.asm;
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.shared.dependency.analyzer.asm;
 
 import org.objectweb.asm.AnnotationVisitor;
 import org.objectweb.asm.ClassVisitor;
@@ -28,16 +27,13 @@ import org.objectweb.asm.Type;
 import org.objectweb.asm.signature.SignatureReader;
 import org.objectweb.asm.signature.SignatureVisitor;
 
-
 /**
  * Computes the set of classes referenced by visited code.
  * Inspired by <code>org.objectweb.asm.depend.DependencyVisitor</code> in the ASM dependencies example.
  *
  * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
  */
-public class DefaultClassVisitor
-    extends ClassVisitor
-{
+public class DefaultClassVisitor extends ClassVisitor {
     private final ResultCollector resultCollector;
 
     private final SignatureVisitor signatureVisitor;
@@ -57,11 +53,13 @@ public class DefaultClassVisitor
      * @param methodVisitor a {@link org.objectweb.asm.MethodVisitor} object.
      * @param resultCollector a {@link org.apache.maven.shared.dependency.analyzer.asm.ResultCollector} object.
      */
-    public DefaultClassVisitor( SignatureVisitor signatureVisitor, AnnotationVisitor annotationVisitor,
-                                FieldVisitor fieldVisitor, MethodVisitor methodVisitor,
-                                ResultCollector resultCollector )
-    {
-        super( Opcodes.ASM9 );
+    public DefaultClassVisitor(
+            SignatureVisitor signatureVisitor,
+            AnnotationVisitor annotationVisitor,
+            FieldVisitor fieldVisitor,
+            MethodVisitor methodVisitor,
+            ResultCollector resultCollector) {
+        super(Opcodes.ASM9);
         this.signatureVisitor = signatureVisitor;
         this.annotationVisitor = annotationVisitor;
         this.fieldVisitor = fieldVisitor;
@@ -79,44 +77,39 @@ public class DefaultClassVisitor
      * @param superName a {@link java.lang.String} object.
      * @param interfaces an array of {@link java.lang.String} objects.
      */
-    public void visit( final int version, final int access, final String name, final String signature,
-                       final String superName, final String[] interfaces )
-    {
-        if ( signature == null )
-        {
-            resultCollector.addName( superName );
-            resultCollector.addNames( interfaces );
-        }
-        else
-        {
-            addSignature( signature );
+    public void visit(
+            final int version,
+            final int access,
+            final String name,
+            final String signature,
+            final String superName,
+            final String[] interfaces) {
+        if (signature == null) {
+            resultCollector.addName(superName);
+            resultCollector.addNames(interfaces);
+        } else {
+            addSignature(signature);
         }
     }
 
     /** {@inheritDoc} */
-    public AnnotationVisitor visitAnnotation( final String desc, final boolean visible )
-    {
-        resultCollector.addDesc( desc );
+    public AnnotationVisitor visitAnnotation(final String desc, final boolean visible) {
+        resultCollector.addDesc(desc);
 
         return annotationVisitor;
     }
 
     /** {@inheritDoc} */
-    public FieldVisitor visitField( final int access, final String name, final String desc, final String signature,
-                                    final Object value )
-    {
-        if ( signature == null )
-        {
-            resultCollector.addDesc( desc );
-        }
-        else
-        {
-            addTypeSignature( signature );
+    public FieldVisitor visitField(
+            final int access, final String name, final String desc, final String signature, final Object value) {
+        if (signature == null) {
+            resultCollector.addDesc(desc);
+        } else {
+            addTypeSignature(signature);
         }
 
-        if ( value instanceof Type )
-        {
-            resultCollector.addType( (Type) value );
+        if (value instanceof Type) {
+            resultCollector.addType((Type) value);
         }
 
         return fieldVisitor;
@@ -132,48 +125,38 @@ public class DefaultClassVisitor
      * @param exceptions an array of {@link java.lang.String} objects.
      * @return a {@link org.objectweb.asm.MethodVisitor} object.
      */
-    public MethodVisitor visitMethod( final int access, final String name, final String desc, final String signature,
-                                      final String[] exceptions )
-    {
-        if ( signature == null )
-        {
-            resultCollector.addMethodDesc( desc );
-        }
-        else
-        {
-            addSignature( signature );
+    public MethodVisitor visitMethod(
+            final int access, final String name, final String desc, final String signature, final String[] exceptions) {
+        if (signature == null) {
+            resultCollector.addMethodDesc(desc);
+        } else {
+            addSignature(signature);
         }
 
-        resultCollector.addNames( exceptions );
+        resultCollector.addNames(exceptions);
 
         return methodVisitor;
     }
 
     /** {@inheritDoc} */
-    public void visitNestHost( final String nestHost )
-    {
-        resultCollector.addName( nestHost );
+    public void visitNestHost(final String nestHost) {
+        resultCollector.addName(nestHost);
     }
 
     /** {@inheritDoc} */
-    public void visitNestMember( final String nestMember )
-    {
-        resultCollector.addName( nestMember );
+    public void visitNestMember(final String nestMember) {
+        resultCollector.addName(nestMember);
     }
 
-    private void addSignature( final String signature )
-    {
-        if ( signature != null )
-        {
-            new SignatureReader( signature ).accept( signatureVisitor );
+    private void addSignature(final String signature) {
+        if (signature != null) {
+            new SignatureReader(signature).accept(signatureVisitor);
         }
     }
 
-    private void addTypeSignature( final String signature )
-    {
-        if ( signature != null )
-        {
-            new SignatureReader( signature ).acceptType( signatureVisitor );
+    private void addTypeSignature(final String signature) {
+        if (signature != null) {
+            new SignatureReader(signature).acceptType(signatureVisitor);
         }
     }
 }
diff --git a/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/DefaultFieldVisitor.java b/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/DefaultFieldVisitor.java
index fe8a11c..ee3af37 100644
--- a/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/DefaultFieldVisitor.java
+++ b/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/DefaultFieldVisitor.java
@@ -1,5 +1,3 @@
-package org.apache.maven.shared.dependency.analyzer.asm;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@ package org.apache.maven.shared.dependency.analyzer.asm;
  * "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
+ *   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
@@ -18,6 +16,7 @@ package org.apache.maven.shared.dependency.analyzer.asm;
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.shared.dependency.analyzer.asm;
 
 import org.objectweb.asm.AnnotationVisitor;
 import org.objectweb.asm.FieldVisitor;
@@ -29,9 +28,7 @@ import org.objectweb.asm.Opcodes;
  *
  * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
  */
-public class DefaultFieldVisitor
-    extends FieldVisitor
-{
+public class DefaultFieldVisitor extends FieldVisitor {
     private final AnnotationVisitor annotationVisitor;
 
     private final ResultCollector resultCollector;
@@ -42,19 +39,16 @@ public class DefaultFieldVisitor
      * @param annotationVisitor a {@link org.objectweb.asm.AnnotationVisitor} object.
      * @param resultCollector a {@link org.apache.maven.shared.dependency.analyzer.asm.ResultCollector} object.
      */
-    public DefaultFieldVisitor( AnnotationVisitor annotationVisitor, ResultCollector resultCollector )
-    {
-        super( Opcodes.ASM9 );
+    public DefaultFieldVisitor(AnnotationVisitor annotationVisitor, ResultCollector resultCollector) {
+        super(Opcodes.ASM9);
         this.annotationVisitor = annotationVisitor;
         this.resultCollector = resultCollector;
     }
 
     /** {@inheritDoc} */
-    public AnnotationVisitor visitAnnotation( final String desc, final boolean visible )
-    {
-        resultCollector.addDesc( desc );
+    public AnnotationVisitor visitAnnotation(final String desc, final boolean visible) {
+        resultCollector.addDesc(desc);
 
         return annotationVisitor;
     }
-
 }
diff --git a/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/DefaultMethodVisitor.java b/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/DefaultMethodVisitor.java
index 49723fc..996193d 100644
--- a/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/DefaultMethodVisitor.java
+++ b/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/DefaultMethodVisitor.java
@@ -1,5 +1,3 @@
-package org.apache.maven.shared.dependency.analyzer.asm;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@ package org.apache.maven.shared.dependency.analyzer.asm;
  * "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
+ *   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
@@ -18,6 +16,7 @@ package org.apache.maven.shared.dependency.analyzer.asm;
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.shared.dependency.analyzer.asm;
 
 import org.objectweb.asm.AnnotationVisitor;
 import org.objectweb.asm.Label;
@@ -34,9 +33,7 @@ import org.objectweb.asm.signature.SignatureVisitor;
  *
  * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
  */
-public class DefaultMethodVisitor
-    extends MethodVisitor
-{
+public class DefaultMethodVisitor extends MethodVisitor {
     private final AnnotationVisitor annotationVisitor;
 
     private final SignatureVisitor signatureVisitor;
@@ -50,67 +47,57 @@ public class DefaultMethodVisitor
      * @param signatureVisitor a {@link org.objectweb.asm.signature.SignatureVisitor} object.
      * @param resultCollector a {@link org.apache.maven.shared.dependency.analyzer.asm.ResultCollector} object.
      */
-    public DefaultMethodVisitor( AnnotationVisitor annotationVisitor, SignatureVisitor signatureVisitor,
-                                 ResultCollector resultCollector )
-    {
-        super( Opcodes.ASM9 );
+    public DefaultMethodVisitor(
+            AnnotationVisitor annotationVisitor, SignatureVisitor signatureVisitor, ResultCollector resultCollector) {
+        super(Opcodes.ASM9);
         this.annotationVisitor = annotationVisitor;
         this.signatureVisitor = signatureVisitor;
         this.resultCollector = resultCollector;
     }
 
     /** {@inheritDoc} */
-    public AnnotationVisitor visitAnnotation( final String desc, final boolean visible )
-    {
-        resultCollector.addDesc( desc );
+    public AnnotationVisitor visitAnnotation(final String desc, final boolean visible) {
+        resultCollector.addDesc(desc);
 
         return annotationVisitor;
     }
 
     /** {@inheritDoc} */
     @Override
-    public AnnotationVisitor visitTypeAnnotation( int typeRef, TypePath typePath, String desc, boolean visible )
-    {
-        resultCollector.addDesc( desc );
+    public AnnotationVisitor visitTypeAnnotation(int typeRef, TypePath typePath, String desc, boolean visible) {
+        resultCollector.addDesc(desc);
 
         return annotationVisitor;
     }
 
     /** {@inheritDoc} */
-    public AnnotationVisitor visitParameterAnnotation( final int parameter, final String desc, final boolean visible )
-    {
-        resultCollector.addDesc( desc );
+    public AnnotationVisitor visitParameterAnnotation(final int parameter, final String desc, final boolean visible) {
+        resultCollector.addDesc(desc);
 
         return annotationVisitor;
     }
 
     /** {@inheritDoc} */
     @Override
-    public AnnotationVisitor visitLocalVariableAnnotation( int typeRef, TypePath typePath, Label[] start, Label[] end,
-                                                           int[] index, String desc, boolean visible )
-    {
-        resultCollector.addDesc( desc );
+    public AnnotationVisitor visitLocalVariableAnnotation(
+            int typeRef, TypePath typePath, Label[] start, Label[] end, int[] index, String desc, boolean visible) {
+        resultCollector.addDesc(desc);
 
         return annotationVisitor;
     }
 
     /** {@inheritDoc} */
-    public void visitTypeInsn( final int opcode, final String desc )
-    {
-        if ( desc.charAt( 0 ) == '[' )
-        {
-            resultCollector.addDesc( desc );
-        }
-        else
-        {
-            resultCollector.addName( desc );
+    public void visitTypeInsn(final int opcode, final String desc) {
+        if (desc.charAt(0) == '[') {
+            resultCollector.addDesc(desc);
+        } else {
+            resultCollector.addName(desc);
         }
     }
 
     /** {@inheritDoc} */
-    public void visitFieldInsn( final int opcode, final String owner, final String name, final String desc )
-    {
-        resultCollector.addName( owner );
+    public void visitFieldInsn(final int opcode, final String owner, final String name, final String desc) {
+        resultCollector.addName(owner);
         /*
          * NOTE: Merely accessing a field does not impose a direct dependency on its type. For example, the code line
          * <code>java.lang.Object var = bean.field;</code> does not directly depend on the type of the field. A direct
@@ -121,51 +108,45 @@ public class DefaultMethodVisitor
 
     /** {@inheritDoc} */
     @Override
-    public void visitMethodInsn( int opcode, String owner, String name, String desc, boolean itf )
-    {
-        resultCollector.addName( owner );
+    public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) {
+        resultCollector.addName(owner);
     }
 
     /** {@inheritDoc} */
-    public void visitLdcInsn( final Object cst )
-    {
-        if ( cst instanceof Type )
-        {
-            resultCollector.addType( (Type) cst );
+    public void visitLdcInsn(final Object cst) {
+        if (cst instanceof Type) {
+            resultCollector.addType((Type) cst);
         }
     }
 
     /** {@inheritDoc} */
-    public void visitMultiANewArrayInsn( final String desc, final int dims )
-    {
-        resultCollector.addDesc( desc );
+    public void visitMultiANewArrayInsn(final String desc, final int dims) {
+        resultCollector.addDesc(desc);
     }
 
     /** {@inheritDoc} */
-    public void visitTryCatchBlock( final Label start, final Label end, final Label handler, final String type )
-    {
-        resultCollector.addName( type );
+    public void visitTryCatchBlock(final Label start, final Label end, final Label handler, final String type) {
+        resultCollector.addName(type);
     }
 
     /** {@inheritDoc} */
-    public void visitLocalVariable( final String name, final String desc, final String signature, final Label start,
-                                    final Label end, final int index )
-    {
-        if ( signature == null )
-        {
-            resultCollector.addDesc( desc );
-        }
-        else
-        {
-            addTypeSignature( signature );
+    public void visitLocalVariable(
+            final String name,
+            final String desc,
+            final String signature,
+            final Label start,
+            final Label end,
+            final int index) {
+        if (signature == null) {
+            resultCollector.addDesc(desc);
+        } else {
+            addTypeSignature(signature);
         }
     }
 
-    private void addTypeSignature( final String signature )
-    {
-        if ( signature != null )
-        {
-            new SignatureReader( signature ).acceptType( signatureVisitor );
+    private void addTypeSignature(final String signature) {
+        if (signature != null) {
+            new SignatureReader(signature).acceptType(signatureVisitor);
         }
     }
 }
diff --git a/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/DefaultSignatureVisitor.java b/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/DefaultSignatureVisitor.java
index 4bd3e82..23b0858 100644
--- a/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/DefaultSignatureVisitor.java
+++ b/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/DefaultSignatureVisitor.java
@@ -1,5 +1,3 @@
-package org.apache.maven.shared.dependency.analyzer.asm;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@ package org.apache.maven.shared.dependency.analyzer.asm;
  * "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
+ *   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
@@ -18,6 +16,7 @@ package org.apache.maven.shared.dependency.analyzer.asm;
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.shared.dependency.analyzer.asm;
 
 import org.objectweb.asm.Opcodes;
 import org.objectweb.asm.signature.SignatureVisitor;
@@ -28,9 +27,7 @@ import org.objectweb.asm.signature.SignatureVisitor;
  *
  * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
  */
-public class DefaultSignatureVisitor
-    extends SignatureVisitor
-{
+public class DefaultSignatureVisitor extends SignatureVisitor {
     private final ResultCollector resultCollector;
 
     /**
@@ -38,21 +35,18 @@ public class DefaultSignatureVisitor
      *
      * @param resultCollector a {@link org.apache.maven.shared.dependency.analyzer.asm.ResultCollector} object.
      */
-    public DefaultSignatureVisitor( ResultCollector resultCollector )
-    {
-        super( Opcodes.ASM9 );
+    public DefaultSignatureVisitor(ResultCollector resultCollector) {
+        super(Opcodes.ASM9);
         this.resultCollector = resultCollector;
     }
 
     /** {@inheritDoc} */
-    public void visitClassType( final String name )
-    {
-        resultCollector.addName( name );
+    public void visitClassType(final String name) {
+        resultCollector.addName(name);
     }
 
     /** {@inheritDoc} */
-    public void visitInnerClassType( final String name )
-    {
-        resultCollector.addName( name );
+    public void visitInnerClassType(final String name) {
+        resultCollector.addName(name);
     }
 }
diff --git a/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/DependencyClassFileVisitor.java b/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/DependencyClassFileVisitor.java
index f8a1e79..8c1cd3d 100644
--- a/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/DependencyClassFileVisitor.java
+++ b/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/DependencyClassFileVisitor.java
@@ -1,5 +1,3 @@
-package org.apache.maven.shared.dependency.analyzer.asm;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@ package org.apache.maven.shared.dependency.analyzer.asm;
  * "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
+ *   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
@@ -18,19 +16,22 @@ package org.apache.maven.shared.dependency.analyzer.asm;
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.shared.dependency.analyzer.asm;
 
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Set;
 
+import org.apache.commons.io.IOUtils;
 import org.apache.maven.shared.dependency.analyzer.ClassFileVisitor;
-import org.codehaus.plexus.util.IOUtil;
 import org.objectweb.asm.AnnotationVisitor;
 import org.objectweb.asm.ClassReader;
 import org.objectweb.asm.ClassVisitor;
 import org.objectweb.asm.FieldVisitor;
 import org.objectweb.asm.MethodVisitor;
 import org.objectweb.asm.signature.SignatureVisitor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Computes the set of classes referenced by visited class files, using
@@ -39,50 +40,41 @@ import org.objectweb.asm.signature.SignatureVisitor;
  * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
  * @see #getDependencies()
  */
-public class DependencyClassFileVisitor
-    implements ClassFileVisitor
-{
+public class DependencyClassFileVisitor implements ClassFileVisitor {
     private final ResultCollector resultCollector = new ResultCollector();
 
+    private final Logger logger = LoggerFactory.getLogger(getClass());
+
     /**
      * <p>Constructor for DependencyClassFileVisitor.</p>
      */
-    public DependencyClassFileVisitor()
-    {
-    }
+    public DependencyClassFileVisitor() {}
 
     /** {@inheritDoc} */
-    public void visitClass( String className, InputStream in )
-    {
-        try
-        {
-            byte[] byteCode = IOUtil.toByteArray( in );
-            ClassReader reader = new ClassReader( byteCode );
+    public void visitClass(String className, InputStream in) {
+        try {
+            byte[] byteCode = IOUtils.toByteArray(in);
+            ClassReader reader = new ClassReader(byteCode);
 
-            final Set<String> constantPoolClassRefs = ConstantPoolParser.getConstantPoolClassReferences( byteCode );
-            for ( String string : constantPoolClassRefs )
-            {
-                resultCollector.addName( string );
+            final Set<String> constantPoolClassRefs = ConstantPoolParser.getConstantPoolClassReferences(byteCode);
+            for (String string : constantPoolClassRefs) {
+                resultCollector.addName(string);
             }
 
-            AnnotationVisitor annotationVisitor = new DefaultAnnotationVisitor( resultCollector );
-            SignatureVisitor signatureVisitor = new DefaultSignatureVisitor( resultCollector );
-            FieldVisitor fieldVisitor = new DefaultFieldVisitor( annotationVisitor, resultCollector );
-            MethodVisitor mv = new DefaultMethodVisitor( annotationVisitor, signatureVisitor, resultCollector );
+            AnnotationVisitor annotationVisitor = new DefaultAnnotationVisitor(resultCollector);
+            SignatureVisitor signatureVisitor = new DefaultSignatureVisitor(resultCollector);
+            FieldVisitor fieldVisitor = new DefaultFieldVisitor(annotationVisitor, resultCollector);
+            MethodVisitor mv = new DefaultMethodVisitor(annotationVisitor, signatureVisitor, resultCollector);
             ClassVisitor classVisitor =
-                new DefaultClassVisitor( signatureVisitor, annotationVisitor, fieldVisitor, mv, resultCollector );
+                    new DefaultClassVisitor(signatureVisitor, annotationVisitor, fieldVisitor, mv, resultCollector);
 
-            reader.accept( classVisitor, 0 );
-        }
-        catch ( IOException exception )
-        {
+            reader.accept(classVisitor, 0);
+        } catch (IOException exception) {
             exception.printStackTrace();
-        }
-        catch ( IndexOutOfBoundsException e )
-        {
+        } catch (IndexOutOfBoundsException e) {
             // some bug inside ASM causes an IOB exception. Log it and move on?
             // this happens when the class isn't valid.
-            System.out.println( "Unable to process: " + className );
+            logger.warn("Unable to process: " + className);
         }
     }
 
@@ -91,8 +83,7 @@ public class DependencyClassFileVisitor
      *
      * @return the set of classes referenced by visited class files
      */
-    public Set<String> getDependencies()
-    {
+    public Set<String> getDependencies() {
         return resultCollector.getDependencies();
     }
 }
diff --git a/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/ResultCollector.java b/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/ResultCollector.java
index 970d5cf..f42065f 100644
--- a/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/ResultCollector.java
+++ b/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/ResultCollector.java
@@ -1,5 +1,3 @@
-package org.apache.maven.shared.dependency.analyzer.asm;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@ package org.apache.maven.shared.dependency.analyzer.asm;
  * "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
+ *   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
@@ -18,6 +16,7 @@ package org.apache.maven.shared.dependency.analyzer.asm;
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.shared.dependency.analyzer.asm;
 
 import java.util.HashSet;
 import java.util.Set;
@@ -29,8 +28,7 @@ import org.objectweb.asm.Type;
  *
  * @author Kristian Rosenvold
  */
-public class ResultCollector
-{
+public class ResultCollector {
 
     private final Set<String> classes = new HashSet<>();
 
@@ -39,8 +37,7 @@ public class ResultCollector
      *
      * @return a {@link java.util.Set} object.
      */
-    public Set<String> getDependencies()
-    {
+    public Set<String> getDependencies() {
         return classes;
     }
 
@@ -49,49 +46,40 @@ public class ResultCollector
      *
      * @param name a {@link java.lang.String} object.
      */
-    public void addName( String name )
-    {
-        if ( name == null )
-        {
+    public void addName(String name) {
+        if (name == null) {
             return;
         }
 
         // decode arrays
-        if ( name.charAt( 0 ) == '[' )
-        {
+        if (name.charAt(0) == '[') {
             int i = 0;
-            do
-            {
+            do {
                 ++i;
-            }
-            while ( name.charAt( i ) == '[' ); // could have array of array ...
-            if ( name.charAt( i ) != 'L' )
-            {
+            } while (name.charAt(i) == '['); // could have array of array ...
+            if (name.charAt(i) != 'L') {
                 // ignore array of scalar types
                 return;
             }
-            name = name.substring( i + 1, name.length() - 1 );
+            name = name.substring(i + 1, name.length() - 1);
         }
 
         // decode internal representation
-        add( name.replace( '/', '.' ) );
+        add(name.replace('/', '.'));
     }
 
-    void addDesc( final String desc )
-    {
-        addType( Type.getType( desc ) );
+    void addDesc(final String desc) {
+        addType(Type.getType(desc));
     }
 
-    void addType( final Type t )
-    {
-        switch ( t.getSort() )
-        {
+    void addType(final Type t) {
+        switch (t.getSort()) {
             case Type.ARRAY:
-                addType( t.getElementType() );
+                addType(t.getElementType());
                 break;
 
             case Type.OBJECT:
-                addName( t.getClassName() );
+                addName(t.getClassName());
                 break;
 
             default:
@@ -103,37 +91,30 @@ public class ResultCollector
      *
      * @param name a {@link java.lang.String} object.
      */
-    public void add( String name )
-    {
+    public void add(String name) {
         // inner classes have equivalent compilation requirement as container class
-        if ( name.indexOf( '$' ) < 0 )
-        {
-            classes.add( name );
+        if (name.indexOf('$') < 0) {
+            classes.add(name);
         }
     }
 
-    void addNames( final String[] names )
-    {
-        if ( names == null )
-        {
+    void addNames(final String[] names) {
+        if (names == null) {
             return;
         }
 
-        for ( String name : names )
-        {
-            addName( name );
+        for (String name : names) {
+            addName(name);
         }
     }
 
-    void addMethodDesc( final String desc )
-    {
-        addType( Type.getReturnType( desc ) );
+    void addMethodDesc(final String desc) {
+        addType(Type.getReturnType(desc));
 
-        Type[] types = Type.getArgumentTypes( desc );
+        Type[] types = Type.getArgumentTypes(desc);
 
-        for ( Type type : types )
-        {
-            addType( type );
+        for (Type type : types) {
+            addType(type);
         }
     }
 }
diff --git a/src/site/xdoc/download.xml.vm b/src/site/xdoc/download.xml.vm
index 666d997..2b848a9 100644
--- a/src/site/xdoc/download.xml.vm
+++ b/src/site/xdoc/download.xml.vm
@@ -23,102 +23,51 @@ under the License.
   <properties>
     <title>Download ${project.name} Source</title>
   </properties>
+
   <body>
     <section name="Download ${project.name} ${project.version} Source">
 
-      <p>${project.name} ${project.version} is distributed in source format. Use a source archive if you intend to build
-      ${project.name} yourself. Otherwise, simply use the ready-made binary artifacts from central repository.</p>
-
-      <p>You will be prompted for a mirror - if the file is not found on yours, please be patient, as it may take 24
-      hours to reach all mirrors.<p/>
-
-      <p>In order to guard against corrupted downloads/installations, it is highly recommended to
-      <a href="http://www.apache.org/dev/release-signing#verifying-signature">verify the signature</a>
-      of the release bundles against the public <a href="https://www.apache.org/dist/maven/KEYS">KEYS</a> used by the Apache Maven
-      developers.</p>
+      <p><strong>${project.name} ${project.version}</strong> is distributed in source format.</p>
 
-      <p>${project.name} is distributed under the <a href="http://www.apache.org/licenses/">Apache License, version 2.0</a>.</p>
+      <p>Use a source archive if you intend to build <strong>${project.name}</strong> yourself.</p>
 
-      <p></p>We <b>strongly</b> encourage our users to configure a Maven repository mirror closer to their location, please read <a href="/guides/mini/guide-mirror-settings.html">How to Use Mirrors for Repositories</a>.</p>
-
-      <a name="mirror"/>
-      <subsection name="Mirror">
-
-        <p>
-          [if-any logo]
-          <a href="[link]">
-            <img align="right" src="[logo]" border="0"
-                 alt="logo"/>
-          </a>
-          [end]
-          The currently selected mirror is
-          <b>[preferred]</b>.
-          If you encounter a problem with this mirror,
-          please select another mirror.
-          If all mirrors are failing, there are
-          <i>backup</i>
-          mirrors
-          (at the end of the mirrors list) that should be available.
-        </p>
+      <p>Otherwise, simply use the ready-made binary artifacts from <strong>central repository</strong>.</p>
 
-        <form action="[location]" method="get" id="SelectMirror">
-          Other mirrors:
-          <select name="Preferred">
-            [if-any http]
-            [for http]
-            <option value="[http]">[http]</option>
-            [end]
-            [end]
-            [if-any ftp]
-            [for ftp]
-            <option value="[ftp]">[ftp]</option>
-            [end]
-            [end]
-            [if-any backup]
-            [for backup]
-            <option value="[backup]">[backup] (backup)</option>
-            [end]
-            [end]
-          </select>
-          <input type="submit" value="Change"/>
-        </form>
+      <p><strong>${project.name}</strong> is distributed under the <a href="https://www.apache.org/licenses/">Apache License, version 2.0</a>.</p>
 
-        <p>
-          You may also consult the
-          <a href="http://www.apache.org/mirrors/">complete list of
-            mirrors.</a>
+      <subsection name="Files">
+        
+        <p>This is the current stable version of <strong>${project.name}</strong>.</p>
+
+        <table>
+          <thead>
+            <tr>
+              <th></th>
+              <th>Link</th>
+              <th>Checksum</th>
+              <th>Signature</th>
+            </tr>
+          </thead>
+          <tbody>
+            <tr>
+              <td>${project.name} ${project.version} (Source zip)</td>
+              <td><a href="https://dlcdn.apache.org/maven/shared/${project.artifactId}-${project.version}-source-release.zip">${project.artifactId}-${project.version}-source-release.zip</a></td>
+              <td><a href="https://downloads.apache.org/maven/shared/${project.artifactId}-${project.version}-source-release.zip.sha512">${project.artifactId}-${project.version}-source-release.zip.sha512</a></td>
+              <td><a href="https://downloads.apache.org/maven/shared/${project.artifactId}-${project.version}-source-release.zip.asc">${project.artifactId}-${project.version}-source-release.zip.asc</a></td>
+            </tr>
+          </tbody>
+        </table>
+
+        <p>It is essential that you <a href="https://www.apache.org/info/verification.html">verify the integrity</a> of the downloaded file
+          using the checksum (.sha512 file)
+          or using the signature (.asc file) against the public <a href="https://downloads.apache.org/maven/KEYS">KEYS</a> used by the Apache Maven developers.
         </p>
 
       </subsection>
-      
-      <subsection name="${project.name} ${project.version}">
-        
-      <p>This is the current stable version of ${project.name}.</p>
-        
-      <table>
-        <thead>
-          <tr>
-            <th></th>
-            <th>Link</th>
-            <th>Checksum</th>
-            <th>Signature</th>
-          </tr>
-        </thead>
-        <tbody>
-          <tr>
-            <td>${project.name} ${project.version} (Source zip)</td>
-            <td><a href="[preferred]maven/shared/${project.artifactId}-${project.version}-source-release.zip">maven/shared/${project.artifactId}-${project.version}-source-release.zip</a></td>
-            <td><a href="https://www.apache.org/dist/maven/shared/${project.artifactId}-${project.version}-source-release.zip.sha512">maven/shared/${project.artifactId}-${project.version}-source-release.zip.sha512</a></td>
-            <td><a href="https://www.apache.org/dist/maven/shared/${project.artifactId}-${project.version}-source-release.zip.asc">maven/shared/${project.artifactId}-${project.version}-source-release.zip.asc</a></td>
-          </tr>
-        </tbody>
-      </table>
-      </subsection>
 
       <subsection name="Previous Versions">
-        
-      <p>Older non-recommended releases can be found on our <a href="http://archive.apache.org/dist/maven/shared/">archive site</a>.</p>
-
+        <p>It is strongly recommended to use the latest release version of <strong>${project.name}</strong> to take advantage of the newest features and bug fixes.</p>
+        <p>Older non-recommended releases can be found on our <a href="https://archive.apache.org/dist/maven/shared/">archive site</a>.</p>
       </subsection>
     </section>
   </body>
diff --git a/src/test/java/org/apache/maven/shared/dependency/analyzer/ClassFileVisitorUtilsTest.java b/src/test/java/org/apache/maven/shared/dependency/analyzer/ClassFileVisitorUtilsTest.java
index e1d1f87..fb644e8 100644
--- a/src/test/java/org/apache/maven/shared/dependency/analyzer/ClassFileVisitorUtilsTest.java
+++ b/src/test/java/org/apache/maven/shared/dependency/analyzer/ClassFileVisitorUtilsTest.java
@@ -1,5 +1,3 @@
-package org.apache.maven.shared.dependency.analyzer;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@ package org.apache.maven.shared.dependency.analyzer;
  * "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
+ *   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
@@ -18,16 +16,12 @@ package org.apache.maven.shared.dependency.analyzer;
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.shared.dependency.analyzer;
 
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.IOUtils;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.io.File;
-import java.io.FileOutputStream;
+import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.net.URL;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
@@ -37,162 +31,130 @@ import java.util.List;
 import java.util.jar.JarOutputStream;
 import java.util.zip.ZipEntry;
 
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
+
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.fail;
 
 /**
  * Tests <code>ClassFileVisitorUtils</code>.
- * 
+ *
  * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
  * @see ClassFileVisitorUtils
  */
-public class ClassFileVisitorUtilsTest
-{
-    private MockVisitor visitor;
+class ClassFileVisitorUtilsTest {
+
+    @TempDir
+    private Path tempDir;
+
+    private TestVisitor visitor = new TestVisitor();
 
-    private static class MockVisitor implements ClassFileVisitor
-    {
+    private static class TestVisitor implements ClassFileVisitor {
         final List<String> classNames = new ArrayList<>();
+
         final List<String> data = new ArrayList<>();
 
         @Override
-        public void visitClass( String className, InputStream in )
-        {
-            classNames.add( className );
-            try
-            {
-                List<String> lines = IOUtils.readLines( in, StandardCharsets.UTF_8 );
-                data.addAll( lines );
-            }
-            catch ( IOException ex )
-            {
-                throw new RuntimeException( ex );
-            }
+        public void visitClass(String className, InputStream in) {
+            classNames.add(className);
+            BufferedReader reader = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8));
+            reader.lines().forEach(data::add);
         }
     }
 
-    @Before
-    public void setUp()
-    {
-        visitor = new MockVisitor();
-    }
-
     @Test
-    public void testAcceptJar() throws IOException
-    {
-        File file = File.createTempFile( "test", ".jar" );
-        file.deleteOnExit();
-
-        try ( JarOutputStream out = new JarOutputStream( new FileOutputStream( file ) ) )
-        {
-            addZipEntry( out, "a/b/c.class", "class a.b.c" );
-            addZipEntry( out, "x/y/z.class", "class x.y.z" );
+    void testAcceptJar() throws IOException {
+        Path path = Files.createTempFile(tempDir, "test", ".jar");
+
+        try (JarOutputStream out = new JarOutputStream(Files.newOutputStream(path))) {
+            addZipEntry(out, "a/b/c.class", "class a.b.c");
+            addZipEntry(out, "x/y/z.class", "class x.y.z");
         }
 
-        ClassFileVisitorUtils.accept( file.toURI().toURL(), visitor );
+        ClassFileVisitorUtils.accept(path.toUri().toURL(), visitor);
 
-        assertThat( visitor.classNames ).contains( "a.b.c" );
-        assertThat( visitor.classNames ).contains( "x.y.z" );
-        assertThat( visitor.data ).contains( "class a.b.c" );
-        assertThat( visitor.data ).contains( "class x.y.z" );
+        assertThat(visitor.classNames).contains("a.b.c");
+        assertThat(visitor.classNames).contains("x.y.z");
+        assertThat(visitor.data).contains("class a.b.c");
+        assertThat(visitor.data).contains("class x.y.z");
     }
 
     @Test
-    public void testAcceptJarWithNonClassEntry() throws IOException
-    {
-        File file = File.createTempFile( "test", ".jar" );
-        file.deleteOnExit();
-
-        try ( JarOutputStream out = new JarOutputStream( new FileOutputStream( file ) ) )
-        {
-            addZipEntry( out, "a/b/c.jpg", "jpeg a.b.c" );
+    void testAcceptJarWithNonClassEntry() throws IOException {
+        Path path = Files.createTempFile(tempDir, "test", ".jar");
+
+        try (JarOutputStream out = new JarOutputStream(Files.newOutputStream(path))) {
+            addZipEntry(out, "a/b/c.jpg", "jpeg a.b.c");
         }
 
-        ClassFileVisitorUtils.accept( file.toURI().toURL(), visitor );
+        ClassFileVisitorUtils.accept(path.toUri().toURL(), visitor);
 
-        assertThat( visitor.classNames ) .isEmpty();
+        assertThat(visitor.classNames).isEmpty();
     }
 
     @Test
-    public void testAcceptDir() throws IOException
-    {
-        Path dir = Files.createTempDirectory( "d-a-test" );
+    void testAcceptDir() throws IOException {
+        Path dir = Files.createTempDirectory(tempDir, "d-a-test");
 
-        Path abDir = Files.createDirectories( dir.resolve( "a/b" ) );
-        writeToFile( abDir, "c.class", "class a.b.c" );
+        Path abDir = Files.createDirectories(dir.resolve("a/b"));
+        writeToFile(abDir, "c.class", "class a.b.c");
 
-        Path xyDir = Files.createDirectories( dir.resolve( "x/y" ) );
-        writeToFile( xyDir, "z.class", "class x.y.z" );
+        Path xyDir = Files.createDirectories(dir.resolve("x/y"));
+        writeToFile(xyDir, "z.class", "class x.y.z");
 
-        ClassFileVisitorUtils.accept( dir.toUri().toURL(), visitor );
+        ClassFileVisitorUtils.accept(dir.toUri().toURL(), visitor);
 
-        FileUtils.deleteDirectory( dir.toFile() );
-
-        assertThat( visitor.classNames ).contains( "a.b.c" );
-        assertThat( visitor.classNames ).contains( "x.y.z" );
-        assertThat( visitor.data ).contains( "class a.b.c" );
-        assertThat( visitor.data ).contains( "class x.y.z" );
+        assertThat(visitor.classNames).contains("a.b.c");
+        assertThat(visitor.classNames).contains("x.y.z");
+        assertThat(visitor.data).contains("class a.b.c");
+        assertThat(visitor.data).contains("class x.y.z");
     }
 
     @Test
-    public void testAcceptDirWithNonClassFile() throws IOException
-    {
-        Path dir = Files.createTempDirectory( "d-a-test" );
-
-        Path abDir = Files.createDirectories( dir.resolve( "a/b" ) );
-        writeToFile( abDir, "c.jpg", "jpeg a.b.c" );
+    void testAcceptDirWithNonClassFile() throws IOException {
+        Path dir = Files.createTempDirectory(tempDir, "d-a-test");
 
-        ClassFileVisitorUtils.accept( dir.toUri().toURL(), visitor );
+        Path abDir = Files.createDirectories(dir.resolve("a/b"));
+        writeToFile(abDir, "c.jpg", "jpeg a.b.c");
 
-        FileUtils.deleteDirectory( dir.toFile() );
+        ClassFileVisitorUtils.accept(dir.toUri().toURL(), visitor);
 
-        assertThat( visitor.classNames ).isEmpty();
+        assertThat(visitor.classNames).isEmpty();
     }
 
     @Test
-    public void testAcceptWithFile() throws IOException
-    {
-        File file = File.createTempFile( "test", ".class" );
-        file.deleteOnExit();
-
-        URL url = file.toURI().toURL();
-
-        try
-        {
-            ClassFileVisitorUtils.accept( url, visitor );
-            fail( "expected IllegalArgumentException" );
-        }
-        catch ( IllegalArgumentException exception )
-        {
-            assertThat( exception ).hasMessage( "Cannot accept visitor on URL: " + url );
+    void testAcceptWithFile() throws IOException {
+        Path path = Files.createTempFile(tempDir, "test", ".class");
+        URL url = path.toUri().toURL();
+
+        try {
+            ClassFileVisitorUtils.accept(url, visitor);
+            fail("expected IllegalArgumentException");
+        } catch (IllegalArgumentException exception) {
+            assertThat(exception).hasMessage("Cannot accept visitor on URL: " + url);
         }
     }
 
     @Test
-    public void testAcceptWithUnsupportedScheme() throws IOException
-    {
-        URL url = new URL( "http://localhost/" );
-
-        try
-        {
-            ClassFileVisitorUtils.accept( url, visitor );
-            fail( "expected IllegalArgumentException" );
-        }
-        catch ( IllegalArgumentException exception )
-        {
-            assertThat( exception ).hasMessage( "Cannot accept visitor on URL: " + url );
+    void testAcceptWithUnsupportedScheme() throws IOException {
+        URL url = new URL("http://localhost/");
+
+        try {
+            ClassFileVisitorUtils.accept(url, visitor);
+            fail("expected IllegalArgumentException");
+        } catch (IllegalArgumentException exception) {
+            assertThat(exception).hasMessage("Cannot accept visitor on URL: " + url);
         }
     }
 
-    private void writeToFile( Path parent, String file, String data ) throws IOException
-    {
-        Files.write( parent.resolve( file ), data.getBytes( StandardCharsets.UTF_8 ) );
+    private void writeToFile(Path parent, String file, String data) throws IOException {
+        Files.write(parent.resolve(file), data.getBytes(StandardCharsets.UTF_8));
     }
 
-    private void addZipEntry( JarOutputStream out, String fileName, String content ) throws IOException
-    {
-        out.putNextEntry( new ZipEntry( fileName ) );
-        byte[] bytes = content.getBytes( StandardCharsets.UTF_8 );
-        out.write( bytes, 0, bytes.length );
+    private void addZipEntry(JarOutputStream out, String fileName, String content) throws IOException {
+        out.putNextEntry(new ZipEntry(fileName));
+        byte[] bytes = content.getBytes(StandardCharsets.UTF_8);
+        out.write(bytes, 0, bytes.length);
     }
 }
diff --git a/src/test/java/org/apache/maven/shared/dependency/analyzer/CollectorClassFileVisitorTest.java b/src/test/java/org/apache/maven/shared/dependency/analyzer/CollectorClassFileVisitorTest.java
index 37579b1..9ae1faf 100644
--- a/src/test/java/org/apache/maven/shared/dependency/analyzer/CollectorClassFileVisitorTest.java
+++ b/src/test/java/org/apache/maven/shared/dependency/analyzer/CollectorClassFileVisitorTest.java
@@ -1,5 +1,3 @@
-package org.apache.maven.shared.dependency.analyzer;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@ package org.apache.maven.shared.dependency.analyzer;
  * "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
+ *   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
@@ -18,13 +16,14 @@ package org.apache.maven.shared.dependency.analyzer;
  * specific language governing permissions and limitations
  * under the License.
  */
-
-import org.junit.Before;
-import org.junit.Test;
+package org.apache.maven.shared.dependency.analyzer;
 
 import java.util.HashSet;
 import java.util.Set;
 
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
 import static org.assertj.core.api.Assertions.assertThat;
 
 /**
@@ -33,26 +32,23 @@ import static org.assertj.core.api.Assertions.assertThat;
  * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
  * @see CollectorClassFileVisitor
  */
-public class CollectorClassFileVisitorTest
-{
+class CollectorClassFileVisitorTest {
     private CollectorClassFileVisitor visitor;
 
-    @Before
-    public void setUp()
-    {
+    @BeforeEach
+    void setUp() {
         visitor = new CollectorClassFileVisitor();
     }
 
     @Test
-    public void testVisitClass()
-    {
-        visitor.visitClass( "a.b.c", null );
-        visitor.visitClass( "x.y.z", null );
+    void testVisitClass() {
+        visitor.visitClass("a.b.c", null);
+        visitor.visitClass("x.y.z", null);
 
         Set<String> expected = new HashSet<>();
-        expected.add( "a.b.c" );
-        expected.add( "x.y.z" );
+        expected.add("a.b.c");
+        expected.add("x.y.z");
 
-        assertThat( visitor.getClasses() ).isEqualTo( expected );
+        assertThat(visitor.getClasses()).isEqualTo(expected);
     }
 }
diff --git a/src/test/java/org/apache/maven/shared/dependency/analyzer/DefaultClassAnalyzerTest.java b/src/test/java/org/apache/maven/shared/dependency/analyzer/DefaultClassAnalyzerTest.java
index 9bdfdb4..5edb864 100644
--- a/src/test/java/org/apache/maven/shared/dependency/analyzer/DefaultClassAnalyzerTest.java
+++ b/src/test/java/org/apache/maven/shared/dependency/analyzer/DefaultClassAnalyzerTest.java
@@ -1,5 +1,3 @@
-package org.apache.maven.shared.dependency.analyzer;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@ package org.apache.maven.shared.dependency.analyzer;
  * "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
+ *   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
@@ -18,14 +16,9 @@ package org.apache.maven.shared.dependency.analyzer;
  * specific language governing permissions and limitations
  * under the License.
  */
-
-import org.codehaus.plexus.util.IOUtil;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
+package org.apache.maven.shared.dependency.analyzer;
 
 import java.io.ByteArrayOutputStream;
-import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
@@ -37,6 +30,10 @@ import java.util.jar.JarOutputStream;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipException;
 
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
+
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.fail;
 
@@ -46,75 +43,57 @@ import static org.assertj.core.api.Assertions.fail;
  * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
  * @see DefaultClassAnalyzer
  */
-public class DefaultClassAnalyzerTest
-{
-    private Path file;
+class DefaultClassAnalyzerTest {
 
-    @Before
-    public void setUp() throws IOException
-    {
-        file = Files.createTempFile( "test", ".jar" );
-        try ( JarOutputStream out = new JarOutputStream( new FileOutputStream( file.toFile() ) ) )
-        {
-            addZipEntry( out, "a/b/c.class", "class a.b.c" );
-            addZipEntry( out, "x/y/z.class", "class x.y.z" );
-        }
-    }
+    @TempDir
+    private Path tempDir;
 
-    @After
-    public void cleanup() throws IOException
-    {
-        if ( file != null )
-        {
-            Files.deleteIfExists( file );
+    private Path file;
+
+    @BeforeEach
+    void setUp() throws IOException {
+        file = Files.createTempFile(tempDir, "test", ".jar");
+        try (JarOutputStream out = new JarOutputStream(new FileOutputStream(file.toFile()))) {
+            addZipEntry(out, "a/b/c.class", "class a.b.c");
+            addZipEntry(out, "x/y/z.class", "class x.y.z");
         }
     }
 
     @Test
-    public void testAnalyzeWithJar() throws IOException
-    {
+    void testAnalyzeWithJar() throws IOException {
         Set<String> expectedClasses = new HashSet<>();
-        expectedClasses.add( "a.b.c" );
-        expectedClasses.add( "x.y.z" );
+        expectedClasses.add("a.b.c");
+        expectedClasses.add("x.y.z");
 
         DefaultClassAnalyzer analyzer = new DefaultClassAnalyzer();
-        Set<String> actualClasses = analyzer.analyze( file.toUri().toURL() );
+        Set<String> actualClasses = analyzer.analyze(file.toUri().toURL());
 
-        assertThat( actualClasses ).isEqualTo( expectedClasses );
+        assertThat(actualClasses).isEqualTo(expectedClasses);
     }
 
     @Test
-    public void testAnalyzeBadJar() throws IOException
-    {
-        //to reproduce MDEP-143
+    void testAnalyzeBadJar() throws IOException {
+        // to reproduce MDEP-143
         // corrupt the jar file by altering its contents
-        FileInputStream fis = new FileInputStream( file.toFile() );
-        ByteArrayOutputStream baos = new ByteArrayOutputStream( 100 );
-        IOUtil.copy( fis, baos, 100 );
-        fis.close();
+        ByteArrayOutputStream baos = new ByteArrayOutputStream(100);
+        Files.copy(file, baos);
         byte[] ba = baos.toByteArray();
         ba[50] = 1;
-        FileOutputStream fos = new FileOutputStream( file.toFile() );
-        IOUtil.copy( ba, fos );
-        fos.close();
+        Files.write(file, ba);
 
         ClassAnalyzer analyzer = new DefaultClassAnalyzer();
 
-        try
-        {
-            analyzer.analyze( file.toUri().toURL() );
-            fail( "Exception expected" );
-        }
-        catch ( ZipException e )
-        {
-            assertThat( e ).hasMessageStartingWith( "Cannot process Jar entry on URL:" );
+        try {
+            analyzer.analyze(file.toUri().toURL());
+            fail("Exception expected");
+        } catch (ZipException e) {
+            assertThat(e).hasMessageStartingWith("Cannot process Jar entry on URL:");
         }
     }
 
-    private void addZipEntry( JarOutputStream out, String fileName, String content ) throws IOException
-    {
-        out.putNextEntry( new ZipEntry( fileName ) );
-        byte[] bytes = content.getBytes( StandardCharsets.UTF_8 );
-        out.write( bytes, 0, bytes.length );
+    private void addZipEntry(JarOutputStream out, String fileName, String content) throws IOException {
+        out.putNextEntry(new ZipEntry(fileName));
+        byte[] bytes = content.getBytes(StandardCharsets.UTF_8);
+        out.write(bytes, 0, bytes.length);
     }
 }
diff --git a/src/test/java/org/apache/maven/shared/dependency/analyzer/ProjectDependencyAnalysisTest.java b/src/test/java/org/apache/maven/shared/dependency/analyzer/ProjectDependencyAnalysisTest.java
index 09e519d..f7389e9 100644
--- a/src/test/java/org/apache/maven/shared/dependency/analyzer/ProjectDependencyAnalysisTest.java
+++ b/src/test/java/org/apache/maven/shared/dependency/analyzer/ProjectDependencyAnalysisTest.java
@@ -1,5 +1,3 @@
-package org.apache.maven.shared.dependency.analyzer;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@ package org.apache.maven.shared.dependency.analyzer;
  * "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
+ *   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
@@ -18,6 +16,7 @@ package org.apache.maven.shared.dependency.analyzer;
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.shared.dependency.analyzer;
 
 import java.util.Arrays;
 import java.util.HashSet;
@@ -26,7 +25,7 @@ import java.util.Set;
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.DefaultArtifact;
 import org.apache.maven.artifact.versioning.VersionRange;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
@@ -36,59 +35,51 @@ import static org.assertj.core.api.Assertions.assertThat;
  * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
  * @see ProjectDependencyAnalysis
  */
-public class ProjectDependencyAnalysisTest
-{
+class ProjectDependencyAnalysisTest {
     @Test
-    public void testConstructor()
-    {
+    void testConstructor() {
         Set<Artifact> usedDeclaredArtifacts = new HashSet<>();
         Set<Artifact> usedUndeclaredArtifacts = new HashSet<>();
         Set<Artifact> unusedDeclaredArtifacts = new HashSet<>();
         Set<Artifact> testArtifactsWithNonTestScope = new HashSet<>();
 
-        ProjectDependencyAnalysis analysis =
-            new ProjectDependencyAnalysis( usedDeclaredArtifacts, usedUndeclaredArtifacts, unusedDeclaredArtifacts,
-                testArtifactsWithNonTestScope );
+        ProjectDependencyAnalysis analysis = new ProjectDependencyAnalysis(
+                usedDeclaredArtifacts, usedUndeclaredArtifacts, unusedDeclaredArtifacts, testArtifactsWithNonTestScope);
 
-        assertThat( analysis.getUsedDeclaredArtifacts() ).isEqualTo( usedDeclaredArtifacts );
-        assertThat( analysis.getUsedUndeclaredArtifacts() ).isEqualTo( usedUndeclaredArtifacts );
-        assertThat( analysis.getUnusedDeclaredArtifacts() ).isEqualTo( unusedDeclaredArtifacts );
+        assertThat(analysis.getUsedDeclaredArtifacts()).isEqualTo(usedDeclaredArtifacts);
+        assertThat(analysis.getUsedUndeclaredArtifacts()).isEqualTo(usedUndeclaredArtifacts);
+        assertThat(analysis.getUnusedDeclaredArtifacts()).isEqualTo(unusedDeclaredArtifacts);
     }
 
     @Test
-    public void ignoreNonCompileShouldFilterOnlyUnusedDeclare()
-    {
-        Artifact artifactCompile = aTestArtifact( "test1", Artifact.SCOPE_COMPILE );
-        Artifact artifactProvided = aTestArtifact( "test2", Artifact.SCOPE_PROVIDED );
-        Artifact artifactTest = aTestArtifact( "test3", Artifact.SCOPE_TEST );
+    void ignoreNonCompileShouldFilterOnlyUnusedDeclare() {
+        Artifact artifactCompile = aTestArtifact("test1", Artifact.SCOPE_COMPILE);
+        Artifact artifactProvided = aTestArtifact("test2", Artifact.SCOPE_PROVIDED);
+        Artifact artifactTest = aTestArtifact("test3", Artifact.SCOPE_TEST);
 
         ProjectDependencyAnalysis analysis = new ProjectDependencyAnalysis(
-            asSet( artifactCompile, artifactProvided, artifactTest ),
-            asSet( artifactCompile, artifactProvided, artifactTest ),
-            asSet( artifactCompile, artifactProvided, artifactTest ),
-            asSet( artifactCompile, artifactProvided, artifactTest ) );
+                asSet(artifactCompile, artifactProvided, artifactTest),
+                asSet(artifactCompile, artifactProvided, artifactTest),
+                asSet(artifactCompile, artifactProvided, artifactTest),
+                asSet(artifactCompile, artifactProvided, artifactTest));
 
         ProjectDependencyAnalysis compileOnlyAnalysis = analysis.ignoreNonCompile();
 
-        assertThat( compileOnlyAnalysis.getUsedDeclaredArtifacts() ).hasSize( 3 );
-        assertThat( compileOnlyAnalysis.getUsedUndeclaredArtifacts() ).hasSize( 3 );
+        assertThat(compileOnlyAnalysis.getUsedDeclaredArtifacts()).hasSize(3);
+        assertThat(compileOnlyAnalysis.getUsedUndeclaredArtifacts()).hasSize(3);
 
-        assertThat( compileOnlyAnalysis.getUnusedDeclaredArtifacts() )
-            .hasSize( 1 )
-            .allSatisfy( a -> assertThat( a.getScope() ).isEqualTo( Artifact.SCOPE_COMPILE ) );
+        assertThat(compileOnlyAnalysis.getUnusedDeclaredArtifacts()).hasSize(1).allSatisfy(a -> assertThat(a.getScope())
+                .isEqualTo(Artifact.SCOPE_COMPILE));
 
-        assertThat( compileOnlyAnalysis.getTestArtifactsWithNonTestScope() )
-            .hasSize( 3 );
+        assertThat(compileOnlyAnalysis.getTestArtifactsWithNonTestScope()).hasSize(3);
     }
 
-    private <T> Set<T> asSet( T... items )
-    {
-        return new HashSet<>( Arrays.asList( items ) );
+    private <T> Set<T> asSet(T... items) {
+        return new HashSet<>(Arrays.asList(items));
     }
 
-    private Artifact aTestArtifact( String artifactId, String scope )
-    {
-        return new DefaultArtifact( "groupId", artifactId, VersionRange.createFromVersion( "1.0" ),
-            scope, "jar", "", null );
+    private Artifact aTestArtifact(String artifactId, String scope) {
+        return new DefaultArtifact(
+                "groupId", artifactId, VersionRange.createFromVersion("1.0"), scope, "jar", "", null);
     }
 }
diff --git a/src/test/java/org/apache/maven/shared/dependency/analyzer/ProjectDependencyAnalyzerExceptionTest.java b/src/test/java/org/apache/maven/shared/dependency/analyzer/ProjectDependencyAnalyzerExceptionTest.java
index eece33e..1d2f72c 100644
--- a/src/test/java/org/apache/maven/shared/dependency/analyzer/ProjectDependencyAnalyzerExceptionTest.java
+++ b/src/test/java/org/apache/maven/shared/dependency/analyzer/ProjectDependencyAnalyzerExceptionTest.java
@@ -1,5 +1,3 @@
-package org.apache.maven.shared.dependency.analyzer;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@ package org.apache.maven.shared.dependency.analyzer;
  * "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
+ *   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
@@ -18,31 +16,29 @@ package org.apache.maven.shared.dependency.analyzer;
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.shared.dependency.analyzer;
 
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
 /**
  * Tests <code>ProjectDependencyAnalyzerException</code>.
- * 
+ *
  * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
  * @see ProjectDependencyAnalyzerException
  */
-public class ProjectDependencyAnalyzerExceptionTest
-{
+class ProjectDependencyAnalyzerExceptionTest {
     @Test
-    public void testConstructor()
-    {
-        assertThat( new ProjectDependencyAnalyzerException( "a" ) ).hasMessage( "a" );
+    void testConstructor() {
+        assertThat(new ProjectDependencyAnalyzerException("a")).hasMessage("a");
     }
 
     @Test
-    public void testConstructorWithThrowable()
-    {
+    void testConstructorWithThrowable() {
         Throwable throwable = new Exception();
-        ProjectDependencyAnalyzerException exception = new ProjectDependencyAnalyzerException( "a", throwable );
+        ProjectDependencyAnalyzerException exception = new ProjectDependencyAnalyzerException("a", throwable);
 
-        assertThat( exception ).hasMessage( "a" ).hasCause( throwable );
+        assertThat(exception).hasMessage("a").hasCause(throwable);
     }
 }
diff --git a/src/test/java/org/apache/maven/shared/dependency/analyzer/asm/ASMDependencyAnalyzerTest.java b/src/test/java/org/apache/maven/shared/dependency/analyzer/asm/ASMDependencyAnalyzerTest.java
index 27623e3..cecf685 100644
--- a/src/test/java/org/apache/maven/shared/dependency/analyzer/asm/ASMDependencyAnalyzerTest.java
+++ b/src/test/java/org/apache/maven/shared/dependency/analyzer/asm/ASMDependencyAnalyzerTest.java
@@ -1,46 +1,43 @@
-package org.apache.maven.shared.dependency.analyzer.asm;
-
-/*
- * 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.net.URL;
-import java.util.Set;
-
-import org.apache.maven.shared.dependency.analyzer.DependencyAnalyzer;
-import org.junit.Test;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-public class ASMDependencyAnalyzerTest
-{
-    private final DependencyAnalyzer analyzer = new ASMDependencyAnalyzer();
-
-    @Test
-    public void test() throws Exception
-    {
-        URL jarUrl = this.getClass().getResource( "/org/objectweb/asm/ClassReader.class" );
-        assertThat( jarUrl ).isNotNull();
-        String fileUrl = jarUrl.toString().substring( "jar:".length(), jarUrl.toString().indexOf( "!/" ) );
-
-        Set<String> result = analyzer.analyze( new URL( fileUrl ) );
-
-        assertThat( result ).isNotEmpty();
-    }
-
-}
+/*
+ * 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.shared.dependency.analyzer.asm;
+
+import java.net.URL;
+import java.util.Set;
+
+import org.apache.maven.shared.dependency.analyzer.DependencyAnalyzer;
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class ASMDependencyAnalyzerTest {
+    private final DependencyAnalyzer analyzer = new ASMDependencyAnalyzer();
+
+    @Test
+    void test() throws Exception {
+        URL jarUrl = this.getClass().getResource("/org/objectweb/asm/ClassReader.class");
+        assertThat(jarUrl).isNotNull();
+        String fileUrl =
+                jarUrl.toString().substring("jar:".length(), jarUrl.toString().indexOf("!/"));
+
+        Set<String> result = analyzer.analyze(new URL(fileUrl));
+
+        assertThat(result).isNotEmpty();
+    }
+}
diff --git a/src/test/java/org/apache/maven/shared/dependency/analyzer/asm/DependencyVisitorTest.java b/src/test/java/org/apache/maven/shared/dependency/analyzer/asm/DependencyVisitorTest.java
index 4a51b15..8ee3c44 100644
--- a/src/test/java/org/apache/maven/shared/dependency/analyzer/asm/DependencyVisitorTest.java
+++ b/src/test/java/org/apache/maven/shared/dependency/analyzer/asm/DependencyVisitorTest.java
@@ -1,5 +1,3 @@
-package org.apache.maven.shared.dependency.analyzer.asm;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@ package org.apache.maven.shared.dependency.analyzer.asm;
  * "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
+ *   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
@@ -18,155 +16,148 @@ package org.apache.maven.shared.dependency.analyzer.asm;
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.shared.dependency.analyzer.asm;
 
-import org.junit.Before;
-import org.junit.Test;
-import org.objectweb.asm.*;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.Attribute;
+import org.objectweb.asm.FieldVisitor;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
 import org.objectweb.asm.signature.SignatureVisitor;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
 /**
  * Tests <code>DependencyVisitor</code>.
- * 
+ *
  * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
  */
-public class DependencyVisitorTest
-{
+class DependencyVisitorTest {
     private final ResultCollector resultCollector = new ResultCollector();
     private DefaultClassVisitor visitor;
     private MethodVisitor mv;
 
-    @Before
-    public void setUp()
-    {
-        AnnotationVisitor annotationVisitor = new DefaultAnnotationVisitor( resultCollector );
-        SignatureVisitor signatureVisitor = new DefaultSignatureVisitor( resultCollector );
-        FieldVisitor fieldVisitor = new DefaultFieldVisitor( annotationVisitor, resultCollector );
-        mv = new DefaultMethodVisitor( annotationVisitor, signatureVisitor, resultCollector);
-        visitor = new DefaultClassVisitor( signatureVisitor, annotationVisitor, fieldVisitor, mv, resultCollector);
+    @BeforeEach
+    void setUp() {
+        AnnotationVisitor annotationVisitor = new DefaultAnnotationVisitor(resultCollector);
+        SignatureVisitor signatureVisitor = new DefaultSignatureVisitor(resultCollector);
+        FieldVisitor fieldVisitor = new DefaultFieldVisitor(annotationVisitor, resultCollector);
+        mv = new DefaultMethodVisitor(annotationVisitor, signatureVisitor, resultCollector);
+        visitor = new DefaultClassVisitor(signatureVisitor, annotationVisitor, fieldVisitor, mv, resultCollector);
     }
 
     @Test
-    public void testVisitWithDefaultSuperclass()
-    {
+    void testVisitWithDefaultSuperclass() {
         // class a.b.c
-        visitor.visit( 50, 0, "a/b/c", null, "java/lang/Object", null );
+        visitor.visit(50, 0, "a/b/c", null, "java/lang/Object", null);
 
-        assertThat( resultCollector.getDependencies() ).containsOnly( "java.lang.Object" );
+        assertThat(resultCollector.getDependencies()).containsOnly("java.lang.Object");
     }
 
     @Test
-    public void testVisitWithSuperclass()
-    {
+    void testVisitWithSuperclass() {
         // class a.b.c
-        visitor.visit( 50, 0, "a/b/c", null, "x/y/z", null );
+        visitor.visit(50, 0, "a/b/c", null, "x/y/z", null);
 
-        assertThat( resultCollector.getDependencies() ).containsOnly( "x.y.z" );
+        assertThat(resultCollector.getDependencies()).containsOnly("x.y.z");
     }
 
     @Test
-    public void testVisitWithInterface()
-    {
+    void testVisitWithInterface() {
         // class a.b.c implements x.y.z
-        visitor.visit( 50, 0, "a/b/c", null, "java/lang/Object", new String[] { "x/y/z" } );
+        visitor.visit(50, 0, "a/b/c", null, "java/lang/Object", new String[] {"x/y/z"});
 
-        assertThat( resultCollector.getDependencies() ).containsOnly( "java.lang.Object", "x.y.z" );
+        assertThat(resultCollector.getDependencies()).containsOnly("java.lang.Object", "x.y.z");
     }
 
     @Test
-    public void testVisitWithInterfaces()
-    {
+    void testVisitWithInterfaces() {
         // class a.b.c implements p.q.r, x.y.z
-        visitor.visit( 50, 0, "a/b/c", null, "java/lang/Object", new String[] { "p/q/r", "x/y/z" } );
+        visitor.visit(50, 0, "a/b/c", null, "java/lang/Object", new String[] {"p/q/r", "x/y/z"});
 
-        assertThat( resultCollector.getDependencies() ).containsOnly( "java.lang.Object", "p.q.r", "x.y.z" );
+        assertThat(resultCollector.getDependencies()).containsOnly("java.lang.Object", "p.q.r", "x.y.z");
     }
 
     @Test
-    public void testVisitWithUnboundedClassTypeParameter()
-    {
+    void testVisitWithUnboundedClassTypeParameter() {
         // class a.b.c<T>
         String signature = "<T:Ljava/lang/Object;>Ljava/lang/Object;";
 
-        visitor.visit( 50, 0, "a/b/c", signature, "java/lang/Object", null );
+        visitor.visit(50, 0, "a/b/c", signature, "java/lang/Object", null);
 
-        assertThat( resultCollector.getDependencies() ).containsOnly( "java.lang.Object" );
+        assertThat(resultCollector.getDependencies()).containsOnly("java.lang.Object");
     }
 
     @Test
-    public void testVisitWithBoundedClassTypeParameter()
-    {
+    void testVisitWithBoundedClassTypeParameter() {
         // class a.b.c<T extends x.y.z>
         String signature = "<T:Lx/y/z;>Ljava/lang/Object;";
 
-        visitor.visit( 50, 0, "a/b/c", signature, "java/lang/Object", null );
+        visitor.visit(50, 0, "a/b/c", signature, "java/lang/Object", null);
 
-        assertThat( resultCollector.getDependencies() ).containsOnly( "java.lang.Object", "x.y.z" );
+        assertThat(resultCollector.getDependencies()).containsOnly("java.lang.Object", "x.y.z");
     }
 
     @Test
-    public void testVisitWithBoundedClassTypeParameters()
-    {
+    void testVisitWithBoundedClassTypeParameters() {
         // class a.b.c<K extends p.q.r, V extends x.y.z>
         String signature = "<K:Lp/q/r;V:Lx/y/z;>Ljava/lang/Object;";
 
-        visitor.visit( 50, 0, "a/b/c", signature, "java/lang/Object", null );
+        visitor.visit(50, 0, "a/b/c", signature, "java/lang/Object", null);
 
-        assertThat( resultCollector.getDependencies() ).containsOnly( "java.lang.Object", "p.q.r", "x.y.z" );
+        assertThat(resultCollector.getDependencies()).containsOnly("java.lang.Object", "p.q.r", "x.y.z");
     }
 
     @Test
-    public void testVisitWithGenericInterface()
-    {
+    void testVisitWithGenericInterface() {
         // class a.b.c implements p.q.r<x.y.z>
         String signature = "Ljava/lang/Object;Lp/q/r<Lx/y/z;>;";
 
-        visitor.visit( 50, 0, "a/b/c", signature, "java/lang/Object", new String[] { "p.q.r" } );
+        visitor.visit(50, 0, "a/b/c", signature, "java/lang/Object", new String[] {"p.q.r"});
 
-        assertThat( resultCollector.getDependencies() ).containsOnly( "java.lang.Object", "p.q.r", "x.y.z" );
+        assertThat(resultCollector.getDependencies()).containsOnly("java.lang.Object", "p.q.r", "x.y.z");
     }
 
     @Test
-    public void testVisitWithInterfaceBound()
-    {
+    void testVisitWithInterfaceBound() {
         // class a.b.c<T> implements x.y.z<T>
         String signature = "<T:Ljava/lang/Object;>Ljava/lang/Object;Lx/y/z<TT;>;";
 
-        visitor.visit( 50, 0, "a/b/c", signature, "java/lang/Object", new String[] { "x.y.z" } );
+        visitor.visit(50, 0, "a/b/c", signature, "java/lang/Object", new String[] {"x.y.z"});
 
-        assertThat( resultCollector.getDependencies() ).containsOnly( "java.lang.Object", "x.y.z" );
+        assertThat(resultCollector.getDependencies()).containsOnly("java.lang.Object", "x.y.z");
     }
 
     // visitSource tests ------------------------------------------------------
 
     @Test
-    public void testVisitSource()
-    {
-        visitor.visitSource( null, null );
+    void testVisitSource() {
+        visitor.visitSource(null, null);
 
-        assertThat( resultCollector.getDependencies() ).isEmpty();
+        assertThat(resultCollector.getDependencies()).isEmpty();
     }
 
     // visitOuterClass tests --------------------------------------------------
 
     @Test
-    public void testVisitOuterClass()
-    {
+    void testVisitOuterClass() {
         // class a.b.c
         // {
         //     class ...
         //     {
         //     }
         // }
-        visitor.visitOuterClass( "a/b/c", null, null );
+        visitor.visitOuterClass("a/b/c", null, null);
 
-        assertThat( resultCollector.getDependencies() ).isEmpty();
+        assertThat(resultCollector.getDependencies()).isEmpty();
     }
 
     @Test
-    public void testVisitOuterClassInMethod()
-    {
+    void testVisitOuterClassInMethod() {
         // class a.b.c
         // {
         //     x.y.z x(p.q.r p)
@@ -176,579 +167,517 @@ public class DependencyVisitorTest
         //         }
         //     }
         // }
-        visitor.visitOuterClass( "a/b/c", "x", "(Lp/q/r;)Lx/y/z;" );
+        visitor.visitOuterClass("a/b/c", "x", "(Lp/q/r;)Lx/y/z;");
 
-        assertThat( resultCollector.getDependencies() ).isEmpty();
+        assertThat(resultCollector.getDependencies()).isEmpty();
     }
 
     // visitAnnotation tests --------------------------------------------------
 
     @Test
-    public void testVisitAnnotation()
-    {
-        assertVisitor( visitor.visitAnnotation( "La/b/c;", false ) );
+    void testVisitAnnotation() {
+        assertVisitor(visitor.visitAnnotation("La/b/c;", false));
 
-        assertThat( resultCollector.getDependencies() ).containsOnly( "a.b.c" );
+        assertThat(resultCollector.getDependencies()).containsOnly("a.b.c");
     }
 
     @Test
-    public void testVisitAnnotationWithRuntimeVisibility()
-    {
-        assertVisitor( visitor.visitAnnotation( "La/b/c;", true ) );
+    void testVisitAnnotationWithRuntimeVisibility() {
+        assertVisitor(visitor.visitAnnotation("La/b/c;", true));
 
-        assertThat( resultCollector.getDependencies() ).containsOnly( "a.b.c" );
+        assertThat(resultCollector.getDependencies()).containsOnly("a.b.c");
     }
 
     // visitAttribute tests ---------------------------------------------------
 
     @Test
-    public void testVisitAttribute()
-    {
-        visitor.visitAttribute( new MockAttribute( "a" ) );
+    void testVisitAttribute() {
+        visitor.visitAttribute(new MockAttribute("a"));
 
-        assertThat( resultCollector.getDependencies() ).isEmpty();
+        assertThat(resultCollector.getDependencies()).isEmpty();
     }
 
     // visitInnerClass tests --------------------------------------------------
 
     @Test
-    public void testVisitInnerClass()
-    {
+    void testVisitInnerClass() {
         // TODO: ensure innerName is correct
 
         // class a.b.c { class x.y.z { } }
-        visitor.visitInnerClass( "x/y/z", "a/b/c", "z", 0 );
+        visitor.visitInnerClass("x/y/z", "a/b/c", "z", 0);
 
-        assertThat( resultCollector.getDependencies() ).isEmpty();
+        assertThat(resultCollector.getDependencies()).isEmpty();
     }
 
     @Test
-    public void testVisitInnerClassAnonymous()
-    {
+    void testVisitInnerClassAnonymous() {
         // class a.b.c { new class x.y.z { } }
-        visitor.visitInnerClass( "x/y/z$1", "a/b/c", null, 0 );
+        visitor.visitInnerClass("x/y/z$1", "a/b/c", null, 0);
 
-        assertThat( resultCollector.getDependencies() ).isEmpty();
+        assertThat(resultCollector.getDependencies()).isEmpty();
     }
 
     // visitField tests -------------------------------------------------------
 
     @Test
-    public void testVisitField()
-    {
+    void testVisitField() {
         // a.b.c a
-        assertVisitor( visitor.visitField( 0, "a", "La/b/c;", null, null ) );
+        assertVisitor(visitor.visitField(0, "a", "La/b/c;", null, null));
 
-        assertThat( resultCollector.getDependencies() ).containsOnly( "a.b.c" );
+        assertThat(resultCollector.getDependencies()).containsOnly("a.b.c");
     }
 
     // TODO: determine actual use of default values
-    // public void testVisitFieldWithValue()
+    // void testVisitFieldWithValue()
     // {
     // }
 
     @Test
-    public void testVisitFieldArray()
-    {
+    void testVisitFieldArray() {
         // a.b.c[] a
-        assertVisitor( visitor.visitField( 0, "a", "[La/b/c;", null, null ) );
+        assertVisitor(visitor.visitField(0, "a", "[La/b/c;", null, null));
 
-        assertThat( resultCollector.getDependencies() ).containsOnly( "a.b.c" );
+        assertThat(resultCollector.getDependencies()).containsOnly("a.b.c");
     }
 
     @Test
-    public void testVisitFieldGeneric()
-    {
+    void testVisitFieldGeneric() {
         // a.b.c<x.y.z> a
-        assertVisitor( visitor.visitField( 0, "a", "La/b/c;", "La/b/c<Lx/y/z;>;", null ) );
+        assertVisitor(visitor.visitField(0, "a", "La/b/c;", "La/b/c<Lx/y/z;>;", null));
 
-        assertThat( resultCollector.getDependencies() ).containsOnly( "a.b.c", "x.y.z" );
+        assertThat(resultCollector.getDependencies()).containsOnly("a.b.c", "x.y.z");
     }
 
     // visitMethod tests ------------------------------------------------------
 
     @Test
-    public void testVisitMethod()
-    {
+    void testVisitMethod() {
         // void a()
-        assertVisitor( visitor.visitMethod( 0, "a", "()V", null, null ) );
+        assertVisitor(visitor.visitMethod(0, "a", "()V", null, null));
 
-        assertThat( resultCollector.getDependencies() ).isEmpty();
+        assertThat(resultCollector.getDependencies()).isEmpty();
     }
 
     @Test
-    public void testVisitMethodWithPrimitiveArgument()
-    {
+    void testVisitMethodWithPrimitiveArgument() {
         // void a(int)
-        assertVisitor( visitor.visitMethod( 0, "a", "(I)V", null, null ) );
+        assertVisitor(visitor.visitMethod(0, "a", "(I)V", null, null));
 
-        assertThat( resultCollector.getDependencies() ).isEmpty();
+        assertThat(resultCollector.getDependencies()).isEmpty();
     }
 
     @Test
-    public void testVisitMethodWithPrimitiveArrayArgument()
-    {
+    void testVisitMethodWithPrimitiveArrayArgument() {
         // void a(int[])
-        assertVisitor( visitor.visitMethod( 0, "a", "([I)V", null, null ) );
+        assertVisitor(visitor.visitMethod(0, "a", "([I)V", null, null));
 
-        assertThat( resultCollector.getDependencies() ).isEmpty();
+        assertThat(resultCollector.getDependencies()).isEmpty();
     }
 
     @Test
-    public void testVisitMethodWithObjectArgument()
-    {
+    void testVisitMethodWithObjectArgument() {
         // void a(a.b.c)
-        assertVisitor( visitor.visitMethod( 0, "a", "(La/b/c;)V", null, null ) );
+        assertVisitor(visitor.visitMethod(0, "a", "(La/b/c;)V", null, null));
 
-        assertThat( resultCollector.getDependencies() ).containsOnly( "a.b.c" );
+        assertThat(resultCollector.getDependencies()).containsOnly("a.b.c");
     }
 
     @Test
-    public void testVisitMethodWithObjectArguments()
-    {
+    void testVisitMethodWithObjectArguments() {
         // void a(a.b.c, x.y.z)
-        assertVisitor( visitor.visitMethod( 0, "a", "(La/b/c;Lx/y/z;)V", null, null ) );
+        assertVisitor(visitor.visitMethod(0, "a", "(La/b/c;Lx/y/z;)V", null, null));
 
-        assertThat( resultCollector.getDependencies() ).containsOnly( "a.b.c", "x.y.z" );
+        assertThat(resultCollector.getDependencies()).containsOnly("a.b.c", "x.y.z");
     }
 
     @Test
-    public void testVisitMethodWithObjectArrayArgument()
-    {
+    void testVisitMethodWithObjectArrayArgument() {
         // void a(a.b.c[])
-        assertVisitor( visitor.visitMethod( 0, "a", "([La/b/c;)V", null, null ) );
+        assertVisitor(visitor.visitMethod(0, "a", "([La/b/c;)V", null, null));
 
-        assertThat( resultCollector.getDependencies() ).containsOnly( "a.b.c" );
+        assertThat(resultCollector.getDependencies()).containsOnly("a.b.c");
     }
 
     @Test
-    public void testVisitMethodWithGenericArgument()
-    {
+    void testVisitMethodWithGenericArgument() {
         // void a(a.b.c<x.y.z>)
-        assertVisitor( visitor.visitMethod( 0, "a", "(La/b/c;)V", "(La/b/c<Lx/y/z;>;)V", null ) );
+        assertVisitor(visitor.visitMethod(0, "a", "(La/b/c;)V", "(La/b/c<Lx/y/z;>;)V", null));
 
-        assertThat( resultCollector.getDependencies() ).containsOnly( "a.b.c", "x.y.z" );
+        assertThat(resultCollector.getDependencies()).containsOnly("a.b.c", "x.y.z");
     }
 
     @Test
-    public void testVisitMethodWithPrimitiveReturnType()
-    {
+    void testVisitMethodWithPrimitiveReturnType() {
         // int a()
-        assertVisitor( visitor.visitMethod( 0, "a", "()I", null, null ) );
+        assertVisitor(visitor.visitMethod(0, "a", "()I", null, null));
 
-        assertThat( resultCollector.getDependencies() ).isEmpty();
+        assertThat(resultCollector.getDependencies()).isEmpty();
     }
 
     @Test
-    public void testVisitMethodWithPrimitiveArrayReturnType()
-    {
+    void testVisitMethodWithPrimitiveArrayReturnType() {
         // int[] a()
-        assertVisitor( visitor.visitMethod( 0, "a", "()[I", null, null ) );
+        assertVisitor(visitor.visitMethod(0, "a", "()[I", null, null));
 
-        assertThat( resultCollector.getDependencies() ).isEmpty();
+        assertThat(resultCollector.getDependencies()).isEmpty();
     }
 
     @Test
-    public void testVisitMethodWithObjectReturnType()
-    {
+    void testVisitMethodWithObjectReturnType() {
         // a.b.c a()
-        assertVisitor( visitor.visitMethod( 0, "a", "()La/b/c;", null, null ) );
+        assertVisitor(visitor.visitMethod(0, "a", "()La/b/c;", null, null));
 
-        assertThat( resultCollector.getDependencies() ).containsOnly( "a.b.c" );
+        assertThat(resultCollector.getDependencies()).containsOnly("a.b.c");
     }
 
     @Test
-    public void testVisitMethodWithObjectArrayReturnType()
-    {
+    void testVisitMethodWithObjectArrayReturnType() {
         // a.b.c[] a()
-        assertVisitor( visitor.visitMethod( 0, "a", "()[La/b/c;", null, null ) );
+        assertVisitor(visitor.visitMethod(0, "a", "()[La/b/c;", null, null));
 
-        assertThat( resultCollector.getDependencies() ).containsOnly( "a.b.c" );
+        assertThat(resultCollector.getDependencies()).containsOnly("a.b.c");
     }
 
     @Test
-    public void testVisitMethodWithException()
-    {
+    void testVisitMethodWithException() {
         // void a() throws a.b.c
-        assertVisitor( visitor.visitMethod( 0, "a", "()V", null, new String[] { "a/b/c" } ) );
+        assertVisitor(visitor.visitMethod(0, "a", "()V", null, new String[] {"a/b/c"}));
 
-        assertThat( resultCollector.getDependencies() ).containsOnly( "a.b.c" );
+        assertThat(resultCollector.getDependencies()).containsOnly("a.b.c");
     }
 
     @Test
-    public void testVisitMethodWithExceptions()
-    {
+    void testVisitMethodWithExceptions() {
         // void a() throws a.b.c, x.y.z
-        assertVisitor( visitor.visitMethod( 0, "a", "()V", null, new String[] { "a/b/c", "x/y/z" } ) );
+        assertVisitor(visitor.visitMethod(0, "a", "()V", null, new String[] {"a/b/c", "x/y/z"}));
 
-        assertThat( resultCollector.getDependencies() ).containsOnly( "a.b.c", "x.y.z" );
+        assertThat(resultCollector.getDependencies()).containsOnly("a.b.c", "x.y.z");
     }
 
     // visitAnnotationDefault tests -------------------------------------------
 
     @Test
-    public void testVisitAnnotationDefault()
-    {
-        assertVisitor( mv.visitAnnotationDefault() );
-        assertThat( resultCollector.getDependencies() ).isEmpty();
+    void testVisitAnnotationDefault() {
+        assertVisitor(mv.visitAnnotationDefault());
+        assertThat(resultCollector.getDependencies()).isEmpty();
     }
 
     // visitParameterAnnotation tests -------------------------------------------
 
     @Test
-    public void testVisitParameterAnnotation()
-    {
+    void testVisitParameterAnnotation() {
         // @a.b.c
-        assertVisitor( mv.visitParameterAnnotation( 0, "La/b/c;", false ) );
+        assertVisitor(mv.visitParameterAnnotation(0, "La/b/c;", false));
 
-        assertThat( resultCollector.getDependencies() ).containsOnly( "a.b.c" );
+        assertThat(resultCollector.getDependencies()).containsOnly("a.b.c");
     }
 
     // visitCode tests --------------------------------------------------------
 
     @Test
-    public void testVisitCode()
-    {
+    void testVisitCode() {
         mv.visitCode();
 
-        assertThat( resultCollector.getDependencies() ).isEmpty();
+        assertThat(resultCollector.getDependencies()).isEmpty();
     }
 
     // visitFrame tests -------------------------------------------------------
 
     @Test
-    public void testVisitFrame()
-    {
-        mv.visitFrame( Opcodes.F_NEW, 0, new Object[0], 0, new Object[0] );
+    void testVisitFrame() {
+        mv.visitFrame(Opcodes.F_NEW, 0, new Object[0], 0, new Object[0]);
 
-        assertThat( resultCollector.getDependencies() ).isEmpty();
+        assertThat(resultCollector.getDependencies()).isEmpty();
     }
 
     // visitInsn tests --------------------------------------------------------
 
     @Test
-    public void testVisitInsn()
-    {
-        mv.visitInsn( Opcodes.NOP );
+    void testVisitInsn() {
+        mv.visitInsn(Opcodes.NOP);
 
-        assertThat( resultCollector.getDependencies() ).isEmpty();
+        assertThat(resultCollector.getDependencies()).isEmpty();
     }
 
     // visitIntInsn tests -----------------------------------------------------
 
     @Test
-    public void testVisitIntInsn()
-    {
-        mv.visitIntInsn( Opcodes.BIPUSH, 0 );
+    void testVisitIntInsn() {
+        mv.visitIntInsn(Opcodes.BIPUSH, 0);
 
-        assertThat( resultCollector.getDependencies() ).isEmpty();
+        assertThat(resultCollector.getDependencies()).isEmpty();
     }
 
     // visitVarInsn tests -----------------------------------------------------
 
     @Test
-    public void testVisitVarInsn()
-    {
-        mv.visitVarInsn( Opcodes.ILOAD, 0 );
+    void testVisitVarInsn() {
+        mv.visitVarInsn(Opcodes.ILOAD, 0);
 
-        assertThat( resultCollector.getDependencies() ).isEmpty();
+        assertThat(resultCollector.getDependencies()).isEmpty();
     }
 
     // visitTypeInsn tests ----------------------------------------------------
 
     @Test
-    public void testVisitTypeInsn()
-    {
-        mv.visitTypeInsn( Opcodes.NEW, "a/b/c" );
+    void testVisitTypeInsn() {
+        mv.visitTypeInsn(Opcodes.NEW, "a/b/c");
 
-        assertThat( resultCollector.getDependencies() ).containsOnly( "a.b.c" );
+        assertThat(resultCollector.getDependencies()).containsOnly("a.b.c");
     }
 
     // visitFieldInsn tests ---------------------------------------------------
 
     @Test
-    public void testVisitFieldInsnWithPrimitive()
-    {
-        mv.visitFieldInsn( Opcodes.GETFIELD, "a/b/c", "x", "I" );
+    void testVisitFieldInsnWithPrimitive() {
+        mv.visitFieldInsn(Opcodes.GETFIELD, "a/b/c", "x", "I");
 
-        assertThat( resultCollector.getDependencies() ).containsOnly( "a.b.c" );
+        assertThat(resultCollector.getDependencies()).containsOnly("a.b.c");
     }
 
     @Test
-    public void testVisitFieldInsnWithObject()
-    {
-        mv.visitFieldInsn( Opcodes.GETFIELD, "a/b/c", "x", "Lx/y/z;" );
+    void testVisitFieldInsnWithObject() {
+        mv.visitFieldInsn(Opcodes.GETFIELD, "a/b/c", "x", "Lx/y/z;");
 
-        assertThat( resultCollector.getDependencies() ).containsOnly( "a.b.c" );
+        assertThat(resultCollector.getDependencies()).containsOnly("a.b.c");
     }
 
     // visitMethodInsn tests --------------------------------------------------
 
     @Test
-    public void testVisitMethodInsn()
-    {
-        mv.visitMethodInsn( Opcodes.INVOKEVIRTUAL, "a/b/c", "x", "()V", false );
+    void testVisitMethodInsn() {
+        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "a/b/c", "x", "()V", false);
 
-        assertThat( resultCollector.getDependencies() ).containsOnly( "a.b.c" );
+        assertThat(resultCollector.getDependencies()).containsOnly("a.b.c");
     }
 
     @Test
-    public void testVisitMethodInsnWithPrimitiveArgument()
-    {
-        mv.visitMethodInsn( Opcodes.INVOKEVIRTUAL, "a/b/c", "x", "(I)V", false );
+    void testVisitMethodInsnWithPrimitiveArgument() {
+        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "a/b/c", "x", "(I)V", false);
 
-        assertThat( resultCollector.getDependencies() ).containsOnly( "a.b.c" );
+        assertThat(resultCollector.getDependencies()).containsOnly("a.b.c");
     }
 
     @Test
-    public void testVisitMethodInsnWithPrimitiveArrayArgument()
-    {
-        mv.visitMethodInsn( Opcodes.INVOKEVIRTUAL, "a/b/c", "x", "([I)V", false );
+    void testVisitMethodInsnWithPrimitiveArrayArgument() {
+        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "a/b/c", "x", "([I)V", false);
 
-        assertThat( resultCollector.getDependencies() ).containsOnly( "a.b.c" );
+        assertThat(resultCollector.getDependencies()).containsOnly("a.b.c");
     }
 
     @Test
-    public void testVisitMethodInsnWithObjectArgument()
-    {
-        mv.visitMethodInsn( Opcodes.INVOKEVIRTUAL, "a/b/c", "x", "(Lx/y/z;)V", false );
+    void testVisitMethodInsnWithObjectArgument() {
+        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "a/b/c", "x", "(Lx/y/z;)V", false);
 
-        assertThat( resultCollector.getDependencies() ).containsOnly( "a.b.c" );
+        assertThat(resultCollector.getDependencies()).containsOnly("a.b.c");
     }
 
     @Test
-    public void testVisitMethodInsnWithObjectArguments()
-    {
-        mv.visitMethodInsn( Opcodes.INVOKEVIRTUAL, "a/b/c", "x", "(Lp/q/r;Lx/y/z;)V", false );
+    void testVisitMethodInsnWithObjectArguments() {
+        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "a/b/c", "x", "(Lp/q/r;Lx/y/z;)V", false);
 
-        assertThat( resultCollector.getDependencies() ).containsOnly( "a.b.c" );
+        assertThat(resultCollector.getDependencies()).containsOnly("a.b.c");
     }
 
     @Test
-    public void testVisitMethodInsnWithObjectArrayArgument()
-    {
-        mv.visitMethodInsn( Opcodes.INVOKEVIRTUAL, "a/b/c", "x", "([Lx/y/z;)V", false );
+    void testVisitMethodInsnWithObjectArrayArgument() {
+        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "a/b/c", "x", "([Lx/y/z;)V", false);
 
-        assertThat( resultCollector.getDependencies() ).containsOnly( "a.b.c" );
+        assertThat(resultCollector.getDependencies()).containsOnly("a.b.c");
     }
 
     @Test
-    public void testVisitMethodInsnWithPrimitiveReturnType()
-    {
-        mv.visitMethodInsn( Opcodes.INVOKEVIRTUAL, "a/b/c", "x", "()I", false );
+    void testVisitMethodInsnWithPrimitiveReturnType() {
+        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "a/b/c", "x", "()I", false);
 
-        assertThat( resultCollector.getDependencies() ).containsOnly( "a.b.c" );
+        assertThat(resultCollector.getDependencies()).containsOnly("a.b.c");
     }
 
     @Test
-    public void testVisitMethodInsnWithPrimitiveArrayReturnType()
-    {
-        mv.visitMethodInsn( Opcodes.INVOKEVIRTUAL, "a/b/c", "x", "()[I", false );
+    void testVisitMethodInsnWithPrimitiveArrayReturnType() {
+        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "a/b/c", "x", "()[I", false);
 
-        assertThat( resultCollector.getDependencies() ).containsOnly( "a.b.c" );
+        assertThat(resultCollector.getDependencies()).containsOnly("a.b.c");
     }
 
     @Test
-    public void testVisitMethodInsnWithObjectReturnType()
-    {
-        mv.visitMethodInsn( Opcodes.INVOKEVIRTUAL, "a/b/c", "x", "()Lx/y/z;", false );
+    void testVisitMethodInsnWithObjectReturnType() {
+        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "a/b/c", "x", "()Lx/y/z;", false);
 
-        assertThat( resultCollector.getDependencies() ).containsOnly( "a.b.c" );
+        assertThat(resultCollector.getDependencies()).containsOnly("a.b.c");
     }
 
     @Test
-    public void testVisitMethodInsnWithObjectArrayReturnType()
-    {
-        mv.visitMethodInsn( Opcodes.INVOKEVIRTUAL, "a/b/c", "x", "()[Lx/y/z;", false );
+    void testVisitMethodInsnWithObjectArrayReturnType() {
+        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "a/b/c", "x", "()[Lx/y/z;", false);
 
-        assertThat( resultCollector.getDependencies() ).containsOnly( "a.b.c" );
+        assertThat(resultCollector.getDependencies()).containsOnly("a.b.c");
     }
 
     // visitJumpInsn tests ----------------------------------------------------
 
     @Test
-    public void testVisitJumpInsn()
-    {
-        mv.visitJumpInsn( Opcodes.IFEQ, new Label() );
+    void testVisitJumpInsn() {
+        mv.visitJumpInsn(Opcodes.IFEQ, new Label());
 
-        assertThat( resultCollector.getDependencies() ).isEmpty();
+        assertThat(resultCollector.getDependencies()).isEmpty();
     }
 
     // visitLabel tests -------------------------------------------------------
 
     @Test
-    public void testVisitLabel()
-    {
-        mv.visitLabel( new Label() );
+    void testVisitLabel() {
+        mv.visitLabel(new Label());
 
-        assertThat( resultCollector.getDependencies() ).isEmpty();
+        assertThat(resultCollector.getDependencies()).isEmpty();
     }
 
     // visitLdcInsn tests -----------------------------------------------------
 
     @Test
-    public void testVisitLdcInsnWithNonType()
-    {
-        mv.visitLdcInsn( "a" );
+    void testVisitLdcInsnWithNonType() {
+        mv.visitLdcInsn("a");
 
-        assertThat( resultCollector.getDependencies() ).isEmpty();
+        assertThat(resultCollector.getDependencies()).isEmpty();
     }
 
     @Test
-    public void testVisitLdcInsnWithPrimitiveType()
-    {
-        mv.visitLdcInsn( Type.INT_TYPE );
+    void testVisitLdcInsnWithPrimitiveType() {
+        mv.visitLdcInsn(Type.INT_TYPE);
 
-        assertThat( resultCollector.getDependencies() ).isEmpty();
+        assertThat(resultCollector.getDependencies()).isEmpty();
     }
 
     @Test
-    public void testVisitLdcInsnWithObjectType()
-    {
-        mv.visitLdcInsn( Type.getType( "La/b/c;" ) );
+    void testVisitLdcInsnWithObjectType() {
+        mv.visitLdcInsn(Type.getType("La/b/c;"));
 
-        assertThat( resultCollector.getDependencies() ).containsOnly( "a.b.c" );
+        assertThat(resultCollector.getDependencies()).containsOnly("a.b.c");
     }
 
     // visitIincInsn tests ----------------------------------------------------
 
     @Test
-    public void testVisitIincInsn()
-    {
-        mv.visitIincInsn( 0, 1 );
+    void testVisitIincInsn() {
+        mv.visitIincInsn(0, 1);
 
-        assertThat( resultCollector.getDependencies() ).isEmpty();
+        assertThat(resultCollector.getDependencies()).isEmpty();
     }
 
     // visitTableSwitchInsn tests ---------------------------------------------
 
     @Test
-    public void testVisitTableSwitchInsn()
-    {
-        mv.visitTableSwitchInsn( 0, 1, new Label(), new Label() );
+    void testVisitTableSwitchInsn() {
+        mv.visitTableSwitchInsn(0, 1, new Label(), new Label());
 
-        assertThat( resultCollector.getDependencies() ).isEmpty();
+        assertThat(resultCollector.getDependencies()).isEmpty();
     }
 
     // visitLookupSwitchInsn tests --------------------------------------------
 
     @Test
-    public void testVisitLookupSwitchInsn()
-    {
-        mv.visitLookupSwitchInsn( new Label(), new int[] { 0 }, new Label[] { new Label() } );
+    void testVisitLookupSwitchInsn() {
+        mv.visitLookupSwitchInsn(new Label(), new int[] {0}, new Label[] {new Label()});
 
-        assertThat( resultCollector.getDependencies() ).isEmpty();
+        assertThat(resultCollector.getDependencies()).isEmpty();
     }
 
     // visitMultiANewArrayInsn tests ------------------------------------------
 
     @Test
-    public void testVisitMultiANewArrayInsnWithPrimitive()
-    {
-        mv.visitMultiANewArrayInsn( "I", 2 );
+    void testVisitMultiANewArrayInsnWithPrimitive() {
+        mv.visitMultiANewArrayInsn("I", 2);
 
-        assertThat( resultCollector.getDependencies() ).isEmpty();
+        assertThat(resultCollector.getDependencies()).isEmpty();
     }
 
     @Test
-    public void testVisitMultiANewArrayInsnWithObject()
-    {
-        mv.visitMultiANewArrayInsn( "La/b/c;", 2 );
+    void testVisitMultiANewArrayInsnWithObject() {
+        mv.visitMultiANewArrayInsn("La/b/c;", 2);
 
-        assertThat( resultCollector.getDependencies() ).containsOnly( "a.b.c" );
+        assertThat(resultCollector.getDependencies()).containsOnly("a.b.c");
     }
 
     // visitTryCatchBlock tests -----------------------------------------------
 
     @Test
-    public void testVisitTryCatchBlock()
-    {
-        mv.visitTryCatchBlock( new Label(), new Label(), new Label(), "a/b/c" );
+    void testVisitTryCatchBlock() {
+        mv.visitTryCatchBlock(new Label(), new Label(), new Label(), "a/b/c");
 
-        assertThat( resultCollector.getDependencies() ).containsOnly( "a.b.c" );
+        assertThat(resultCollector.getDependencies()).containsOnly("a.b.c");
     }
 
     @Test
-    public void testVisitTryCatchBlockForFinally()
-    {
-        mv.visitTryCatchBlock( new Label(), new Label(), new Label(), null );
+    void testVisitTryCatchBlockForFinally() {
+        mv.visitTryCatchBlock(new Label(), new Label(), new Label(), null);
 
-        assertThat( resultCollector.getDependencies() ).isEmpty();
+        assertThat(resultCollector.getDependencies()).isEmpty();
     }
 
     // visitLocalVariable tests -----------------------------------------------
 
     @Test
-    public void testVisitLocalVariableWithPrimitive()
-    {
-        mv.visitLocalVariable( "a", "I", null, new Label(), new Label(), 0 );
+    void testVisitLocalVariableWithPrimitive() {
+        mv.visitLocalVariable("a", "I", null, new Label(), new Label(), 0);
 
-        assertThat( resultCollector.getDependencies() ).isEmpty();
+        assertThat(resultCollector.getDependencies()).isEmpty();
     }
 
     @Test
-    public void testVisitLocalVariableWithPrimitiveArray()
-    {
-        mv.visitLocalVariable( "a", "[I", null, new Label(), new Label(), 0 );
+    void testVisitLocalVariableWithPrimitiveArray() {
+        mv.visitLocalVariable("a", "[I", null, new Label(), new Label(), 0);
 
-        assertThat( resultCollector.getDependencies() ).isEmpty();
+        assertThat(resultCollector.getDependencies()).isEmpty();
     }
 
     @Test
-    public void testVisitLocalVariableWithObject()
-    {
-        mv.visitLocalVariable( "a", "La/b/c;", null, new Label(), new Label(), 0 );
+    void testVisitLocalVariableWithObject() {
+        mv.visitLocalVariable("a", "La/b/c;", null, new Label(), new Label(), 0);
 
-        assertThat( resultCollector.getDependencies() ).containsOnly( "a.b.c" );
+        assertThat(resultCollector.getDependencies()).containsOnly("a.b.c");
     }
 
     @Test
-    public void testVisitLocalVariableWithObjectArray()
-    {
-        mv.visitLocalVariable( "a", "[La/b/c;", null, new Label(), new Label(), 0 );
+    void testVisitLocalVariableWithObjectArray() {
+        mv.visitLocalVariable("a", "[La/b/c;", null, new Label(), new Label(), 0);
 
-        assertThat( resultCollector.getDependencies() ).containsOnly( "a.b.c" );
+        assertThat(resultCollector.getDependencies()).containsOnly("a.b.c");
     }
 
     @Test
-    public void testVisitLocalVariableWithGenericObject()
-    {
-        mv.visitLocalVariable( "a", "La/b/c;", "La/b/c<Lx/y/z;>;", new Label(), new Label(), 0 );
+    void testVisitLocalVariableWithGenericObject() {
+        mv.visitLocalVariable("a", "La/b/c;", "La/b/c<Lx/y/z;>;", new Label(), new Label(), 0);
 
-        assertThat( resultCollector.getDependencies() ).containsOnly( "a.b.c", "x.y.z" );
+        assertThat(resultCollector.getDependencies()).containsOnly("a.b.c", "x.y.z");
     }
 
     @Test
-    public void testVisitLocalVariableWithGenericObjectArray()
-    {
-        mv.visitLocalVariable( "a", "La/b/c;", "[La/b/c<Lx/y/z;>;", new Label(), new Label(), 0 );
+    void testVisitLocalVariableWithGenericObjectArray() {
+        mv.visitLocalVariable("a", "La/b/c;", "[La/b/c<Lx/y/z;>;", new Label(), new Label(), 0);
 
-        assertThat( resultCollector.getDependencies() ).containsOnly( "a.b.c", "x.y.z" );
+        assertThat(resultCollector.getDependencies()).containsOnly("a.b.c", "x.y.z");
     }
 
     // visitLineNumber tests --------------------------------------------------
 
     @Test
-    public void testVisitLineNumber()
-    {
-        mv.visitLineNumber( 0, new Label() );
+    void testVisitLineNumber() {
+        mv.visitLineNumber(0, new Label());
 
-        assertThat( resultCollector.getDependencies() ).isEmpty();
+        assertThat(resultCollector.getDependencies()).isEmpty();
     }
 
     // visitMaxs tests --------------------------------------------------------
 
     @Test
-    public void testVisitMaxs()
-    {
-        mv.visitMaxs( 0, 0 );
+    void testVisitMaxs() {
+        mv.visitMaxs(0, 0);
 
-        assertThat( resultCollector.getDependencies() ).isEmpty();
+        assertThat(resultCollector.getDependencies()).isEmpty();
     }
 
-    private void assertVisitor( Object actualVisitor )
-    {
-        //assertEquals( visitor, actualVisitor );
+    private void assertVisitor(Object actualVisitor) {
+        // assertEquals( visitor, actualVisitor );
     }
 
     /**
@@ -756,11 +685,9 @@ public class DependencyVisitorTest
      *
      * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
      */
-    static class MockAttribute extends Attribute
-    {
-        public MockAttribute( String type )
-        {
-            super( type );
+    static class MockAttribute extends Attribute {
+        MockAttribute(String type) {
+            super(type);
         }
     }
 }
diff --git a/src/test/java/org/apache/maven/shared/dependency/analyzer/asm/ResultCollectorTest.java b/src/test/java/org/apache/maven/shared/dependency/analyzer/asm/ResultCollectorTest.java
index 723025b..bcafd0e 100644
--- a/src/test/java/org/apache/maven/shared/dependency/analyzer/asm/ResultCollectorTest.java
+++ b/src/test/java/org/apache/maven/shared/dependency/analyzer/asm/ResultCollectorTest.java
@@ -1,5 +1,3 @@
-package org.apache.maven.shared.dependency.analyzer.asm;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@ package org.apache.maven.shared.dependency.analyzer.asm;
  * "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
+ *   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
@@ -18,64 +16,66 @@ package org.apache.maven.shared.dependency.analyzer.asm;
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.shared.dependency.analyzer.asm;
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.Set;
 
 import org.apache.maven.shared.dependency.analyzer.testcases.ArrayCases;
 import org.apache.maven.shared.dependency.analyzer.testcases.InnerClassCase;
 import org.apache.maven.shared.dependency.analyzer.testcases.MethodHandleCases;
+import org.junit.jupiter.api.Test;
+
 import static org.assertj.core.api.Assertions.assertThat;
-import org.junit.Test;
 
-public class ResultCollectorTest
-{
-    Set<String> getDependencies( Class<?> inspectClass )
-        throws IOException
-    {
+class ResultCollectorTest {
+    Set<String> getDependencies(Class<?> inspectClass) throws IOException {
         String className = inspectClass.getName();
-        String path = '/' + className.replace( '.', '/' ) + ".class";
+        String path = '/' + className.replace('.', '/') + ".class";
         DependencyClassFileVisitor visitor = new DependencyClassFileVisitor();
-        try ( InputStream is = inspectClass.getResourceAsStream( path ) )
-        {
-            visitor.visitClass( className, is );
+        try (InputStream is = inspectClass.getResourceAsStream(path)) {
+            visitor.visitClass(className, is);
         }
         return visitor.getDependencies();
     }
 
     @Test
-    public void testArrayCases()
-        throws IOException
-    {
-        Set<String> dependencies = getDependencies( ArrayCases.class );
-        assertThat( dependencies ).doesNotContain( "[I" );
-        assertThat( dependencies ).allSatisfy( dependency -> assertThat( dependency ).doesNotStartWith( "[" ) );
-        assertThat( dependencies )
-            .contains( "java.lang.annotation.Annotation" )
-            .contains( "java.lang.reflect.Constructor" );
+    void testJava11Invoke() throws IOException {
+        String className = "issue362.Bcel362";
+        Path path = Paths.get(
+                "src/test/resources/org/apache/maven/shared/dependency/analyzer/commons-bcel-issue362/Bcel362.classx");
+        DependencyClassFileVisitor visitor = new DependencyClassFileVisitor();
+        try (InputStream is = Files.newInputStream(path)) {
+            visitor.visitClass(className, is);
+        }
+    }
+
+    @Test
+    void testArrayCases() throws IOException {
+        Set<String> dependencies = getDependencies(ArrayCases.class);
+        assertThat(dependencies).doesNotContain("[I");
+        assertThat(dependencies).allSatisfy(dependency -> assertThat(dependency).doesNotStartWith("["));
+        assertThat(dependencies).contains("java.lang.annotation.Annotation").contains("java.lang.reflect.Constructor");
     }
 
     @Test
-    public void testNoMethodHandle()
-        throws IOException
-    {
-        Set<String> dependencies = getDependencies( MethodHandleCases.class );
-        for ( String dependency : dependencies )
-        {
-            assertThat( dependency ).doesNotStartWith( "(" );
+    void testNoMethodHandle() throws IOException {
+        Set<String> dependencies = getDependencies(MethodHandleCases.class);
+        for (String dependency : dependencies) {
+            assertThat(dependency).doesNotStartWith("(");
         }
     }
 
     @Test
-    public void testInnerClassAsContainer()
-        throws IOException
-    {
-        Set<String> dependencies = getDependencies( InnerClassCase.class );
-        for ( String dependency : dependencies )
-        {
-            assertThat( dependency ).doesNotContain( "$" );
+    void testInnerClassAsContainer() throws IOException {
+        Set<String> dependencies = getDependencies(InnerClassCase.class);
+        for (String dependency : dependencies) {
+            assertThat(dependency).doesNotContain("$");
         }
-        assertThat( dependencies ).contains( "java.lang.System" );
+        assertThat(dependencies).contains("java.lang.System");
     }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/maven/shared/dependency/analyzer/testcases/ArrayCases.java b/src/test/java/org/apache/maven/shared/dependency/analyzer/testcases/ArrayCases.java
index 55df57b..68f339f 100644
--- a/src/test/java/org/apache/maven/shared/dependency/analyzer/testcases/ArrayCases.java
+++ b/src/test/java/org/apache/maven/shared/dependency/analyzer/testcases/ArrayCases.java
@@ -1,5 +1,3 @@
-package org.apache.maven.shared.dependency.analyzer.testcases;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@ package org.apache.maven.shared.dependency.analyzer.testcases;
  * "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
+ *   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
@@ -18,36 +16,31 @@ package org.apache.maven.shared.dependency.analyzer.testcases;
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.shared.dependency.analyzer.testcases;
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Constructor;
 
 import org.apache.maven.shared.dependency.analyzer.asm.DefaultMethodVisitor;
 
-public class ArrayCases
-{
+public class ArrayCases {
     /**
      * Cause {@link DefaultMethodVisitor#visitMethodInsn(int, String, String, String, boolean)} to be called
      * with primitive array
      * @param source
      * @return
      */
-    public int[] primitive( int[] source )
-    {
+    public int[] primitive(int[] source) {
         // causes
         return source.clone();
     }
 
-    public <T> void arrayOfArrayCollectedAsReference( Class<T> cls )
-    {
+    public <T> void arrayOfArrayCollectedAsReference(Class<T> cls) {
         Constructor<?>[] constructors = cls.getConstructors();
-        for ( Constructor<?> constructor : constructors )
-        {
-            for ( Annotation[] parameters : constructor.getParameterAnnotations() )
-            {
-                for ( Annotation annotation : parameters )
-                {
-                    System.out.println("Class: "+cls+", Annotation: "+ annotation );
+        for (Constructor<?> constructor : constructors) {
+            for (Annotation[] parameters : constructor.getParameterAnnotations()) {
+                for (Annotation annotation : parameters) {
+                    System.out.println("Class: " + cls + ", Annotation: " + annotation);
                 }
             }
         }
diff --git a/src/test/java/org/apache/maven/shared/dependency/analyzer/testcases/InnerClassCase.java b/src/test/java/org/apache/maven/shared/dependency/analyzer/testcases/InnerClassCase.java
index 19eb9b2..ef675c7 100644
--- a/src/test/java/org/apache/maven/shared/dependency/analyzer/testcases/InnerClassCase.java
+++ b/src/test/java/org/apache/maven/shared/dependency/analyzer/testcases/InnerClassCase.java
@@ -1,5 +1,3 @@
-package org.apache.maven.shared.dependency.analyzer.testcases;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@ package org.apache.maven.shared.dependency.analyzer.testcases;
  * "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
+ *   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
@@ -18,13 +16,12 @@ package org.apache.maven.shared.dependency.analyzer.testcases;
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.shared.dependency.analyzer.testcases;
 
 import java.util.function.Consumer;
 
-public class InnerClassCase
-{
-    public Consumer<String> echoThis()
-    {
-        return ( s ) -> System.out.println( s );
+public class InnerClassCase {
+    public Consumer<String> echoThis() {
+        return (s) -> System.out.println(s);
     }
 }
diff --git a/src/test/java/org/apache/maven/shared/dependency/analyzer/testcases/MethodHandleCases.java b/src/test/java/org/apache/maven/shared/dependency/analyzer/testcases/MethodHandleCases.java
index 969dac8..1310cce 100644
--- a/src/test/java/org/apache/maven/shared/dependency/analyzer/testcases/MethodHandleCases.java
+++ b/src/test/java/org/apache/maven/shared/dependency/analyzer/testcases/MethodHandleCases.java
@@ -1,5 +1,3 @@
-package org.apache.maven.shared.dependency.analyzer.testcases;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@ package org.apache.maven.shared.dependency.analyzer.testcases;
  * "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
+ *   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
@@ -18,24 +16,20 @@ package org.apache.maven.shared.dependency.analyzer.testcases;
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.shared.dependency.analyzer.testcases;
 
 import java.util.function.Consumer;
 
-public class MethodHandleCases
-{
-    public void sayHello()
-    {
-        sayHello( this::callSite );
+public class MethodHandleCases {
+    public void sayHello() {
+        sayHello(this::callSite);
     }
 
-    void sayHello( Consumer<String> consumer )
-    {
-        consumer.accept( "hello" );
+    void sayHello(Consumer<String> consumer) {
+        consumer.accept("hello");
     }
 
-    private void callSite( String output )
-    {
-        System.out.println( output );
+    private void callSite(String output) {
+        System.out.println(output);
     }
-
 }
diff --git a/src/test/resources/org/apache/maven/shared/dependency/analyzer/commons-bcel-issue362/Bcel362.classx b/src/test/resources/org/apache/maven/shared/dependency/analyzer/commons-bcel-issue362/Bcel362.classx
new file mode 100644
index 0000000..b1e1415
Binary files /dev/null and b/src/test/resources/org/apache/maven/shared/dependency/analyzer/commons-bcel-issue362/Bcel362.classx differ
diff --git a/src/test/resources/org/apache/maven/shared/dependency/analyzer/commons-bcel-issue362/Bcel362.java b/src/test/resources/org/apache/maven/shared/dependency/analyzer/commons-bcel-issue362/Bcel362.java
new file mode 100644
index 0000000..736dd6c
--- /dev/null
+++ b/src/test/resources/org/apache/maven/shared/dependency/analyzer/commons-bcel-issue362/Bcel362.java
@@ -0,0 +1,28 @@
+/*
+ * 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 issue362;
+
+/**
+ * Compile to Java 11 byte code, then instrument with JaCoCo in order to add
+ * condy (constant dynamic) instructions
+ */
+public class Bcel362 {
+  public static void main(String[] args) {
+    System.out.println("Hello world!");
+  }
+}

More details

Full run details

Historical runs