Obavam se, ze takto zjistim zavislosti pro cely projekt a nikoliv pro 
jednotlive artefakty, na nichž je projekt zavisly.

Kazdopadne diky

Miroslav Tichý
________________________________________
From: konference-boun...@java.cz [mailto:konference-boun...@java.cz] On Behalf 
Of Petr Prochazka
Sent: Friday, July 31, 2009 2:13 PM
To: Java
Subject: Re: maven - jak programove ziskat zavislost artefaktu

IMHO nestacilo by Set deps = project.getArtifacts(); ?
Tim by ziskal vsechny tranzitivni dependencies, pokud by je potreboval 
filtrovat, staci vyuzit 
triduorg.apache.maven.shared.artifact.filter.collection.FilterArtifacts. 
Petr Prochazka

On Fri, Jul 31, 2009 at 1:49 PM, Petr Ferschmann <pferschm...@softeu.com> wrote:
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: konference-boun...@java.cz [mailto:konference-boun...@java.cz] 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 <mti...@gpe.cz>

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: pferschm...@softeu.com  http://www.softeu.com/

Odpovedet emailem