[MINVOKER-333] Artifact should be installed once
diff --git a/src/main/java/org/apache/maven/plugins/invoker/InstallMojo.java b/src/main/java/org/apache/maven/plugins/invoker/InstallMojo.java
index e9fc917..0a7ec02 100644
--- a/src/main/java/org/apache/maven/plugins/invoker/InstallMojo.java
+++ b/src/main/java/org/apache/maven/plugins/invoker/InstallMojo.java
@@ -21,8 +21,6 @@
 import java.io.File;
 import java.io.IOException;
 import java.io.UncheckedIOException;
-import java.util.ArrayList;
-import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -68,6 +66,7 @@
 import org.eclipse.aether.resolution.DependencyRequest;
 import org.eclipse.aether.resolution.DependencyResolutionException;
 import org.eclipse.aether.resolution.DependencyResult;
+import org.eclipse.aether.util.artifact.ArtifactIdUtils;
 import org.eclipse.aether.util.artifact.JavaScopes;
 import org.eclipse.aether.util.artifact.SubArtifact;
 import org.eclipse.aether.util.filter.DependencyFilterUtils;
@@ -163,7 +162,7 @@
             return;
         }
 
-        Collection<Artifact> resolvedArtifacts = new ArrayList<>();
+        Map<String, Artifact> resolvedArtifacts = new LinkedHashMap<>();
 
         try {
 
@@ -181,19 +180,20 @@
         }
     }
 
-    private void resolveProjectArtifacts(Collection<Artifact> resolvedArtifacts) {
+    private void resolveProjectArtifacts(Map<String, Artifact> resolvedArtifacts) {
 
         // pom packaging doesn't have a main artifact
         if (project.getArtifact() != null && project.getArtifact().getFile() != null) {
-            resolvedArtifacts.add(RepositoryUtils.toArtifact(project.getArtifact()));
+            Artifact artifact = RepositoryUtils.toArtifact(project.getArtifact());
+            resolvedArtifacts.put(ArtifactIdUtils.toId(artifact), artifact);
         }
 
-        resolvedArtifacts.addAll(project.getAttachedArtifacts().stream()
+        project.getAttachedArtifacts().stream()
                 .map(RepositoryUtils::toArtifact)
-                .collect(Collectors.toList()));
+                .forEach(a -> resolvedArtifacts.put(ArtifactIdUtils.toId(a), a));
     }
 
-    private void resolveProjectPoms(MavenProject project, Collection<Artifact> resolvedArtifacts)
+    private void resolveProjectPoms(MavenProject project, Map<String, Artifact> resolvedArtifacts)
             throws ArtifactResolutionException {
 
         if (project == null) {
@@ -202,15 +202,15 @@
 
         Artifact projectPom = RepositoryUtils.toArtifact(new ProjectArtifact(project));
         if (projectPom.getFile() != null) {
-            resolvedArtifacts.add(projectPom);
+            resolvedArtifacts.put(projectPom.toString(), projectPom);
         } else {
             Artifact artifact = resolveArtifact(projectPom, project.getRemoteProjectRepositories());
-            resolvedArtifacts.add(artifact);
+            resolvedArtifacts.put(ArtifactIdUtils.toId(artifact), artifact);
         }
         resolveProjectPoms(project.getParent(), resolvedArtifacts);
     }
 
-    private void resolveProjectDependencies(Collection<Artifact> resolvedArtifacts)
+    private void resolveProjectDependencies(Map<String, Artifact> resolvedArtifacts)
             throws ArtifactResolutionException, MojoExecutionException, DependencyResolutionException {
 
         DependencyFilter classpathFilter = DependencyFilterUtils.classpathFilter(scope);
@@ -245,7 +245,7 @@
                 .map(ArtifactResult::getArtifact)
                 .collect(Collectors.toList());
 
-        resolvedArtifacts.addAll(artifacts);
+        artifacts.forEach(a -> resolvedArtifacts.put(ArtifactIdUtils.toId(a), a));
         resolvePomsForArtifacts(artifacts, resolvedArtifacts, collectRequest.getRepositories());
     }
 
@@ -254,7 +254,7 @@
      *
      * @return
      */
-    private void resolveExtraArtifacts(Collection<Artifact> resolvedArtifacts)
+    private void resolveExtraArtifacts(Map<String, Artifact> resolvedArtifacts)
             throws MojoExecutionException, DependencyResolutionException, ArtifactDescriptorException,
                     ArtifactResolutionException {
 
@@ -309,13 +309,15 @@
                     .map(ArtifactResult::getArtifact)
                     .collect(Collectors.toList());
 
-            resolvedArtifacts.addAll(artifacts);
+            artifacts.forEach(a -> resolvedArtifacts.put(ArtifactIdUtils.toId(a), a));
             resolvePomsForArtifacts(artifacts, resolvedArtifacts, collectRequest.getRepositories());
         }
     }
 
     private void resolvePomsForArtifacts(
-            List<Artifact> artifacts, Collection<Artifact> resolvedArtifacts, List<RemoteRepository> remoteRepositories)
+            List<Artifact> artifacts,
+            Map<String, Artifact> resolvedArtifacts,
+            List<RemoteRepository> remoteRepositories)
             throws ArtifactResolutionException, MojoExecutionException {
 
         for (Artifact a : artifacts) {
@@ -325,10 +327,10 @@
     }
 
     private void resolvePomWithParents(
-            Artifact artifact, Collection<Artifact> resolvedArtifacts, List<RemoteRepository> remoteRepositories)
+            Artifact artifact, Map<String, Artifact> resolvedArtifacts, List<RemoteRepository> remoteRepositories)
             throws MojoExecutionException, ArtifactResolutionException {
 
-        if (resolvedArtifacts.contains(artifact)) {
+        if (resolvedArtifacts.containsKey(ArtifactIdUtils.toId(artifact))) {
             return;
         }
 
@@ -341,7 +343,7 @@
             resolvePomWithParents(resolvedPom, resolvedArtifacts, remoteRepositories);
         }
 
-        resolvedArtifacts.add(artifact);
+        resolvedArtifacts.put(ArtifactIdUtils.toId(artifact), artifact);
     }
 
     private Artifact resolveArtifact(Artifact artifact, List<RemoteRepository> remoteRepositories)
@@ -357,7 +359,7 @@
     /**
      * Install list of artifacts into local repository.
      */
-    private void installArtifacts(Collection<Artifact> resolvedArtifacts) throws InstallationException {
+    private void installArtifacts(Map<String, Artifact> resolvedArtifacts) throws InstallationException {
 
         RepositorySystemSession systemSessionForLocalRepo = createSystemSessionForLocalRepo();
 
@@ -365,7 +367,7 @@
         // with different version, in such case when we install both in one request
         // metadata will contain only one version
 
-        Map<String, List<Artifact>> collect = resolvedArtifacts.stream()
+        Map<String, List<Artifact>> collect = resolvedArtifacts.values().stream()
                 .filter(a -> !hasTheSamePathAsTarget(a, systemSessionForLocalRepo))
                 .collect(Collectors.groupingBy(
                         a -> String.format("%s:%s:%s", a.getGroupId(), a.getArtifactId(), a.getVersion()),