2010-05-26 12 views
6

Tôi đang cố gắng tạo một plugin maven để tạo tệp có URL tới tất cả các phụ thuộc trong một dự án. Tôi đã có thể nhận được các phụ thuộc và tạo phẩm của họ, nhưng tôi gặp khó khăn khi tải URL tải xuống.Làm thế nào để có được một URL tải xuống giả bằng API Maven?

Sử dụng ArtifactResolver và ArtifactMetadataSource Tôi nhận được một số thông tin giả tạo. Tuy nhiên tôi không nhận được tất cả các thông tin cho tất cả các phụ thuộc. Tôi đã không thể tìm thấy tài liệu về logic phân giải, để tôi có thể gọi nó là plugin của tôi. Tôi có thể sử dụng ArtifactResolver để tải xuống phần tạo tác, nhưng điều tôi thực sự muốn chỉ là URL.

API tạo tác Maven có phương thức gọi là getDownloadURL (xem http://maven.apache.org/ref/2.0.4/maven-artifact/apidocs/org/apache/maven/artifact/Artifact.html). Tuy nhiên tôi không thể tìm cách để có được một giá trị thực sự vào nó. Tôi luôn luôn nhận được một giá trị null. Có cách nào để giải quyết vấn đề (tải xuống hay không) và nhận URL cho tệp xuất phát từ đâu?

Trả lời

5

Tôi phải thừa nhận rằng mình có không bao giờ viết một plugin Maven trước đây và thấy câu hỏi của bạn là một bài tập học tập tốt. Tôi đã mượn rất nhiều từ số Maven Guide to Developing Java Plugins và mã nguồn từ số maven-dependency-plugin.

Tôi có thể sai về điều này nhưng tôi không nghĩ rằng có một ánh xạ trực tiếp giữa tạo phẩm và kho lưu trữ được lưu trữ ở bất kỳ đâu bởi Maven.

Tôi đã là người dùng Maven đôi khi và bạn thường thấy Maven truy vấn mọi kho lưu trữ từ xa để xác định vị trí của một tạo phẩm nhất định. Vì vậy, trong mã của tôi dưới đây bạn sẽ không nhận được một URL duy nhất cho một tạo phẩm, bạn sẽ nhận được nhiều URL như có kho lưu trữ từ xa. Bạn luôn có thể mở rộng mã này để tìm cách tải xuống phần tạo tác và giữ lại các URL nơi tải xuống thành công.

Tôi hy vọng điều này sẽ hữu ích.

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

Đó là một bước đi đúng hướng. Tôi vẫn không nhận được địa chỉ cuối cùng, nhưng ít nhất tôi nhận được một danh sách các ứng cử viên hợp lệ. Tôi đã có một vấn đề với các thành phần MavenProject trên trường hợp của tôi (đã phải thêm @parameter expression = "$ {project}" để sửa chữa nó). – Thomas

+0

Phiên bản 2.2.1 của Maven API chỉ ra rằng giao diện Artifact có thể trả về một ArtifactRepository và giao diện ArtifactRepository có một hàm getUrl. Hy vọng đây không phải là một cá trích đỏ^_ ^ – Thirlan