Question

Je suis en train de créer un plugin Maven pour générer un fichier avec l'URL à toutes les dépendances d'un projet. Je suis en mesure d'obtenir les dépendances et leur artefact, mais je vais avoir du mal à obtenir l'URL de téléchargement.

Utilisation ArtifactResolver et ArtifactMetadataSource je reçois certaines des informations d'artefact. Cependant, je ne parviens pas à obtenir toutes les informations pour toutes les dépendances. Je n'ai pas pu trouver de la documentation sur la logique de la résolution, afin que je puisse l'appeler former mon plug-in. Je peux utiliser un ArtifactResolver pour télécharger l'artefact, mais ce que je voulais vraiment était juste l'URL.

L'API artefact Maven a aa méthode appelée getDownloadURL (voir http://maven.apache.org/ref/2.0.4/maven-artifact/apidocs/org/apache/maven/artifact/Artifact.html ). Cependant, je ne peux pas semble trouver un moyen d'obtenir une valeur réelle en elle. Je reçois toujours une valeur nulle. Est-il possible de le régler (téléchargement ou non) et obtenir l'URL où le fichier est venu?

Était-ce utile?

La solution

Je dois admettre que j'ai jamais écrit un plugin Maven avant et vu votre question comme un bon exercice d'apprentissage. Je lourdement endettées de la Guide Maven développement Java Plugins et le code source à partir du maven-dépendance-plugin .

Je peux me tromper, mais je ne pense pas qu'il y ait une correspondance directe entre artefact et dépôt qui est stocké partout par Maven.

Je suis un utilisateur Maven pendant quelque temps et vous verrez souvent Maven interroger tous les dépôts à distance pour déterminer l'emplacement d'un artefact donné. Par conséquent, dans mon code ci-dessous vous ne recevrez pas une URL unique pour un artefact que vous obtiendrez autant d'URL car il y a des dépôts distants. Vous pouvez toujours étendre ce code pour tenter de télécharger l'artefact et en conservant les URL où le téléchargement est réussi.

J'espère que cette aide.

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);
        }
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top