2012-12-26 25 views
7

Tôi đang tạo một plugin Maven với một yêu cầu khá độc đáo cho hoạt động thích hợp: nó cần tạo ra các quy trình mới của chính nó và sau đó chờ các quy trình đó hoàn thành một nhiệm vụ.Trình cắm thêm Maven Plugin với Classpath thích hợp

Trong khi điều này là tương đối nhỏ để thực hiện trên dòng lệnh, các trình cắm Maven không được gọi theo cách tương tự như mã Java truyền thống và do đó không có đường dẫn lớp. Tôi không thể tìm ra cách để giải quyết classpath chính xác bên trong các plugin như vậy mà tôi có thể sinh ra một JVM mới (gọi phương thức Main của một lớp khác bên trong plugin).

Sử dụng vật hiện tại của MavenProject tôi có thể nhận được một tài liệu tham khảo Artifact để bản thân mình (plugin) và làm cho nó là thư mục tương đối bên trong kho Maven địa phương:

Artifact self = null; 
for (Artifact artifact : project.getPluginArtifacts()) { 
    if ("my-group-id".equals(artifact.getGroupId()) && "my-artifact-id".equals(artifact.getArtifactId())) { 
    self = artifact; 
    break; 
    } 
} 
if (self == null) { 
    throw new MojoExecutionException("Could not find representation of this plugin in project."); 
} 
for (ArtifactRepository artifactRepository : project.getPluginArtifactRepositories()) { 
    String path = artifactRepository.pathOf(self); 
    if (path != null) { 
    getLog().info("relative path to self: " + path); 
    break; 
    } 
} 

Làm thế nào để có được một tài liệu tham khảo cho tất cả các phụ thuộc của nó (và phụ thuộc transitive) như vậy mà tôi có thể xây dựng một classpath đầy đủ cho một lời gọi mới? Tôi thấy rằng self có bộ lọc phụ thuộc nhưng tôi không biết áp dụng nó ở đâu.

Đây có phải là cách thích hợp để tạo quy trình mới "bản thân" bên trong plugin không? Có cách nào tốt hơn?

Trả lời

3

tôi thấy a great article về sự khác biệt giữa độ phân giải phụ thuộc vào Maven 2 và Maven 3.

Với một Artifact nó nắm như sau:

private Set<Artifact> getDependenciesForArtifact(Artifact artifact) { 
    ArtifactResolutionRequest arr = new ArtifactResolutionRequest() 
     .setArtifact(artifact) 
     .setResolveTransitively(true) 
     .setLocalRepository(local); 
    return repositorySystem.resolve(arr).getArtifacts(); 
} 

Với Set bạn có thể xây dựng một bằng cách gọi pathOf trên ArtifactRepository cho mỗi phần tử và tham gia với File.pathSeparator.

1

Hm. Không thực sự là một câu trả lời nhưng một số gợi ý. Tại sao bạn cần một thứ phức tạp như vậy? Hơn nữa tôi sẽ có một cái nhìn sâu sắc vào maven-surefire-plugin có thể ngã ba một jvm cho các bài kiểm tra đơn vị và có thể xử lý classpath. Mặt khác, bạn có thể xem qua số maven-invoker hoặc trong số maven-invoker-plugin có thể nới rộng hoàn toàn. Ah .. tôi đã bỏ lỡ điều gì. Hãy xem xét maven-dependency-plugin có mục tiêu cụ thể để tạo đường dẫn lớp, nơi bạn có thể xem xét các nguồn cách chúng tạo đường dẫn lớp.

+0

Dịch vụ của bên thứ ba mà tôi đang tương tác chỉ cho phép một kết nối cho mỗi quá trình và thực thi chúng một cách liên tục không phải là một tùy chọn. Tôi cần phải có từ 5 đến 20 tương tác trong một lần chạy plugin này. Tôi sẽ điều tra các đề xuất của bạn sau, cảm ơn. –

Các vấn đề liên quan