2

我试图将ArtifactResolver.resolve(ArtifactResolutionRequest)与标志resolveTransitively=true一起使用,我的项目的分离模块需要 10 分钟。

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);

如果我只是用 mvn 构建它,它需要大约 4 秒。

maven如何在编译之前解决所有传递依赖以及如何在代码中使用它?

//项目的独立模块大量使用父级,导入依赖,最终有350个依赖工件。那么可能是 maven build 削减了一些处理步骤还是 ArtifactResolver 做了一些额外的事情?

4

1 回答 1

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;
于 2012-02-24T17:00:15.953 回答