2012-02-24 167 views
2

我试图使用ArtifactResolver.resolve(ArtifactResolutionRequest)与标志resolveTransitively = true它需要10分钟,我的项目的分离模块。如何解决maven插件中的maven依赖关系?

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秒。

如何行家解决所有的传递依赖编译之前以及如何使用它的代码?

//项目的单独的模块大量使用的父母,进口的依赖,最终有350个依赖构件。这可能是Maven构建会削减一些处理步骤还是ArtifactResolver另外做些什么?

回答

1

这是我用来解决一个神器并获得文件引用它的代码:

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

该仓库的引用是其通过依赖解决了行家注入类级别的属性。你只需要在你的类中声明它们:

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

/** 
* @parameter default-value="${project.remoteArtifactRepositories}" 
* @readonly 
* @required 
*/ 
protected java.util.List<ArtifactRepository> remoteRepositories; 
+0

谢谢,但我需要解决工件的所有传递依赖关系,而不是工件本身。 – Andrew 2012-02-27 05:30:54

+0

对不起回答错误的问题。你刚刚在Maven邮件列表上提问?因为有人问一个相同的问题,答案是看requiresDependencyResolution在[Maven的API规格(http://maven.apache.org/developers/mojo-api-specification.html)页面。 – tdrury 2012-02-27 20:23:37

+0

是的,那是我的问题。我从maven-eclipse-plugin代码开始很笨拙,只是错过了插件开发人员的一般帮助。 – Andrew 2012-02-28 17:09:56