2010-05-26 5 views
6

프로젝트의 모든 종속성에 대한 URL을 가진 파일을 생성하는 maven 플러그인을 만들려고합니다. 종속성 및 해당 아티팩트를 가져올 수 있었지만 다운로드 URL을 가져 오는 데 문제가 있습니다.Maven API를 통해 Artifact 다운로드 URL을 얻는 방법은 무엇입니까?

ArtifactResolver 및 ArtifactMetadataSource를 사용하여 일부 인공물 정보를 얻습니다. 그러나 모든 종속성에 대한 모든 정보를 얻지 못했습니다. 나는 해상도 로직에 관한 문서를 찾을 수 없었기 때문에, 나는 그것을 플러그인으로 부를 수있다. ArtifactResolver를 사용하여 이슈를 다운로드 할 수는 있지만 실제로 원하는 것은 URL뿐입니다.

Maven Artifact API에는 getDownloadURL이라는 메소드가 있습니다 (http://maven.apache.org/ref/2.0.4/maven-artifact/apidocs/org/apache/maven/artifact/Artifact.html 참조). 그러나 나는 그것에 진정한 가치를 얻을 수있는 방법을 찾는 것 같습니다. 나는 항상 널 값을 얻는다. 해결 방법 (다운로드 여부)을 결정하고 파일의 출처 URL을 가져 오는 방법이 있습니까?

답변

5

나는 을 결코 인정하지 않아야한다. 전에에 Maven 플러그인을 작성 했으므로 좋은 학습 과제로 질문을 보았다. Maven Guide to Developing Java Pluginsmaven-dependency-plugin의 소스 코드를 많이 빌 렸습니다.

나는 이것에 대해 틀릴 수도 있지만, Maven이 어디 에나 저장되어있는 이슈와 저장소 사이에 직접 매핑이 있다고 생각하지 않습니다.

필자는 때때로 Maven 사용자였으며, Maven이 모든 원격 저장소에 쿼리하여 주어진 아티팩트의 위치를 ​​확인하는 경우가 종종 있습니다. 따라서 아래의 코드에서는 원격 저장소만큼 많은 URL을 얻을 수있는 이슈에 대한 단일 URL을 얻지 못합니다. 언제든지이 코드를 확장하여 이슈를 다운로드하고 다운로드가 성공한 URL을 유지하려고 할 수 있습니다.

이 정보가 도움이되기를 바랍니다.

package sample.plugin; 

import java.util.List; 
import java.util.Set; 
import org.apache.maven.artifact.Artifact; 
import org.apache.maven.artifact.factory.ArtifactFactory; 
import org.apache.maven.artifact.repository.ArtifactRepository; 
import org.apache.maven.artifact.resolver.ArtifactNotFoundException; 
import org.apache.maven.artifact.resolver.ArtifactResolutionException; 
import org.apache.maven.artifact.resolver.filter.ScopeArtifactFilter; 
import org.apache.maven.plugin.AbstractMojo; 
import org.apache.maven.plugin.MojoExecutionException; 
import org.apache.maven.project.MavenProject; 
import org.apache.maven.project.MavenProjectBuilder; 
import org.apache.maven.project.ProjectBuildingException; 
import org.apache.maven.project.artifact.InvalidDependencyVersionException; 

/** 
* Says "Hi" to the user. 
* @goal sayhi 
*/ 
public class GreetingMojo extends AbstractMojo { 

    /** 
    * @parameter expression="${localRepository}" 
    * @readonly 
    * @required 
    */ 
    protected ArtifactRepository local; 
    /** 
    * @parameter expression="${project.remoteArtifactRepositories}" 
    * @readonly 
    * @required 
    */ 
    protected List<ArtifactRepository> remoteRepos; 
    /** 
    * @component role="org.apache.maven.project.MavenProjectBuilder" 
    * @required 
    * @readonly 
    */ 
    protected MavenProjectBuilder mavenProjectBuilder; 
    /** 
    * @component 
    */ 
    protected ArtifactFactory factory; 
    /** 
    * @component 
    */ 
    protected MavenProject project; 

    public void execute() throws MojoExecutionException { 
     try { 
      resolveDependencies(project); 
     } catch (Exception ex) { 
      getLog().error(ex); 
     } 
    } 

    private void resolveDependencies(MavenProject theProject) 
      throws ArtifactResolutionException, ArtifactNotFoundException, InvalidDependencyVersionException, ProjectBuildingException { 
     Set<Artifact> artifacts = theProject.createArtifacts(this.factory, Artifact.SCOPE_TEST, 
       new ScopeArtifactFilter(Artifact.SCOPE_TEST)); 
     for (Artifact a : artifacts) { 
      System.out.printf("%s : %s : %s\n", a.getGroupId(), a.getArtifactId(), a.getVersion()); 
      for (ArtifactRepository r : remoteRepos) { 
       System.out.printf("%s/%s\n", r.getUrl(), r.pathOf(a)); 
      } 
      System.out.println(); 
      Artifact pomArtifact = this.factory.createArtifact(a.getGroupId(), a.getArtifactId(), a.getVersion(), "", "pom"); 
      MavenProject pomProject = mavenProjectBuilder.buildFromRepository(pomArtifact, remoteRepos, local); 
      resolveDependencies(pomProject); 
     } 
    } 
} 
+0

올바른 방향으로 나아가는 단계입니다. 나는 여전히 최종 주소를 얻지 못하지만 적어도 유효한 후보자의 목록을 얻습니다. 내 인스턴스에서 MavenProject 구성 요소에 문제가있었습니다 (@parameter expression = "$ {project}"를 수정해야 함). – Thomas

+0

Maven API 버전 2.2.1은 Artifact 인터페이스가 ArtifactRepository를 반환 할 수 있으며 ArtifactRepository 인터페이스가 getUrl 함수를 가지고 있음을 나타냅니다. 이것이 빨간 청어가 아니길 바래^_ ^ – Thirlan