2

Im trying to use ArtifactResolver.resolve(ArtifactResolutionRequest) with flag resolveTransitively=true and it takes 10min for separated module of my project.

ArtifactResolutionRequest request = new ArtifactResolutionRequest()
        .setArtifact( project.getArtifact() )
        .setArtifactDependencies( project.getDependencyArtifacts() )
        .setLocalRepository( localRepository )
        .setManagedVersionMap( project.getManagedVersionMap() )
        .setForceUpdate(false)
        .setResolveTransitively(true)
        .setOffline(true)
        .setListeners(listeners);
result = artifactResolver.resolve(request);

If i just build it with mvn it takes ~4sec.

How maven resolve all transitive dependencies before compile and how to use it in code?

//The separate module of project heavily use parents, import dependencies and finally have 350 dependency artifacts. So may it be what maven build cuts some processing steps or ArtifactResolver do something additionally?

Andrew
  • 470
  • 3
  • 10

1 Answers1

1

This is the code I use to resolve an artifact and get a File reference to it:

// get maven artifact representing this mojo artifact
org.apache.maven.artifact.Artifact ma = ...; // create artifact reference
// resolve the maven artifact
try {
    resolver.resolve(ma, remoteRepositories, localRepository );
} catch (ArtifactNotFoundException ex) {
    throw new MojoExecutionException("could not find deploy artifact ["+a+"]", ex);
} catch (ArtifactResolutionException ex) {
    throw new MojoExecutionException("could not resolve deploy artifact ["+a+"]", ex);
}
File maFile = ma.getFile();

The repositories references are class-level attributes which are resolved via dependency inject in maven. You just need to declare them in your class:

/** 
 * @parameter default-value="${localRepository}" 
 * @readonly
 * @required
 */
protected ArtifactRepository localRepository;

/** 
 * @parameter default-value="${project.remoteArtifactRepositories}" 
 * @readonly
 * @required
 */
protected java.util.List<ArtifactRepository> remoteRepositories;
tdrury
  • 2,307
  • 1
  • 22
  • 25
  • Thanks, but i need to resolve all transitive dependencies of the artifact, not artifact itself. – Andrew Feb 27 '12 at 05:30
  • Sorry for answering the wrong question. Did you just ask on the maven mailing list? Because someone asked an identical question and the answer was to look at requiresDependencyResolution in the [Maven API Spec](http://maven.apache.org/developers/mojo-api-specification.html) page. – tdrury Feb 27 '12 at 20:23
  • Yes, that was mine question. I was dumb in starting from maven-eclipse-plugin code and just missed that general help for plugin developers. – Andrew Feb 28 '12 at 17:09