You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by cs...@apache.org on 2022/07/02 20:42:12 UTC

[maven-shared-jar] 01/01: Drop legacy stuff, make project Java8 and modern stuff

This is an automated email from the ASF dual-hosted git repository.

cstamas pushed a commit to branch drop-legacy
in repository https://gitbox.apache.org/repos/asf/maven-shared-jar.git

commit 80e2cdc3ae603f89a7d117ed2de9dc5c0afdd56a
Author: Tamas Cservenak <ta...@cservenak.net>
AuthorDate: Sat Jul 2 22:41:51 2022 +0200

    Drop legacy stuff, make project Java8 and modern stuff
---
 pom.xml                                            | 80 ++++++++++------------
 .../org/apache/maven/shared/jar/JarAnalyzer.java   |  9 +--
 .../java/org/apache/maven/shared/jar/JarData.java  |  2 +-
 .../maven/shared/jar/classes/ImportVisitor.java    |  8 ++-
 .../maven/shared/jar/classes/JarClasses.java       | 16 ++---
 .../shared/jar/classes/JarClassesAnalysis.java     | 17 +++--
 .../jar/identification/JarIdentification.java      | 10 +--
 .../identification/JarIdentificationAnalysis.java  | 31 +++++----
 .../exposers/EmbeddedMavenModelExposer.java        | 20 ++++--
 .../identification/exposers/FilenameExposer.java   | 12 ++--
 .../identification/exposers/JarClassesExposer.java | 29 ++++----
 .../identification/exposers/ManifestExposer.java   |  8 ++-
 .../exposers/RepositorySearchExposer.java          | 53 ++++++--------
 .../exposers/StaticMainOutputExposer.java          |  8 ++-
 .../identification/exposers/TextFileExposer.java   | 22 +++---
 .../identification/exposers/TimestampExposer.java  | 10 ++-
 .../hash/JarBytecodeHashAnalyzer.java              | 36 +++++-----
 .../identification/hash/JarFileHashAnalyzer.java   | 35 ++++++----
 .../repository/EmptyRepositoryHashSearch.java      |  7 +-
 .../shared/jar/AbstractJarAnalyzerTestCase.java    |  8 +++
 20 files changed, 230 insertions(+), 191 deletions(-)

diff --git a/pom.xml b/pom.xml
index 188bba7..0a33305 100644
--- a/pom.xml
+++ b/pom.xml
@@ -24,7 +24,7 @@
   <parent>
     <groupId>org.apache.maven.shared</groupId>
     <artifactId>maven-shared-components</artifactId>
-    <version>34</version>
+    <version>36</version>
     <relativePath />
   </parent>
 
@@ -58,22 +58,23 @@
   </distributionManagement>
 
   <properties>
-    <mavenVersion>3.1.0</mavenVersion>
-    <javaVersion>7</javaVersion>
+    <javaVersion>8</javaVersion>
+    <mavenVersion>3.2.5</mavenVersion>
+    <slf4jVersion>1.7.36</slf4jVersion>
     <project.build.outputTimestamp>2020-04-04T09:03:59Z</project.build.outputTimestamp>
   </properties>
 
-  <dependencyManagement>
-    <dependencies>
-      <dependency>
-        <groupId>org.codehaus.plexus</groupId>
-        <artifactId>plexus-component-annotations</artifactId>
-        <version>2.1.0</version>
-      </dependency>
-    </dependencies>
-  </dependencyManagement>
-
   <dependencies>
+    <dependency>
+      <groupId>javax.inject</groupId>
+      <artifactId>javax.inject</artifactId>
+      <version>1</version>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+      <version>${slf4jVersion}</version>
+    </dependency>
     <dependency>
       <groupId>org.apache.maven</groupId>
       <artifactId>maven-model</artifactId>
@@ -84,17 +85,6 @@
       <artifactId>maven-artifact</artifactId>
       <version>${mavenVersion}</version>
     </dependency>
-    <dependency>
-      <groupId>org.apache.maven.shared</groupId>
-      <artifactId>maven-shared-utils</artifactId>
-      <version>3.3.3</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.codehaus.plexus</groupId>
-      <artifactId>plexus-container-default</artifactId>
-      <version>2.1.0</version>
-    </dependency>
     <dependency>
       <groupId>org.codehaus.plexus</groupId>
       <artifactId>plexus-digest</artifactId>
@@ -109,30 +99,42 @@
     <dependency>
       <groupId>org.codehaus.plexus</groupId>
       <artifactId>plexus-utils</artifactId>
-      <version>3.3.0</version>
+      <version>3.4.2</version>
     </dependency>
 
     <dependency>
       <groupId>org.apache.bcel</groupId>
       <artifactId>bcel</artifactId>
-      <version>6.2</version><!-- Java 7 -->
+      <version>6.5.0</version>
     </dependency>
 
     <dependency>
       <groupId>org.apache.commons</groupId>
       <artifactId>commons-collections4</artifactId>
-      <version>4.2</version><!-- Java 7 -->
-    </dependency>
-
-    <dependency>
-      <groupId>org.codehaus.plexus</groupId>
-      <artifactId>plexus-component-annotations</artifactId>
+      <version>4.3</version>
     </dependency>
 
     <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
-      <version>4.13.1</version>
+      <version>4.13.2</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-simple</artifactId>
+      <version>${slf4jVersion}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.sisu</groupId>
+      <artifactId>org.eclipse.sisu.plexus</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.google.inject</groupId>
+      <artifactId>guice</artifactId>
+      <version>5.1.0</version>
       <scope>test</scope>
     </dependency>
 
