2012-02-20 1 views
3

이슈 검색과 관련된 몇 가지 게시물을 발견했지만 특정 경우에는 답변이 작동하지 않는 것으로 보입니다.Maven 2 API를 사용하여 WAR Artifact의 종속성 가져 오기

skinny war EAR 생성에 도움이되는 플러그인을 작성 중이며 EAR 메이븐 모듈 용으로 작성한 플러그인을 실행 중입니다. 플러그인 코드에서 WAR 의존성의 종속성/아티팩트를 얻을 수있는 단계에 도달했습니다. 현재이 중 하나만 시도해 보았습니다. 나는 이것이 의존성을 실행하기 때문이기도하다. 나의 EAR 모듈의 트리는 그것들을 포함하지 않으며, '전 이적'의존성이 아니다.

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

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

(프로젝트의 ArtifactMetadataSource 구성 요소 개체의 N.B. 이것은 만들고 사용 종속성 maven-dependency-plugin:2.4)이되지 작업 입니다

:

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

나의 새로운 접근 방식은 현재이입니다. 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. 필요

 <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>