나는 을 결코 인정하지 않아야한다. 전에에 Maven 플러그인을 작성 했으므로 좋은 학습 과제로 질문을 보았다. Maven Guide to Developing Java Plugins과 maven-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);
}
}
}
올바른 방향으로 나아가는 단계입니다. 나는 여전히 최종 주소를 얻지 못하지만 적어도 유효한 후보자의 목록을 얻습니다. 내 인스턴스에서 MavenProject 구성 요소에 문제가있었습니다 (@parameter expression = "$ {project}"를 수정해야 함). – Thomas
Maven API 버전 2.2.1은 Artifact 인터페이스가 ArtifactRepository를 반환 할 수 있으며 ArtifactRepository 인터페이스가 getUrl 함수를 가지고 있음을 나타냅니다. 이것이 빨간 청어가 아니길 바래^_ ^ – Thirlan