@@ -141,16 +143,8 @@
   <build>
     <plugins>
       <plugin>
-        <groupId>org.codehaus.plexus</groupId>
-        <artifactId>plexus-component-metadata</artifactId>
-        <version>2.1.0</version>
-        <executions>
-          <execution>
-            <goals>
-              <goal>generate-metadata</goal>
-            </goals>
-          </execution>
-        </executions>
+        <groupId>org.eclipse.sisu</groupId>
+        <artifactId>sisu-maven-plugin</artifactId>
       </plugin>
     </plugins>
   </build>
diff --git a/src/main/java/org/apache/maven/shared/jar/JarAnalyzer.java b/src/main/java/org/apache/maven/shared/jar/JarAnalyzer.java
index 077e0d9..c1c8980 100644
--- a/src/main/java/org/apache/maven/shared/jar/JarAnalyzer.java
+++ b/src/main/java/org/apache/maven/shared/jar/JarAnalyzer.java
@@ -31,6 +31,7 @@ import java.util.jar.JarFile;
 import java.util.jar.Manifest;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import java.util.zip.ZipEntry;
 import java.util.zip.ZipException;
 
 /**
@@ -115,13 +116,7 @@ public class JarAnalyzer
         List<JarEntry> entries = Collections.list( jarFile.entries() );
 
         // Sorting of list is done by name to ensure a bytecode hash is always consistent.
-        Collections.sort( entries, new Comparator<JarEntry>()
-        {
-            public int compare( JarEntry entry1, JarEntry entry2 )
-            {
-                return entry1.getName().compareTo( entry2.getName() );
-            }
-        } );
+        entries.sort( Comparator.comparing( ZipEntry::getName ) );
 
         Manifest manifest;
         try
diff --git a/src/main/java/org/apache/maven/shared/jar/JarData.java b/src/main/java/org/apache/maven/shared/jar/JarData.java
index faf7220..6c8739a 100644
--- a/src/main/java/org/apache/maven/shared/jar/JarData.java
+++ b/src/main/java/org/apache/maven/shared/jar/JarData.java
@@ -21,7 +21,7 @@ package org.apache.maven.shared.jar;
 
 import org.apache.maven.shared.jar.classes.JarClasses;
 import org.apache.maven.shared.jar.identification.JarIdentification;
-import org.apache.maven.shared.utils.StringUtils;
+import org.codehaus.plexus.util.StringUtils;
 
 import java.io.File;
 import java.util.Collections;
diff --git a/src/main/java/org/apache/maven/shared/jar/classes/ImportVisitor.java b/src/main/java/org/apache/maven/shared/jar/classes/ImportVisitor.java
index 21edbbe..e5a5e69 100644
--- a/src/main/java/org/apache/maven/shared/jar/classes/ImportVisitor.java
+++ b/src/main/java/org/apache/maven/shared/jar/classes/ImportVisitor.java
@@ -39,12 +39,12 @@ public class ImportVisitor
     /**
      * The list of imports discovered.
      */
-    private List<String> imports;
+    private final List<String> imports;
 
     /**
      * The Java class that is being analyzed.
      */
-    private JavaClass javaClass;
+    private final JavaClass javaClass;
 
     /**
      * Pattern to detect if the import is qualified and allows retrieval of the actual import name from the string via
@@ -68,7 +68,7 @@ public class ImportVisitor
 
         // Create a list that is guaranteed to be unique while retaining it's list qualities (LinkedHashSet does not
         // expose the list interface even if natural ordering is retained)  
-        this.imports = SetUniqueList.setUniqueList( new ArrayList<String>() );
+        this.imports = SetUniqueList.setUniqueList( new ArrayList<>() );
     }
 
     /**
@@ -86,6 +86,7 @@ public class ImportVisitor
      *
      * @see org.apache.bcel.classfile.EmptyVisitor#visitConstantClass(org.apache.bcel.classfile.ConstantClass)
      */
