diff --git a/animal-sniffer-maven-plugin/src/main/java/org/codehaus/mojo/animal_sniffer/maven/CheckSignatureMojo.java b/animal-sniffer-maven-plugin/src/main/java/org/codehaus/mojo/animal_sniffer/maven/CheckSignatureMojo.java index 7ef2edca..7777d896 100644 --- a/animal-sniffer-maven-plugin/src/main/java/org/codehaus/mojo/animal_sniffer/maven/CheckSignatureMojo.java +++ b/animal-sniffer-maven-plugin/src/main/java/org/codehaus/mojo/animal_sniffer/maven/CheckSignatureMojo.java @@ -44,17 +44,21 @@ import org.apache.maven.shared.artifact.filter.PatternIncludesArtifactFilter; import org.codehaus.mojo.animal_sniffer.ClassFileVisitor; import org.codehaus.mojo.animal_sniffer.ClassListBuilder; +import org.codehaus.mojo.animal_sniffer.Clazz; import org.codehaus.mojo.animal_sniffer.SignatureChecker; import org.codehaus.plexus.util.StringUtils; import java.io.File; import java.io.FileInputStream; import java.io.IOException; +import java.io.InputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; /** * Checks the classes compiled by this module. @@ -203,6 +207,8 @@ public void setSignature( String signatureId ) { @Component protected ArtifactFactory artifactFactory; + static Map> classes = new ConcurrentHashMap<>(); + @Override public void execute() throws MojoExecutionException, MojoFailureException @@ -262,7 +268,7 @@ public void execute() } final SignatureChecker signatureChecker = - new SignatureChecker( new FileInputStream( a.getFile() ), ignoredPackages, + new SignatureChecker( loadClasses( a.getFile() ), ignoredPackages, new MavenLogger( getLog() ) ); signatureChecker.setCheckJars( false ); // don't want to decend into jar files that have been copied to // the output directory as resources. @@ -309,6 +315,17 @@ public void execute() } } + private static Map loadClasses( File f ) throws IOException + { + Map classes = CheckSignatureMojo.classes.get( f ); + if ( classes == null ) + { + classes = SignatureChecker.loadClasses( new FileInputStream( f ) ); + CheckSignatureMojo.classes.putIfAbsent( f, classes ); + } + return classes; + } + private static Dependency findMatchingDependency( Signature signature, List dependencies ) { Dependency match = null; diff --git a/animal-sniffer/src/main/java/org/codehaus/mojo/animal_sniffer/SignatureChecker.java b/animal-sniffer/src/main/java/org/codehaus/mojo/animal_sniffer/SignatureChecker.java index 82fc6ebe..7919ed23 100644 --- a/animal-sniffer/src/main/java/org/codehaus/mojo/animal_sniffer/SignatureChecker.java +++ b/animal-sniffer/src/main/java/org/codehaus/mojo/animal_sniffer/SignatureChecker.java @@ -74,7 +74,7 @@ public class SignatureChecker */ public static final String PREVIOUS_ANNOTATION_FQN = "org.jvnet.animal_sniffer.IgnoreJRERequirement"; - private final Map classes = new HashMap<>(); + private final Map classes; private final Logger logger; @@ -108,6 +108,13 @@ public static void main( String[] args ) public SignatureChecker( InputStream in, Set ignoredPackages, Logger logger ) throws IOException { + this( loadClasses( in ), ignoredPackages, logger ); + } + + public SignatureChecker( Map classes, Set ignoredPackages, Logger logger ) + throws IOException + { + this.classes = classes; this.ignoredPackages = new HashSet<>(); this.ignoredPackageRules = new LinkedList<>(); for(String wildcard : ignoredPackages ) @@ -126,6 +133,11 @@ public SignatureChecker( InputStream in, Set ignoredPackages, Logger log this.annotationDescriptors.add( toAnnotationDescriptor( PREVIOUS_ANNOTATION_FQN ) ); this.logger = logger; + } + + public static Map loadClasses( InputStream in ) throws IOException + { + Map classes = new HashMap<>(); try (ObjectInputStream ois = new ObjectInputStream( new GZIPInputStream( in ) )) { while ( true ) @@ -133,7 +145,7 @@ public SignatureChecker( InputStream in, Set ignoredPackages, Logger log Clazz c = (Clazz) ois.readObject(); if ( c == null ) { - return; // finished + return classes; // finished } classes.put( c.getName(), c ); }