Skutecne stacilo pouzit metodu private Set<Artifact> 
getDependencyArtifacts(Artifact artifact). Mockrat diky.

Mirek

-----Original Message-----
From: [email protected] [mailto:[email protected]] On Behalf 
Of Petr Ferschmann
Sent: Friday, July 31, 2009 1:50 PM
To: Java
Subject: Re: maven - jak programove ziskat zavislost artefaktu

Zkuste vyjít z tohoto:
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;

import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.io.IOUtils;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.factory.ArtifactFactory;
import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
import org.apache.maven.artifact.resolver.ArtifactResolver;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.MavenProjectBuilder;

/**
 * Goal which touches a timestamp file.
 *
 * @goal write
 *
 * @phase package
 */
public class MyMojo extends AbstractMojo {

    /**
     * @parameter expression="${localRepository}"
     * @required
     * @readonly
     */
    private ArtifactRepository        localRepository;

    /**
     * @component role="org.apache.maven.artifact.resolver.ArtifactResolver"
     * @required
     * @readonly
     */
    private ArtifactResolver        artifactResolver;

    /**
     * @parameter expression="${project.remoteArtifactRepositories}"
     * @required
     * @readonly
     */
    private java.util.List            remoteRepositories;

    /**
     * @component role="org.apache.maven.artifact.factory.ArtifactFactory"
     * @required
     * @readonly
     */
    private ArtifactFactory            artifactFactory;

    /**
     * @parameter expression="${project.version}"
     * @readonly
     */
    private String                    version;

    /**
     * @component
     * @required
     * @readonly
     */
    private ArtifactMetadataSource    artifactMetadataSource;

    /**
     * @component role="org.apache.maven.project.MavenProjectBuilder"
     * @required
     */
    private MavenProjectBuilder        mavenProjectBuilder;

    /**
     * @parameter expression="${project.groupId}"
     * @required
     */
    public String                    groupId;

    /**
     * @parameter expression=""
     */
    public String                    filePrefix;

    /**
     * @parameter expression=""
     */
    public String                    linePrefix;

    /**
     * @parameter
     * @required
     */
    public String[]                    artifactIds;

    /**
     * @parameter
     */
    public String[]                    excludeIds;

    /**
     * Location of the file.
     *
     * @parameter
     * @required
     */
    private File                    outputFile;

    /**
     * Location of the file.
     *
     * @parameter expression="true"
     * @required
     */
    private final Boolean            writeFull    = true;

    public void execute() throws MojoExecutionException {
        Set<Artifact> artifacts = new HashSet<Artifact>();

        for (String artifact : artifactIds) {
            Artifact art = 
artifactFactory.createArtifactWithClassifier(groupId, artifact, version, 
"jar", null);

            artifacts.addAll(getDependencyArtifacts(art));
            artifacts.add(art);
        }

        Set<Artifact> artifactsToExclude = new HashSet<Artifact>();
        if (excludeIds != null) {
            for (String artifact : excludeIds) {
                Artifact art = 
artifactFactory.createArtifactWithClassifier(groupId, artifact, version, 
"jar", null);
   
                artifacts.removeAll(getDependencyArtifacts(art));
                artifacts.remove(art);
            }
        }

       
        outputFile.getParentFile().mkdirs();

        FileWriter w = null;
        try {
            w = new FileWriter(outputFile);
            if (filePrefix != null && !filePrefix.isEmpty()) {
                w.append(filePrefix);
                w.append("\n");
            }

            for (Artifact artifact : artifacts) {
                long size = artifact.getFile().length();

                FileInputStream fd = new 
FileInputStream(artifact.getFile());
                ByteArrayOutputStream out = new ByteArrayOutputStream();
                IOUtils.copy(fd, out);
                fd.close();

                String sha1 = DigestUtils.shaHex(out.toByteArray());

                if (linePrefix != null && !linePrefix.isEmpty()) {
                    w.append(linePrefix);
                }
               
                if (writeFull) {
                    w.append(artifact.getFile().getName() + "\t" + size 
+ "\tsha1:" + sha1 + "\n");
                } else {
                    w.append(artifact.getFile().getName() + "\n");
                }
            }
        } catch (IOException e) {
            throw new MojoExecutionException("Error creating file " + 
outputFile, e);
        } finally {
            if (w != null) {
                try {
                    w.close();
                } catch (IOException e) {
                    // ignore
                }
            }
        }
    }

    private Set<Artifact> getDependencyArtifacts(Artifact artifact) 
throws MojoExecutionException {

        try {
            // Make sure the artifact is resolved before we do anything 
with it
            getArtifactResolver().resolve(artifact, 
getRemoteRepositories(), getLocalRepository());

            MavenProject subProject = 
getMavenProjectBuilder().buildFromRepository(artifact, 
getRemoteRepositories(),
                    getLocalRepository());


            Set<Artifact> artifacts = 
subProject.createArtifacts(getArtifactFactory(), null, null);
            ArtifactResolutionResult arr = 
getArtifactResolver().resolveTransitively(artifacts, artifact,
                    getLocalRepository(), getRemoteRepositories(), 
getArtifactMetadataSource(), null);
            Set<Artifact> result = arr.getArtifacts();

            return result;
        } catch (Exception ex) {
            throw new MojoExecutionException("Failed to get 
dependencies", ex);
        }
    }

    private ArtifactRepository getLocalRepository() {
        return localRepository;
    }

    private ArtifactResolver getArtifactResolver() {
        return artifactResolver;
    }

    private java.util.List getRemoteRepositories() {
        return remoteRepositories;
    }

    private ArtifactFactory getArtifactFactory() {
        return artifactFactory;
    }

    private ArtifactMetadataSource getArtifactMetadataSource() {
        return artifactMetadataSource;
    }

    private MavenProjectBuilder getMavenProjectBuilder() {
        return mavenProjectBuilder;
    }

}

Tichý Miroslav napsal(a):
> Abych to upresnil, programove sem myslel s vyuzitim maven API ci API 
> jakekoliv maven pluginy...predpokladam, ze mi nezbude nic jineho, nez zacit 
> zkoumat zdrojaky dependency tree pluginy, protože ta to nejakym zpusobem 
> zvlada...
>
> Mirek 
> ________________________________________
> From: [email protected] [mailto:[email protected]] On 
> Behalf Of Jakub Stonavsky
> Sent: Thursday, July 30, 2009 4:14 PM
> To: Java
> Subject: Re: maven - jak programove ziskat zavislost artefaktu
>
> Ahoj,
>
> pokud ti nestaci vypis, ktery poskytuje mvn dependency:build-classpath (ten 
> vypise umisteni dependencies v repository, mel by to zvladnout bundle 
> (http://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html)).
>
> K.
> 2009/7/30 Tichý Miroslav <[email protected]>
>
> Ahoj,
> v maven-war-pluginu potrebuji programove ziskat zavislosti pro každý artefakt 
> (war), na kterem je aktualni projekt (tedy také war) zavisly. Netusite, jak 
> na to?
>
> Diky
>
> Mirek Tichý
>
>
>
>   

-- 
Petr Ferschmann

--
SoftEU s.r.o.
Lochotínská 18, 301 00 Plzeň, Česká republika
Phone: +420 371 124 300, +420 371 124 384
E-mail: [email protected]  http://www.softeu.com/

Odpovedet emailem