+    @Override
     public void visitConstantClass( ConstantClass constantClass )
     {
         String name = constantClass.getBytes( javaClass.getConstantPool() );
@@ -119,6 +120,7 @@ public class ImportVisitor
      *
      * @see org.apache.bcel.classfile.EmptyVisitor#visitConstantUtf8(org.apache.bcel.classfile.ConstantUtf8)
      */
+    @Override
     public void visitConstantUtf8( ConstantUtf8 constantUtf8 )
     {
         String ret = constantUtf8.getBytes().trim();
diff --git a/src/main/java/org/apache/maven/shared/jar/classes/JarClasses.java b/src/main/java/org/apache/maven/shared/jar/classes/JarClasses.java
index a9744d0..6f5f30e 100644
--- a/src/main/java/org/apache/maven/shared/jar/classes/JarClasses.java
+++ b/src/main/java/org/apache/maven/shared/jar/classes/JarClasses.java
@@ -35,22 +35,22 @@ public class JarClasses
     /**
      * The list of imports in the classes in the JAR.
      */
-    private List<String> imports;
+    private final List<String> imports;
 
     /**
      * A list of packages represented by classes in the JAR.
      */
-    private List<String> packages;
+    private final List<String> packages;
 
     /**
      * A list of the classes that in the JAR.
      */
-    private List<String> classNames;
+    private final List<String> classNames;
 
     /**
      * A list of methods within the classes in the JAR.
      */
-    private List<String> methods;
+    private final List<String> methods;
 
     /**
      * Whether the JAR contains any code with debug information. If there is a mix of debug and release code, this will
@@ -71,10 +71,10 @@ public class JarClasses
     {
         // Unique list decorators are used to ensure natural ordering is retained, the list interface is availble, and
         // that duplicates are not entered.
-        imports = SetUniqueList.setUniqueList( new ArrayList<String>() );
-        packages = SetUniqueList.setUniqueList( new ArrayList<String>() );
-        classNames = SetUniqueList.setUniqueList( new ArrayList<String>() );
-        methods = SetUniqueList.setUniqueList( new ArrayList<String>() );
+        imports = SetUniqueList.setUniqueList( new ArrayList<>() );
+        packages = SetUniqueList.setUniqueList( new ArrayList<>() );
+        classNames = SetUniqueList.setUniqueList( new ArrayList<>() );
+        methods = SetUniqueList.setUniqueList( new ArrayList<>() );
     }
 
     /**
diff --git a/src/main/java/org/apache/maven/shared/jar/classes/JarClassesAnalysis.java b/src/main/java/org/apache/maven/shared/jar/classes/JarClassesAnalysis.java
index e8769d9..4b678ee 100644
--- a/src/main/java/org/apache/maven/shared/jar/classes/JarClassesAnalysis.java
+++ b/src/main/java/org/apache/maven/shared/jar/classes/JarClassesAnalysis.java
@@ -19,6 +19,9 @@ package org.apache.maven.shared.jar.classes;
  * under the License.
  */
 
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import org.apache.bcel.classfile.ClassFormatException;
 import org.apache.bcel.classfile.ClassParser;
 import org.apache.bcel.classfile.DescendingVisitor;
@@ -26,8 +29,8 @@ import org.apache.bcel.classfile.JavaClass;
 import org.apache.bcel.classfile.LineNumberTable;
 import org.apache.bcel.classfile.Method;
 import org.apache.maven.shared.jar.JarAnalyzer;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.logging.AbstractLogEnabled;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
 import java.util.List;
@@ -41,10 +44,12 @@ import java.util.jar.JarEntry;
  *
  * @see #analyze(org.apache.maven.shared.jar.JarAnalyzer)
  */
-@Component ( role = JarClassesAnalysis.class )
+@Singleton
+@Named
 public class JarClassesAnalysis
-    extends AbstractLogEnabled
 {
+    private final Logger logger = LoggerFactory.getLogger( getClass() );
+
     private static final double JAVA_1_8_CLASS_VERSION = 52.0;
 
     private static final double JAVA_1_7_CLASS_VERSION = 51.0;
@@ -133,12 +138,12 @@ public class JarClassesAnalysis
                 }
                 catch ( ClassFormatException e )
                 {
-                    getLogger().warn( "Unable to process class " + classname + " in JarAnalyzer File " + jarfilename,
+                    logger.warn( "Unable to process class " + classname + " in JarAnalyzer File " + jarfilename,
                                       e );
                 }
                 catch ( IOException e )
                 {
-                    getLogger().warn( "Unable to process JarAnalyzer File " + jarfilename, e );
+                    logger.warn( "Unable to process JarAnalyzer File " + jarfilename, e );
                 }
             }
 
diff --git a/src/main/java/org/apache/maven/shared/jar/identification/JarIdentification.java b/src/main/java/org/apache/maven/shared/jar/identification/JarIdentification.java
index d0d341d..8378f71 100644
--- a/src/main/java/org/apache/maven/shared/jar/identification/JarIdentification.java
+++ b/src/main/java/org/apache/maven/shared/jar/identification/JarIdentification.java
@@ -57,27 +57,27 @@ public class JarIdentification
     /**
      * The list of possible group IDs discovered.
      */
-    private List<String> potentialGroupIds = new ArrayList<>();
+    private final List<String> potentialGroupIds = new ArrayList<>();
 
     /**
      * The list of possible artifact IDs discovered.
      */
-    private List<String> potentialArtifactIds = new ArrayList<>();
+    private final List<String> potentialArtifactIds = new ArrayList<>();
 
     /**
      * The list of possible versions discovered.
      */
-    private List<String> potentialVersions = new ArrayList<>();
+    private final List<String> potentialVersions = new ArrayList<>();
 
     /**
      * The list of possible artifact names discovered.
      */
-    private List<String> potentialNames = new ArrayList<>();
+    private final List<String> potentialNames = new ArrayList<>();
 
     /**
      * The list of possible vendors discovered.
      */
-    private List<String> potentialVendors = new ArrayList<>();
+    private final List<String> potentialVendors = new ArrayList<>();
 
     /**
      * Add a validated group ID.
diff --git a/src/main/java/org/apache/maven/shared/jar/identification/JarIdentificationAnalysis.java b/src/main/java/org/apache/maven/shared/jar/identification/JarIdentificationAnalysis.java
index f7587ed..82a40d3 100644
--- a/src/main/java/org/apache/maven/shared/jar/identification/JarIdentificationAnalysis.java
+++ b/src/main/java/org/apache/maven/shared/jar/identification/JarIdentificationAnalysis.java
@@ -19,34 +19,40 @@ package org.apache.maven.shared.jar.identification;
  * under the License.
  */
 
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import org.apache.maven.shared.jar.JarAnalyzer;
-import org.apache.maven.shared.utils.StringUtils;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
+import org.codehaus.plexus.util.StringUtils;
 
-import java.util.Collections;
 import java.util.List;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * Analyze the JAR file to identify Maven artifact metadata. This class is thread safe and immutable as long as all
  * provided exposers are, as it retains no state.
  * <p/>
  * If using Plexus, the class will use all available exposers in the container.
  * <p/>
- * If not using Plexus, the exposers must be set using {@link #setExposers(java.util.List)} before calling
- * {@link #analyze(org.apache.maven.shared.jar.JarAnalyzer)}
- * <p/>
  * Note that you must first create an instance of {@link org.apache.maven.shared.jar.JarAnalyzer} - see its Javadoc for
  * a typical use.
  */
-@Component( role =  JarIdentificationAnalysis.class )
+@Singleton
+@Named
 public class JarIdentificationAnalysis
 {
     /**
      * The Maven information exposers to use during identification.
      */
-    @Requirement( role = JarIdentificationExposer.class )
-    private List<JarIdentificationExposer> exposers;
+    private final List<JarIdentificationExposer> exposers;
+
+    @Inject
+    public JarIdentificationAnalysis( List<JarIdentificationExposer> exposers )
+    {
+        this.exposers = requireNonNull( exposers );
+    }
 
     /**
      * Analyze a JAR and find any associated Maven metadata. Note that if the provided JAR analyzer has previously
@@ -143,9 +149,4 @@ public class JarIdentificationAnalysis
         }
         return largest;
     }
-
-    public void setExposers( List<JarIdentificationExposer> exposers )
-    {
-        this.exposers = Collections.unmodifiableList( exposers );
-    }
 }
diff --git a/src/main/java/org/apache/maven/shared/jar/identification/exposers/EmbeddedMavenModelExposer.java b/src/main/java/org/apache/maven/shared/jar/identification/exposers/EmbeddedMavenModelExposer.java
index 1ef3ebf..5e8e084 100644
--- a/src/main/java/org/apache/maven/shared/jar/identification/exposers/EmbeddedMavenModelExposer.java
+++ b/src/main/java/org/apache/maven/shared/jar/identification/exposers/EmbeddedMavenModelExposer.java
@@ -19,15 +19,18 @@ package org.apache.maven.shared.jar.identification.exposers;
  * under the License.
  */
 
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import org.apache.maven.model.Model;
 import org.apache.maven.model.Organization;
 import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
 import org.apache.maven.shared.jar.JarAnalyzer;
 import org.apache.maven.shared.jar.identification.JarIdentification;
 import org.apache.maven.shared.jar.identification.JarIdentificationExposer;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.logging.AbstractLogEnabled;
 import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -38,11 +41,14 @@ import java.util.jar.JarEntry;
 /**
  * Exposer that examines a JAR file for any embedded Maven metadata for identification.
  */
-@Component( role = JarIdentificationExposer.class, hint = "embeddedMavenModel" )
+@Singleton
+@Named( "embeddedMavenModel" )
 public class EmbeddedMavenModelExposer
-    extends AbstractLogEnabled
     implements JarIdentificationExposer
 {
+    private final Logger logger = LoggerFactory.getLogger( getClass() );
+
+    @Override
     public void expose( JarIdentification identification, JarAnalyzer jarAnalyzer )
     {
         List<JarEntry> entries = jarAnalyzer.getMavenPomEntries();
@@ -53,7 +59,7 @@ public class EmbeddedMavenModelExposer
 
         if ( entries.size() > 1 )
         {
-            getLogger().warn(
+            logger.warn(
                 "More than one Maven model entry was found in the JAR, using only the first of: " + entries );
         }
 
@@ -96,11 +102,11 @@ public class EmbeddedMavenModelExposer
         }
         catch ( IOException e )
         {
-            getLogger().error( "Unable to read model " + pom.getName() + " in " + jarAnalyzer.getFile() + ".", e );
+            logger.error( "Unable to read model " + pom.getName() + " in " + jarAnalyzer.getFile() + ".", e );
         }
         catch ( XmlPullParserException e )
         {
-            getLogger().error( "Unable to parse model " + pom.getName() + " in " + jarAnalyzer.getFile() + ".", e );
+            logger.error( "Unable to parse model " + pom.getName() + " in " + jarAnalyzer.getFile() + ".", e );
         }
     }
 }
diff --git a/src/main/java/org/apache/maven/shared/jar/identification/exposers/FilenameExposer.java b/src/main/java/org/apache/maven/shared/jar/identification/exposers/FilenameExposer.java
index afc129b..e996cde 100644
--- a/src/main/java/org/apache/maven/shared/jar/identification/exposers/FilenameExposer.java
+++ b/src/main/java/org/apache/maven/shared/jar/identification/exposers/FilenameExposer.java
@@ -19,11 +19,13 @@ package org.apache.maven.shared.jar.identification.exposers;
  * under the License.
  */
 
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import org.apache.maven.shared.jar.JarAnalyzer;
 import org.apache.maven.shared.jar.identification.JarIdentification;
 import org.apache.maven.shared.jar.identification.JarIdentificationExposer;
-import org.apache.maven.shared.utils.io.FileUtils;
-import org.codehaus.plexus.component.annotations.Component;
+import org.codehaus.plexus.util.FileUtils;
 
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -33,12 +35,14 @@ import java.util.regex.Pattern;
  * Exposer that examines a JAR file to derive Maven metadata from the pattern of the JAR's filename.
  * Will match the format <i>artifactId</i>-<i>version</i>.jar.
  */
-@Component( role = JarIdentificationExposer.class, hint = "filename" )
+@Singleton
+@Named( "filename" )
 public class FilenameExposer
     implements JarIdentificationExposer
 {
-    private static final Pattern VERSION_PATTERN = Pattern.compile( "-[0-9]" );
+    private static final Pattern VERSION_PATTERN = Pattern.compile( "-\\d" );
 
+    @Override
     public void expose( JarIdentification identification, JarAnalyzer jarAnalyzer )
     {
         String filename = FileUtils.removeExtension( jarAnalyzer.getFile().getName() );
diff --git a/src/main/java/org/apache/maven/shared/jar/identification/exposers/JarClassesExposer.java b/src/main/java/org/apache/maven/shared/jar/identification/exposers/JarClassesExposer.java
index f31d15f..db2f3b9 100644
--- a/src/main/java/org/apache/maven/shared/jar/identification/exposers/JarClassesExposer.java
+++ b/src/main/java/org/apache/maven/shared/jar/identification/exposers/JarClassesExposer.java
@@ -19,28 +19,36 @@ package org.apache.maven.shared.jar.identification.exposers;
  * under the License.
  */
 
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import org.apache.maven.shared.jar.JarAnalyzer;
 import org.apache.maven.shared.jar.classes.JarClasses;
 import org.apache.maven.shared.jar.classes.JarClassesAnalysis;
 import org.apache.maven.shared.jar.identification.JarIdentification;
 import org.apache.maven.shared.jar.identification.JarIdentificationExposer;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
+
+import static java.util.Objects.requireNonNull;
 
 /**
  * Exposer that examines a JAR file to derive Maven metadata from the classes in a JAR. It will currently identify
  * potential group IDs from the class packages.
- * <p/>
- * Note: if not being used from Plexus, the {@link #setAnalyzer(org.apache.maven.shared.jar.classes.JarClassesAnalysis)}
- * method must be called to avoid a NullPointerException during the expose method.
  */
-@Component( role = JarIdentificationExposer.class, hint = "jarClasses" )
+@Singleton
+@Named( "jarClasses" )
 public class JarClassesExposer
     implements JarIdentificationExposer
 {
-    @Requirement
-    private JarClassesAnalysis analyzer;
+    private final JarClassesAnalysis analyzer;
+
+    @Inject
+    public JarClassesExposer( JarClassesAnalysis analyzer )
+    {
+        this.analyzer = requireNonNull( analyzer );
+    }
 
+    @Override
     public void expose( JarIdentification identification, JarAnalyzer jarAnalyzer )
     {
         JarClasses jarclasses = analyzer.analyze( jarAnalyzer );
@@ -50,9 +58,4 @@ public class JarClassesExposer
             identification.addGroupId( packagename );
         }
     }
-
-    public void setAnalyzer( JarClassesAnalysis analyzer )
-    {
-        this.analyzer = analyzer;
-    }
 }
diff --git a/src/main/java/org/apache/maven/shared/jar/identification/exposers/ManifestExposer.java b/src/main/java/org/apache/maven/shared/jar/identification/exposers/ManifestExposer.java
index a168369..e932e91 100644
--- a/src/main/java/org/apache/maven/shared/jar/identification/exposers/ManifestExposer.java
+++ b/src/main/java/org/apache/maven/shared/jar/identification/exposers/ManifestExposer.java
@@ -19,10 +19,12 @@ package org.apache.maven.shared.jar.identification.exposers;
  * under the License.
  */
 
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import org.apache.maven.shared.jar.JarAnalyzer;
 import org.apache.maven.shared.jar.identification.JarIdentification;
 import org.apache.maven.shared.jar.identification.JarIdentificationExposer;
-import org.codehaus.plexus.component.annotations.Component;
 
 import java.util.jar.Attributes;
 import java.util.jar.Manifest;
@@ -30,10 +32,12 @@ import java.util.jar.Manifest;
 /**
  * Exposer that examines a JAR's manifest to derive Maven metadata.
  */
-@Component( role = JarIdentificationExposer.class, hint = "manifest" )
+@Singleton
+@Named( "manifest" )
 public class ManifestExposer
     implements JarIdentificationExposer
 {
+    @Override
     public void expose( JarIdentification identification, JarAnalyzer jarAnalyzer )
     {
         Manifest manifest = jarAnalyzer.getJarData().getManifest();
diff --git a/src/main/java/org/apache/maven/shared/jar/identification/exposers/RepositorySearchExposer.java b/src/main/java/org/apache/maven/shared/jar/identification/exposers/RepositorySearchExposer.java
index 630db9e..015d128 100644
--- a/src/main/java/org/apache/maven/shared/jar/identification/exposers/RepositorySearchExposer.java
+++ b/src/main/java/org/apache/maven/shared/jar/identification/exposers/RepositorySearchExposer.java
@@ -19,31 +19,29 @@ package org.apache.maven.shared.jar.identification.exposers;
  * under the License.
  */
 
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.shared.jar.JarAnalyzer;
 import org.apache.maven.shared.jar.identification.JarIdentification;
 import org.apache.maven.shared.jar.identification.JarIdentificationExposer;
 import org.apache.maven.shared.jar.identification.hash.JarHashAnalyzer;
 import org.apache.maven.shared.jar.identification.repository.RepositoryHashSearch;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
-import org.codehaus.plexus.logging.AbstractLogEnabled;
 
 import java.util.ArrayList;
 import java.util.List;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * Exposer that examines a Maven repository for identical files to the JAR being analyzed. It will look for both
  * identical files, and files with identical classes.
- * <p/>
- * Note: if not using Plexus, you must call the following methods to be able to expose any data from the class:
- * {@link #setBytecodeHashAnalyzer(org.apache.maven.shared.jar.identification.hash.JarHashAnalyzer)},
- * {@link #setFileHashAnalyzer(org.apache.maven.shared.jar.identification.hash.JarHashAnalyzer)},
- * {@link #setRepositoryHashSearch(org.apache.maven.shared.jar.identification.repository.RepositoryHashSearch)}
  */
-@Component( role = JarIdentificationExposer.class, hint = "repositorySearch" )
+@Singleton
+@Named( "repositorySearch" )
 public class RepositorySearchExposer
-    extends AbstractLogEnabled
     implements JarIdentificationExposer
 {
     /**
@@ -51,21 +49,29 @@ public class RepositorySearchExposer
      *
      * @todo this currently only provides for the 'empty' repository search, which isn't very useful
      */
-    @Requirement
-    private RepositoryHashSearch repositoryHashSearch;
+    private final RepositoryHashSearch repositoryHashSearch;
 
     /**
      * The hash analyzer for the entire file.
      */
-    @Requirement( hint = "file" )
-    private JarHashAnalyzer fileHashAnalyzer;
+    private final JarHashAnalyzer fileHashAnalyzer;
 
     /**
      * The hash analyzer for the file's bytecode.
      */
-    @Requirement( hint = "bytecode" )
-    private JarHashAnalyzer bytecodeHashAnalyzer;
+    private final JarHashAnalyzer bytecodeHashAnalyzer;
 
+    @Inject
+    public RepositorySearchExposer( RepositoryHashSearch repositoryHashSearch,
+                                    @Named( "file" ) JarHashAnalyzer fileHashAnalyzer,
+                                    @Named( "bytecode" ) JarHashAnalyzer bytecodeHashAnalyzer )
+    {
+        this.repositoryHashSearch = requireNonNull( repositoryHashSearch );
+        this.fileHashAnalyzer = requireNonNull( fileHashAnalyzer );
+        this.bytecodeHashAnalyzer = requireNonNull( bytecodeHashAnalyzer );
+    }
+
+    @Override
     public void expose( JarIdentification identification, JarAnalyzer jarAnalyzer )
     {
         List<Artifact> repohits = new ArrayList<>();
@@ -90,19 +96,4 @@ public class RepositorySearchExposer
             identification.addAndSetVersion( artifact.getVersion() );
         }
     }
-
-    public void setRepositoryHashSearch( RepositoryHashSearch repo )
-    {
-        this.repositoryHashSearch = repo;
-    }
-
-    public void setFileHashAnalyzer( JarHashAnalyzer fileHashAnalyzer )
-    {
-        this.fileHashAnalyzer = fileHashAnalyzer;
-    }
-
-    public void setBytecodeHashAnalyzer( JarHashAnalyzer bytecodeHashAnalyzer )
-    {
-        this.bytecodeHashAnalyzer = bytecodeHashAnalyzer;
-    }
 }
diff --git a/src/main/java/org/apache/maven/shared/jar/identification/exposers/StaticMainOutputExposer.java b/src/main/java/org/apache/maven/shared/jar/identification/exposers/StaticMainOutputExposer.java
index 10e7780..65a3acc 100644
--- a/src/main/java/org/apache/maven/shared/jar/identification/exposers/StaticMainOutputExposer.java
+++ b/src/main/java/org/apache/maven/shared/jar/identification/exposers/StaticMainOutputExposer.java
@@ -19,10 +19,12 @@ package org.apache.maven.shared.jar.identification.exposers;
  * under the License.
  */
 
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import org.apache.maven.shared.jar.JarAnalyzer;
 import org.apache.maven.shared.jar.identification.JarIdentification;
 import org.apache.maven.shared.jar.identification.JarIdentificationExposer;
-import org.codehaus.plexus.component.annotations.Component;
 
 import java.util.Collections;
 import java.util.List;
@@ -33,10 +35,12 @@ import java.util.List;
  *
  * @todo not currently implemented
  */
-@Component( role = JarIdentificationExposer.class, hint = "staticMainOutput" )
+@Singleton
+@Named( "staticMainOutput" )
 public class StaticMainOutputExposer
     implements JarIdentificationExposer
 {
+    @Override
     public void expose( JarIdentification identification, JarAnalyzer jarAnalyzer )
     {
         List<String> staticMains = findStaticMainVersions();
diff --git a/src/main/java/org/apache/maven/shared/jar/identification/exposers/TextFileExposer.java b/src/main/java/org/apache/maven/shared/jar/identification/exposers/TextFileExposer.java
index cd25f29..404f1dc 100644
--- a/src/main/java/org/apache/maven/shared/jar/identification/exposers/TextFileExposer.java
+++ b/src/main/java/org/apache/maven/shared/jar/identification/exposers/TextFileExposer.java
@@ -19,12 +19,15 @@ package org.apache.maven.shared.jar.identification.exposers;
  * under the License.
  */
 
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import org.apache.maven.shared.jar.JarAnalyzer;
 import org.apache.maven.shared.jar.identification.JarIdentification;
 import org.apache.maven.shared.jar.identification.JarIdentificationExposer;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.logging.AbstractLogEnabled;
-import org.apache.maven.shared.utils.StringUtils;
+import org.codehaus.plexus.util.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.io.BufferedReader;
 import java.io.IOException;
@@ -39,11 +42,14 @@ import java.util.jar.JarEntry;
  * Exposer that examines a a JAR for files that contain the text <code>version</code> (case-insensitive) and
  * adds the contents as potential version(s).
  */
-@Component( role = JarIdentificationExposer.class, hint = "textFile" )
+@Singleton
+@Named( "textFile" )
 public class TextFileExposer
-    extends AbstractLogEnabled
     implements JarIdentificationExposer
 {
+    private final Logger logger = LoggerFactory.getLogger( getClass() );
+
+    @Override
     public void expose( JarIdentification identification, JarAnalyzer jarAnalyzer )
     {
         List<String> textFiles = findTextFileVersions( jarAnalyzer );
@@ -63,7 +69,7 @@ public class TextFileExposer
             // skip this entry if it's a class file.
             if ( !entry.getName().endsWith( ".class" ) ) //$NON-NLS-1$
             {
-                getLogger().debug( "Version Hit: " + entry.getName() );
+                logger.debug( "Version Hit: " + entry.getName() );
                 try ( InputStream is = jarAnalyzer.getEntryInputStream( entry ) )
                 {
                     BufferedReader br = new BufferedReader( new InputStreamReader( is ) );
@@ -72,7 +78,7 @@ public class TextFileExposer
                     // TODO: check for key=value pair.
                     // TODO: maybe even for groupId entries.
 
-                    getLogger().debug( line );
+                    logger.debug( line );
                     if ( StringUtils.isNotEmpty( line ) )
                     {
                         textVersions.add( line );
@@ -80,7 +86,7 @@ public class TextFileExposer
                 }
                 catch ( IOException e )
                 {
-                    getLogger().warn( "Unable to read line from " + entry.getName(), e );
+                    logger.warn( "Unable to read line from " + entry.getName(), e );
                 }
             }
         }
diff --git a/src/main/java/org/apache/maven/shared/jar/identification/exposers/TimestampExposer.java b/src/main/java/org/apache/maven/shared/jar/identification/exposers/TimestampExposer.java
index fff9deb..250d035 100644
--- a/src/main/java/org/apache/maven/shared/jar/identification/exposers/TimestampExposer.java
+++ b/src/main/java/org/apache/maven/shared/jar/identification/exposers/TimestampExposer.java
@@ -19,13 +19,15 @@ package org.apache.maven.shared.jar.identification.exposers;
  * under the License.
  */
 
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import org.apache.commons.collections4.Bag;
 import org.apache.commons.collections4.bag.HashBag;
 import org.apache.maven.shared.jar.JarAnalyzer;
 import org.apache.maven.shared.jar.identification.JarIdentification;
 import org.apache.maven.shared.jar.identification.JarIdentificationExposer;
-import org.apache.maven.shared.utils.StringUtils;
-import org.codehaus.plexus.component.annotations.Component;
+import org.codehaus.plexus.util.StringUtils;
 
 import java.text.SimpleDateFormat;
 import java.util.Date;
@@ -36,10 +38,12 @@ import java.util.jar.JarEntry;
 /**
  * Exposer that examines a a JAR and uses the most recent timestamp as a potential version.
  */
-@Component( role = JarIdentificationExposer.class, hint = "timestamp" )
+@Singleton
+@Named( "timestamp" )
 public class TimestampExposer
     implements JarIdentificationExposer
 {
+    @Override
     public void expose( JarIdentification identification, JarAnalyzer jarAnalyzer )
     {
         List<JarEntry> entries = jarAnalyzer.getEntries();
diff --git a/src/main/java/org/apache/maven/shared/jar/identification/hash/JarBytecodeHashAnalyzer.java b/src/main/java/org/apache/maven/shared/jar/identification/hash/JarBytecodeHashAnalyzer.java
index 8f60315..d637ad7 100644
--- a/src/main/java/org/apache/maven/shared/jar/identification/hash/JarBytecodeHashAnalyzer.java
+++ b/src/main/java/org/apache/maven/shared/jar/identification/hash/JarBytecodeHashAnalyzer.java
@@ -19,36 +19,45 @@ package org.apache.maven.shared.jar.identification.hash;
  * under the License.
  */
 
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import org.apache.maven.shared.jar.JarAnalyzer;
 import org.apache.maven.shared.jar.JarData;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
 import org.codehaus.plexus.digest.DigesterException;
 import org.codehaus.plexus.digest.StreamingDigester;
-import org.codehaus.plexus.logging.AbstractLogEnabled;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.List;
 import java.util.jar.JarEntry;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * Analyzer that calculates the hash code for the entire file. Can be used to detect an exact copy of the file's class
  * data. Useful to see thru a recompile, recompression, or timestamp change.
- * <p/>
- * If you are not using Plexus, you must call {@link #setDigester(org.codehaus.plexus.digest.StreamingDigester)} before
- * use
  */
-@Component( role = JarHashAnalyzer.class, hint = "bytecode" )
+@Singleton
+@Named( "bytecode" )
 public class JarBytecodeHashAnalyzer
-    extends AbstractLogEnabled
     implements JarHashAnalyzer
 {
+    private final Logger logger = LoggerFactory.getLogger( getClass() );
+
     /**
      * The streaming digester to use for computing the hash. Under Plexus, the default is SHA-1.
      */
-    @Requirement( hint = "sha1" )
-    private StreamingDigester digester;
+    private final StreamingDigester digester;
+
+    @Inject
+    public JarBytecodeHashAnalyzer( @Named( "sha1" ) StreamingDigester digester )
+    {
+        this.digester = requireNonNull( digester );
+    }
 
     public String computeHash( JarAnalyzer jarAnalyzer )
     {
@@ -74,14 +83,9 @@ public class JarBytecodeHashAnalyzer
             }
             catch ( DigesterException | IOException e )
             {
-                getLogger().warn( "Unable to calculate the hashcode.", e );
+                logger.warn( "Unable to calculate the hashcode.", e );
             }
         }
         return result;
     }
-
-    public void setDigester( StreamingDigester digester )
-    {
-        this.digester = digester;
-    }
 }
diff --git a/src/main/java/org/apache/maven/shared/jar/identification/hash/JarFileHashAnalyzer.java b/src/main/java/org/apache/maven/shared/jar/identification/hash/JarFileHashAnalyzer.java
index 7ee1d5b..dc2372f 100644
--- a/src/main/java/org/apache/maven/shared/jar/identification/hash/JarFileHashAnalyzer.java
+++ b/src/main/java/org/apache/maven/shared/jar/identification/hash/JarFileHashAnalyzer.java
@@ -19,29 +19,39 @@ package org.apache.maven.shared.jar.identification.hash;
  * under the License.
  */
 
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import org.apache.maven.shared.jar.JarAnalyzer;
 import org.apache.maven.shared.jar.JarData;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
 import org.codehaus.plexus.digest.Digester;
 import org.codehaus.plexus.digest.DigesterException;
-import org.codehaus.plexus.logging.AbstractLogEnabled;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static java.util.Objects.requireNonNull;
 
 /**
  * Analyzer that calculates the hash code for the entire file. Can be used to detect an exact copy of the file.
- * <p/>
- * If you are not using Plexus, you must call {@link #setDigester(org.codehaus.plexus.digest.Digester)} before use
  */
-@Component( role = JarHashAnalyzer.class, hint = "file" )
+@Singleton
+@Named( "file" )
 public class JarFileHashAnalyzer
-    extends AbstractLogEnabled
     implements JarHashAnalyzer
 {
+    private final Logger logger = LoggerFactory.getLogger( getClass() );
+
     /**
      * The digester to use for computing the hash. Under Plexus, the default is SHA-1.
      */
-    @Requirement( hint = "sha1" )
-    private Digester digester;
+    private final Digester digester;
+
+    @Inject
+    public JarFileHashAnalyzer( @Named( "sha1" ) Digester digester )
+    {
+        this.digester = requireNonNull( digester );
+    }
 
     public String computeHash( JarAnalyzer jarAnalyzer )
     {
@@ -57,14 +67,9 @@ public class JarFileHashAnalyzer
             }
             catch ( DigesterException e )
             {
-                getLogger().warn( "Unable to calculate the hashcode.", e );
+                logger.warn( "Unable to calculate the hashcode.", e );
             }
         }
         return result;
     }
-
-    public void setDigester( Digester digester )
-    {
-        this.digester = digester;
-    }
 }
diff --git a/src/main/java/org/apache/maven/shared/jar/identification/repository/EmptyRepositoryHashSearch.java b/src/main/java/org/apache/maven/shared/jar/identification/repository/EmptyRepositoryHashSearch.java
index b29071d..71c5b4b 100644
--- a/src/main/java/org/apache/maven/shared/jar/identification/repository/EmptyRepositoryHashSearch.java
+++ b/src/main/java/org/apache/maven/shared/jar/identification/repository/EmptyRepositoryHashSearch.java
@@ -19,11 +19,13 @@ package org.apache.maven.shared.jar.identification.repository;
  * under the License.
  */
 
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import java.util.Collections;
 import java.util.List;
 
 import org.apache.maven.artifact.Artifact;
-import org.codehaus.plexus.component.annotations.Component;
 
 /**
  * Empty repository hash search.  Always returns an empty list.
@@ -32,7 +34,8 @@ import org.codehaus.plexus.component.annotations.Component;
  * an implementation of a {@link org.apache.maven.shared.jar.identification.repository.RepositoryHashSearch} against a
  * real repository.
  */
-@Component( role = RepositoryHashSearch.class, hint = "empty" )
+@Singleton
+@Named( "empty" )
 public class EmptyRepositoryHashSearch
     implements RepositoryHashSearch
 {
diff --git a/src/test/java/org/apache/maven/shared/jar/AbstractJarAnalyzerTestCase.java b/src/test/java/org/apache/maven/shared/jar/AbstractJarAnalyzerTestCase.java
index f391a7a..8f86fe9 100644
--- a/src/test/java/org/apache/maven/shared/jar/AbstractJarAnalyzerTestCase.java
+++ b/src/test/java/org/apache/maven/shared/jar/AbstractJarAnalyzerTestCase.java
@@ -20,6 +20,8 @@ package org.apache.maven.shared.jar;
  */
 
 import junit.framework.AssertionFailedError;
+import org.codehaus.plexus.ContainerConfiguration;
+import org.codehaus.plexus.PlexusConstants;
 import org.codehaus.plexus.PlexusTestCase;
 
 import java.io.File;
@@ -39,6 +41,12 @@ import static java.nio.charset.StandardCharsets.UTF_8;
 public abstract class AbstractJarAnalyzerTestCase
     extends PlexusTestCase
 {
+    @Override
+    protected void customizeContainerConfiguration( ContainerConfiguration configuration )
+    {
+        configuration.setAutoWiring( true ).setClassPathScanning( PlexusConstants.SCANNING_CACHE );
+    }
+
     protected File getSampleJar( String filename )
         throws UnsupportedEncodingException
     {