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);
}
}
}
Nguồn
2010-08-09 08:19:36
Đó 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
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