private Set<MavenRepositoryMetadata> getRepositoriesResolvingArtifact(
      final GAV gav, final MavenProject mavenProject) {
    ArtifactResult result = null;
    ArtifactRequest artifactRequest = null;

    final String artifactName = gav.toString();
    final Artifact artifact = new DefaultArtifact(artifactName);
    final Aether aether = new Aether(mavenProject);

    final Set<MavenRepositoryMetadata> repositoriesResolvingArtifact =
        new HashSet<MavenRepositoryMetadata>();
    final Map<MavenRepositorySource, Collection<RemoteRepository>> repositories =
        getRemoteRepositories(mavenProject);

    // Local Repository
    artifactRequest = new ArtifactRequest();
    artifactRequest.setArtifact(artifact);
    try {
      result = aether.getSystem().resolveArtifact(aether.getSession(), artifactRequest);
      if (result != null && result.isResolved()) {
        final MavenRepositoryMetadata artifactRepositoryMetaData =
            makeRepositoryMetaData(result.getRepository(), MavenRepositorySource.LOCAL);
        if (artifactRepositoryMetaData != null) {
          repositoriesResolvingArtifact.add(artifactRepositoryMetaData);
        }
      }
    } catch (ArtifactResolutionException are) {
      // Ignore - this means the Artifact could not be resolved against the given RemoteRepository
    }

    // Remote Repositories
    try {
      for (Map.Entry<MavenRepositorySource, Collection<RemoteRepository>> e :
          repositories.entrySet()) {
        for (ArtifactRepository repository : e.getValue()) {
          artifactRequest = new ArtifactRequest();
          artifactRequest.setArtifact(artifact);
          java.nio.file.Path tempLocalRepositoryBasePath = null;
          try {
            // Maven always tries to resolve against LocalRepository first, which is not much use
            // when we want to check
            // if the Artifact is available on a RemoteRepository. Therefore substitute the default
            // RepositorySystemSession
            // with one that provides a LocalRepositoryManager that always uses an empty transient
            // LocalRepository to ensure
            // Maven does not resolve Artifacts locally.
            artifactRequest.addRepository((RemoteRepository) repository);
            tempLocalRepositoryBasePath = getRepositoryPath(gav);
            result =
                aether
                    .getSystem()
                    .resolveArtifact(
                        new MavenRepositorySystemSessionWrapper(
                            tempLocalRepositoryBasePath.toString(), aether.getSession()),
                        artifactRequest);

            if (result != null && result.isResolved()) {
              final MavenRepositoryMetadata artifactRepositoryMetaData =
                  makeRepositoryMetaData(result.getRepository(), e.getKey());
              if (artifactRepositoryMetaData != null) {
                repositoriesResolvingArtifact.add(artifactRepositoryMetaData);
              }
            }

          } catch (ArtifactResolutionException are) {
            // Ignore - this means the Artifact could not be resolved against the given
            // RemoteRepository
          } finally {
            tearDownMavenRepository(tempLocalRepositoryBasePath);
          }
        }
      }

    } catch (IOException ioe) {
      log.error(
          "Error resolving '"
              + gav.toString()
              + "' against Repositories. Returning empty Collection. ",
          ioe);
    }

    return repositoriesResolvingArtifact;
  }