2009-09-17 4 views
18

У меня есть Maven плагин, который принимает groupId, artifactId и версию в своем confiugration.Как я могу загрузить артефакты Maven в плагине?

Я хочу, чтобы загрузить этот артефакт из удаленных репозиториев и скопировать файл в проект. Однако я не могу понять, как загрузить артефакт.

Я понимаю, что я могу разрешать зависимости, используя плагин зависимости, но мне нужно, чтобы это произошло внутри моего плагина. Как я могу это сделать?

ответ

24

Ваш плагин должен создать Артефакт, используя ArtifactFactory, и файл groupId, artifactId и версию артефакта, который будет загружен, затем передайте этот артефакт ArtitactResolver для обработки обнаружения/загрузки.

Резолютор нуждается в доступе к локальному репозиторию и удаленным репозиториям. Хорошей новостью является то, что все это компоненты сплетения, которые вы можете объявлять в качестве зависимостей в своем Mojo и иметь Plexus для их подключения к вам.

В another answer Я показал, как это сделать. В вашем случае вам нужна вырезанная версия с немного разными параметрами для чтения groupId, artifactId и версии. В приведенном ниже плагине различные компоненты объявляются как компоненты сплетения, а свойства объявляют тип groupId, artifactId, версию и тип упаковки.

package name.seller.rich.maven.plugins.bootstrap; 

import java.util.List; 

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.ArtifactResolver; 
import org.apache.maven.plugin.AbstractMojo; 
import org.apache.maven.plugin.MojoExecutionException; 
import org.apache.maven.plugin.MojoFailureException; 

/** 
* Obtain the artifact defined by the groupId, artifactId, and version 
* from the remote repository. 
* 
* @goal bootstrap 
*/ 
public class BootstrapAppMojo extends AbstractMojo { 

    /** 
    * Used to look up Artifacts in the remote repository. 
    * 
    * @parameter expression= 
    * "${component.org.apache.maven.artifact.factory.ArtifactFactory}" 
    * @required 
    * @readonly 
    */ 
    protected ArtifactFactory factory; 

    /** 
    * Used to look up Artifacts in the remote repository. 
    * 
    * @parameter expression= 
    * "${component.org.apache.maven.artifact.resolver.ArtifactResolver}" 
    * @required 
    * @readonly 
    */ 
    protected ArtifactResolver artifactResolver; 

    /** 
    * List of Remote Repositories used by the resolver 
    * 
    * @parameter expression="${project.remoteArtifactRepositories}" 
    * @readonly 
    * @required 
    */ 
    protected List remoteRepositories; 

    /** 
    * Location of the local repository. 
    * 
    * @parameter expression="${localRepository}" 
    * @readonly 
    * @required 
    */ 
    protected ArtifactRepository localRepository; 

    /** 
    * The target pom's artifactId 
    * 
    * @parameter expression="${bootstrapArtifactId}" 
    * @required 
    */ 
    private String bootstrapArtifactId; 

    /** 
    * The target pom's groupId 
    * 
    * @parameter expression="${bootstrapGroupId}" 
    * @required 
    */ 
    private String bootstrapGroupId; 

    /** 
    * The target pom's type 
    * 
    * @parameter expression="${bootstrapType}" 
    * @required 
    */ 
    private String bootstrapType; 

    /** 
    * The target pom's version 
    * 
    * @parameter expression="${bootstrapVersion}" 
    * @required 
    */ 
    private String bootstrapVersion; 

    public void execute() throws MojoExecutionException, MojoFailureException { 
     try { 
      Artifact pomArtifact = this.factory.createArtifact(
       bootstrapGroupId, bootstrapArtifactId, bootstrapVersion, 
       "", bootstrapType); 

      artifactResolver.resolve(pomArtifact, this.remoteRepositories, 
       this.localRepository); 
     } catch (ArtifactResolutionException e) { 
      getLog().error("can't resolve parent pom", e); 
     } catch (ArtifactNotFoundException e) { 
      getLog().error("can't resolve parent pom", e); 
     } 
    } 
} 

Это пример ПОМ, выполненный с возможностью использовать плагин (и загрузить aspectjrt 1.6.4 POM):

<?xml version="1.0" encoding="UTF-8"?> 
<project> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>name.seller.rich</groupId> 
    <artifactId>bootstrap-test</artifactId> 
    <version>1.0.0</version> 
    <build> 
     <plugins> 
     <plugin> 
      <groupId>name.seller.rich</groupId> 
      <artifactId>maven-bootstrap-plugin</artifactId> 
      <executions> 
      <execution> 
       <phase>package</phase> 
       <goals> 
       <goal>bootstrap</goal> 
       </goals> 
       <configuration> 
       <bootstrapGroupId>org.aspectj</bootstrapGroupId> 
       <bootstrapArtifactId>aspectjrt</bootstrapArtifactId> 
       <bootstrapVersion>1.6.4</bootstrapVersion> 
       <bootstrapType>pom</bootstrapType> 
       </configuration> 
      </execution> 
      </executions> 
     </plugin> 
    </plugins> 
    </build> 
</project> 
+0

вау, спасибо. Я дам ему попробовать –

+0

еще раз спасибо, он работает красиво. Каков хороший способ получить проект maven для загруженного файла? –

+0

ну, это действительно отдельный вопрос: -/ –

Смежные вопросы