Domanda

Sto cercando di creare un esperto di plugin per generare un file con l'URL a tutte le dipendenze in un progetto. Sono stato in grado di ottenere le dipendenze e la loro artefatto, ma sto avendo difficoltà a raggiungere l'URL di download.

Utilizzando ArtifactResolver e ArtifactMetadataSource ottengo alcune delle informazioni manufatto. Tuttavia non riesco a ottenere tutte le informazioni per tutte le dipendenze. Non sono stato in grado di trovare la documentazione sulla logica risoluzione, in modo che io possa chiamare mia forma di plugin. Posso uso un ArtifactResolver per scaricare il manufatto, ma quello che volevo veramente era solo l'URL.

L'API Maven manufatto ha aa metodo chiamato getDownloadURL (vedi http://maven.apache.org/ref/2.0.4/maven-artifact/apidocs/org/apache/maven/artifact/Artifact.html ). Tuttavia I cant sembrano trovare un modo per ottenere un reale valore in esso. Ho sempre trovato un valore nullo. C'è un modo per averlo risolto (scaricamento o meno) e ottenere l'URL per cui è venuto il file da?

È stato utile?

Soluzione

Devo ammettere che ho non scritto un plugin Maven prima e ho visto la tua domanda come un buon esercizio di apprendimento. Ho preso in prestito pesantemente dal href="http://maven.apache.org/guides/plugin/guide-java-plugin-development.html" rel="noreferrer"> Guida e il codice sorgente dal Maven-dipendenza-plugin .

I può essere sbagliato in questo, ma non credo che ci sia una corrispondenza diretta tra artefatto e repository che viene memorizzato da nessuna parte da Maven.

Sono stato un utente di Maven per qualche tempo e si vedono spesso Maven interrogazione di ogni repository remoto per accertare la posizione di un determinato manufatto. Pertanto, nel mio codice di seguito non sarà possibile ottenere un singolo URL per un artefatto si otterrà il maggior numero di URL in quanto vi sono repository remoti. Si può sempre estendere questo codice per tentare di scaricare il manufatto e trattenere gli URL in cui il download è successo.

Spero che questo aiuta.

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);
        }
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top