2012-02-20 20 views
3

アーティファクト取得の問題を取り巻くいくつかの記事を見つけましたが、回答が私の特定のケースではうまくいかないようです。Maven 2 APIを使用したWAR Artifactの依存関係を取得する

skinny war EAR世代の助けとなるプラグインを作成しています。私はEAR mavenモジュール用に書いたプラグインを実行しています。プラグインのコードでは、私はWAR依存関係の依存関係/アーティファクトを得ることができる段階に達しています。現在、これらは私が試したことはありません。私はこれが依存関係を実行しているからだと推測します。私のEARモジュール上のツリーにはそれらが含まれておらず、推移的な依存関係ではありません。

// Neither of the two below return WAR transitive dependencies, just the WARs 
project.getDependencies() 
project.getArtifacts() 

私の新しいアプローチは、現在、このです:

ArtifactRepository localRepository = project.getDistributionManagementArtifactRepository(); 
List remoteRepositories = project.getRemoteArtifactRepositories(); 

ResolutionGroup resolutionGroup = artifactMetadataSource.retrieve(warArtifact, localRepository, remoteRepositories); 
Set<Artifact> artifactDependencies = resolutionGroup.getArtifacts(); 

これは作業ではありません

(N.B.これは、プロジェクトのArtifactMetadataSource部品オブジェクトの使用や依存関係maven-dependency-plugin:2.4をしています)。 artifactDependenciesセットは空です。これは、モジュールwarArtifactのディレクトリにmvn dependency:treeを実行すると、正常に動作するため、これが可能になります。

アイデア?

答えて

3

私はついに答えました。確かに、それは私の元の質問に正しく答えるものではありませんが、それは私が行ったことです。

import org.apache.maven.plugin.AbstractMojo; 
import org.apache.maven.plugin.MojoExecutionException; 
import org.apache.maven.project.MavenProject; 
import org.sonatype.aether.RepositorySystem; 
import org.sonatype.aether.RepositorySystemSession; 
import org.sonatype.aether.artifact.Artifact; 
import org.sonatype.aether.collection.CollectRequest; 
import org.sonatype.aether.graph.Dependency; 
import org.sonatype.aether.graph.DependencyNode; 
import org.sonatype.aether.repository.RemoteRepository; 
import org.sonatype.aether.resolution.DependencyRequest; 
import org.sonatype.aether.util.artifact.DefaultArtifact; 
import org.sonatype.aether.util.graph.PreorderNodeListGenerator; 

import java.util.ArrayList; 
import java.util.List; 

/** 
* 
* @goal findShareables 
* @phase process-resources 
*/ 
@SuppressWarnings("unchecked") 
public class ShareableJarsInWarsExtractor extends AbstractMojo 
{ 
    // ... 

    /** 
    * The MavenProject object. 
    * 
    * @parameter expression="${project}" 
    * @readonly 
    */ 
    private MavenProject project; 

    /** 
    * The entry point to Aether, i.e. the component doing all the work. 
    * 
    * @component 
    */ 
    private RepositorySystem repoSystem; 

    /** 
    * The current repository/network configuration of Maven. 
    * 
    * @parameter default-value="${repositorySystemSession}" 
    * @readonly 
    */ 
    private RepositorySystemSession repoSession; 

    /** 
    * The project's remote repositories to use for the resolution of plugins and their dependencies. 
    * 
    * @parameter default-value="${project.remotePluginRepositories}" 
    * @readonly 
    */ 
    private List<RemoteRepository> remoteRepos; 


    public void execute() throws MojoExecutionException 
    { 
     Artifact projectArtifact = getProjectArtifact(); 
     List<Dependency> projectDependencies = getArtifactsDependencies(projectArtifact); 

     for (Dependency d : projectDependencies) 
     { 
      if (d.getArtifact() != null && "war".equals(d.getArtifact().getExtension())) 
      { 
       List<Dependency> warDependencies = getArtifactsDependencies(d.getArtifact()); 
       // I now have all of the WAR's dependencies!! Hooray! 

       // ... 
      } 
     } 

     // ... 
    } 


    private List<Dependency> getArtifactsDependencies(Artifact a) 
    { 
     List<Dependency> ret = new ArrayList<Dependency>(); 

     // Note: I get the POM artifact, not the WAR or whatever. 
     DefaultArtifact pomArtifact = new DefaultArtifact(a.getGroupId(), a.getArtifactId(), "pom", a.getVersion()); 
     CollectRequest collectRequest = new CollectRequest(); 
     collectRequest.setRoot(new Dependency(pomArtifact, "compile")); 
     collectRequest.setRepositories(remoteRepos); 

     try 
     { 
      DependencyNode node = repoSystem.collectDependencies(repoSession, collectRequest).getRoot(); 
      DependencyRequest projectDependencyRequest = new DependencyRequest(node, null); 

      repoSystem.resolveDependencies(repoSession, projectDependencyRequest); 

      PreorderNodeListGenerator nlg = new PreorderNodeListGenerator(); 
      node.accept(nlg); 

      ret.addAll(nlg.getDependencies(true)); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 

     return ret; 
    } 


    private Artifact getProjectArtifact() 
    { 
     // Todo: There must be a better way! 
     return new DefaultArtifact(project.getArtifact().toString()); 
    } 


    // ... 
} 

私のPOMには、以下の依存関係を定義しています:

それはここではそれが興味を持っているもののためにとにかくある3

Mavenを必要とします。それは完全に私のオリジナルのポストに答えていません

理由

 <dependency> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-dependency-plugin</artifactId> 
      <version>2.4</version> 
     </dependency> 

     <dependency> 
      <groupId>org.apache.maven</groupId> 
      <artifactId>maven-plugin-api</artifactId> 
      <version>3.0.4</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.maven</groupId> 
      <artifactId>maven-model</artifactId> 
      <version>3.0.4</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.maven</groupId> 
      <artifactId>maven-core</artifactId> 
      <version>3.0.4</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.maven</groupId> 
      <artifactId>maven-artifact</artifactId> 
      <version>3.0.4</version> 
     </dependency> 
関連する問題