2012-02-24 208 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