2010-11-22 10 views
6

Tôi đang cố gắng gọi maven-dependency-plugin programatically. tôi đang sử dụng phiên bản maven 3. vấn đề là khi tôi gọi nó thông qua pluginManager.executeMojo (phiên làm việc, thực hiện), tôi nhận được thông báo lỗi sau:Làm thế nào để lập trình gọi một plugin phụ thuộc maven

[ERROR] **The parameters 'project', 'local', 'remoteRepos', 
'reactorProjects' for goal 
org.apache.maven.plugins:maven-dependency-plugin:2.1:unpack are 
missing or invalid** 
**org.apache.maven.plugin.PluginParameterException: The parameters 'project', 
'local', 'remoteRepos', 'reactorProjects' for goal 
org.apache.maven.plugins:maven-dependency-plugin:2.1:unpack are missing or 
invalid** 
     at org.apache.maven.plugin.internal.DefaultMavenPluginManager 
     .populatePluginFields(DefaultMavenPluginManager.java:518) 
     at org.apache.maven.plugin.internal.DefaultMavenPluginManager 
     .getConfiguredMojo(DefaultMavenPluginManager.java:471) 
     at org.apache.maven.plugin.DefaultBuildPluginManager 
     .executeMojo(DefaultBuildPluginManager.java:99) 
     at com.sap.ldi.qi.osgi.OSGiManifesrMfHandlerMojo 
     .invokeMavenDependencyPlugin(OSGiManifesrMfHandlerMojo.java:139) 
     at com.sap.ldi.qi.osgi.OSGiManifesrMfHandlerMojo 
     .execute(OSGiManifesrMfHandlerMojo.java:100) 
     at org.apache.maven.plugin.DefaultBuildPluginManager 
     .executeMojo(DefaultBuildPluginManager.java:110) 
     at org.apache.maven.lifecycle.internal.MojoExecutor 
     .execute(MojoExecutor.java:144) 
     at org.apache.maven.lifecycle.internal.MojoExecutor 
     .execute(MojoExecutor.java:87) 
     at org.apache.maven.lifecycle.internal.MojoExecutor 
     .execute(MojoExecutor.java:79) 
-- many lines stripped from stack trace -- 
[INFO] ---------------------------------------------------------------------- 
[INFO] BUILD FAILURE 
[INFO] ---------------------------------------------------------------------- 
[INFO] Total time: 17.938s 
[INFO] Finished at: Mon Nov 22 10:27:42 EET 2010 
[INFO] Final Memory: 12M/23M 
[INFO] ---------------------------------------------------------------------- 
[ERROR] Failed to execute goal 
com.sap.ldi.qi:osgi-manifest-handler-plugin:0.0.1-SNAPSHOT:handle 
(osgi-manifest-handler plugin) on project com.sap.ldi.demo.calc 
.cmd.tests: The parameters 'project', 'local', 'remoteRepos', 
'reactorProjects' for goal 
org.apache.maven.plugins:maven-dependency-plugin:2.1:unpack are missing 
or invalid -> [Help 1] 
-- stripped rest -- 

Theo tôi biết, các thông số cần thiết chỉ dành cho mục đích giải nén của maven Plugin phụ thuộc là artifactItems . Tôi thiết lập cấu hình plugin bằng cách sử dụng phương thức PluginExecution.setConfiguration(). Có vẻ như cấu hình plugin này không được đặt chính xác. Bạn có biết tại sao ngoại lệ này bị ném không?

Dưới đây là cấu hình mà tôi đang sử dụng:

<configuration> 
    <artifactItems> 
    <artifactItem> 
     <groupId>com.sap.ldi.demo.calc</groupId> 
     <artifactId>com.sap.ldi.demo.calc.cmd</artifactId> 
     <version>0.1.2-SNAPSHOT</version> 
     <type>jar</type> 
     <overWrite>true</overWrite> 
     <outputDirectory>target/demo-calc-stuff</outputDirectory> 
     <includes>**/*.*</includes> 
    </artifactItem> 
    </artifactItems> 
</configuration> 

Cảm ơn


Một chỉnh từ bên cạnh tôi. Phiên bản Maven đã sử dụng không phải là Maven 3.0 nhưng Maven 3.0-beta-1. Tôi thấy rằng BuildPluginManager.loadPlugin() trong phiên bản 3.0-beta-1 có hai arg và phương thức tương tự trong phiên bản 3.0 có ba. Tôi tự hỏi, có ai cố gắng gọi một plugin maven một cách lập trình với maven 3.0 hoặc maven 3.0-beta-1. Tôi vẫn đang cố gắng gọi nó với maven 3.0-beta-1, nhưng nó vẫn trả về cùng một ngoại lệ như được dán ở trên.

Trả lời

0

Plugin Maven không có nghĩa là được gọi theo chương trình.

Chúng dựa vào các giá trị được chèn bởi vùng chứa plexus cơ bản.

Vì vậy, bạn sẽ phải tìm cách tiêm các giá trị đó hoặc bạn sẽ phải dựa vào cơ chế mặc định.

Một thứ bạn có thể sử dụng là Maven Invoker. Với điều đó, bạn có thể khởi chạy các vòng đời của maven, nhưng chúng sẽ thực hiện trong một máy ảo riêng biệt. Vì vậy, nếu bạn cần phải thay đổi mô hình động trước, bạn sẽ cần phải tuần tự hóa mô hình ra một tệp pom.xml tạm thời và sử dụng nó với trình chặn maven. Đây là thứ nặng nề, nhưng tôi đã làm nó thành công cách đây hai năm.

+1

Tôi nghĩ rằng BuildPluginManager.executeMojo() dành cho các trường hợp sử dụng như vậy. Tôi cũng tìm thấy liên kết sau, giải thích cách gọi trình cắm maven theo cách lập trình: http://code.google.com/p/mojo-executor/ – moisko

+0

Dường như việc triển khai được sử dụng là dành cho maven 2, nhưng Don Brown đang sử dụng cùng một ý tưởng như được giải thích ở trên – moisko

+0

http://stackoverflow.com/questions/526733/maven-plugin-executing- một plugin khác - đó là liên kết để đăng bài mà tôi đang nói đến. – moisko

2

Mọi người, tôi nghĩ mình đã hiểu. Sự cố không có trong phiên bản của Maven mà tôi đang sử dụng. Đó là trong cấu hình mà tôi đang sử dụng để gọi trình bổ sung maven-dependency-plugin. Mục đích giải nén của maven-phụ thuộc-plugin đòi hỏi các thông số sau: artifactItems, địa phương, dự án, reactorProjectsremoteRepos. Đây là phiên bản chính xác của cấu hình sử dụng cho cách gọi các plugin:

<configuration> 
    <artifactItems> 
    <artifactItem> 
     <groupId>com.sap.ldi.demo.calc</groupId> 
     <artifactId>com.sap.ldi.demo.calc.cmd</artifactId> 
     <version>0.1.3-SNAPSHOT</version> 
     <type>jar</type> 
     <overWrite>true</overWrite> 
     <outputDirectory>target/demo-calc-stuff</outputDirectory> 
     <includes>**/*.*</includes> 
    </artifactItem> 
    </artifactItems> 
    <local>${localRepository}</local> 
    <project>${project}</project> 
    <reactorProjects>${reactorProjects}</reactorProjects> 
    <remoteRepos>${project.remoteArtifactRepositories}</remoteRepos> 
</configuration>` 
+0

wow, có vẻ tốt (+1) –

+0

Vấn đề là Maven đang nói với bạn rằng bạn không sử dụng tập hợp đầy đủ các đối số cần thiết để gọi plugin maven-dependency: giải nén, nhưng không dễ dàng để tìm ra giá trị có thể có của các yếu tố thẻ này. Tôi đã gọi các plugin thông qua pom.xml trong chế độ gỡ lỗi để tìm các giá trị này và xây dựng cấu hình. – moisko

10

đây là một phiên bản cập nhật của Mojo Executor thiết kế cho Maven 3:

package com.googlecode.boostmavenproject; 

import java.util.Collections; 
import org.apache.maven.execution.MavenSession; 
import org.apache.maven.model.Plugin; 
import org.apache.maven.plugin.MojoExecution; 
import org.apache.maven.plugin.MojoExecutionException; 
import org.apache.maven.plugin.descriptor.PluginDescriptor; 
import org.apache.maven.project.MavenProject; 
import org.codehaus.plexus.util.xml.Xpp3Dom; 
import org.apache.maven.plugin.BuildPluginManager; 
import org.apache.maven.plugin.descriptor.MojoDescriptor; 
import org.codehaus.plexus.configuration.PlexusConfiguration; 
import org.codehaus.plexus.util.xml.Xpp3DomUtils; 
import org.sonatype.aether.repository.RemoteRepository; 

/** 
* Executes an arbitrary mojo using a fluent interface. This is meant to be executed within the context of a Maven 2 
* mojo. 
* 
* Here is an execution that invokes the dependency plugin: 
* <pre> 
* executeMojo(
*    plugin(
*      groupId("org.apache.maven.plugins"), 
*      artifactId("maven-dependency-plugin"), 
*      version("2.0") 
*    ), 
*    goal("copy-dependencies"), 
*    configuration(
*      element(name("outputDirectory"), "${project.build.directory}/foo") 
*    ), 
*    executionEnvironment(
*      project, 
*      session, 
*      pluginManager 
*    ) 
*   ); 
* </pre> 
* @see http://code.google.com/p/mojo-executor/ 
*/ 
public class MojoExecutor 
{ 
    /** 
    * Entry point for executing a mojo 
    * 
    * @param plugin The plugin to execute 
    * @param goal The goal to execute 
    * @param configuration The execution configuration 
    * @param env The execution environment 
    * @throws MojoExecutionException If there are any exceptions locating or executing the mojo 
    */ 
    public static void executeMojo(Plugin plugin, String goal, Xpp3Dom configuration, 
                   ExecutionEnvironment env) throws MojoExecutionException 
    { 
     if (configuration == null) 
      throw new NullPointerException("configuration may not be null"); 
     try 
     { 
      MavenSession session = env.getMavenSession(); 

      PluginDescriptor pluginDescriptor = env.getPluginManager().loadPlugin(plugin, 
       Collections.<RemoteRepository>emptyList(), session.getRepositorySession()); 
      MojoDescriptor mojo = pluginDescriptor.getMojo(goal); 
      if (mojo == null) 
      { 
       throw new MojoExecutionException("Could not find goal '" + goal + "' in plugin " 
                       + plugin.getGroupId() + ":" 
                       + plugin.getArtifactId() + ":" 
                       + plugin.getVersion()); 
      } 
      configuration = Xpp3DomUtils.mergeXpp3Dom(configuration, 
       toXpp3Dom(mojo.getMojoConfiguration())); 
      MojoExecution exec = new MojoExecution(mojo, configuration); 
      env.getPluginManager().executeMojo(session, exec); 
     } 
     catch (Exception e) 
     { 
      throw new MojoExecutionException("Unable to execute mojo", e); 
     } 
    } 

    /** 
    * Converts PlexusConfiguration to a Xpp3Dom. 
    * 
    * @param config the PlexusConfiguration 
    * @return the Xpp3Dom representation of the PlexusConfiguration 
    */ 
    private static Xpp3Dom toXpp3Dom(PlexusConfiguration config) 
    { 
     Xpp3Dom result = new Xpp3Dom(config.getName()); 
     result.setValue(config.getValue(null)); 
     for (String name: config.getAttributeNames()) 
      result.setAttribute(name, config.getAttribute(name)); 
     for (PlexusConfiguration child: config.getChildren()) 
      result.addChild(toXpp3Dom(child)); 
     return result; 
    } 

    /** 
    * Constructs the {@link ExecutionEnvironment} instance fluently 
    * @param mavenProject The current Maven project 
    * @param mavenSession The current Maven session 
    * @param pluginManager The Build plugin manager 
    * @return The execution environment 
    * @throws NullPointerException if mavenProject, mavenSession or pluginManager 
    * are null 
    */ 
    public static ExecutionEnvironment executionEnvironment(MavenProject mavenProject, 
                                MavenSession mavenSession, 
                                BuildPluginManager pluginManager) 
    { 
     return new ExecutionEnvironment(mavenProject, mavenSession, pluginManager); 
    } 

    /** 
    * Builds the configuration for the goal using Elements 
    * @param elements A list of elements for the configuration section 
    * @return The elements transformed into the Maven-native XML format 
    */ 
    public static Xpp3Dom configuration(Element... elements) 
    { 
     Xpp3Dom dom = new Xpp3Dom("configuration"); 
     for (Element e: elements) 
      dom.addChild(e.toDom()); 
     return dom; 
    } 

    /** 
    * Defines the plugin without its version 
    * @param groupId The group id 
    * @param artifactId The artifact id 
    * @return The plugin instance 
    */ 
    public static Plugin plugin(String groupId, String artifactId) 
    { 
     return plugin(groupId, artifactId, null); 
    } 

    /** 
    * Defines a plugin 
    * @param groupId The group id 
    * @param artifactId The artifact id 
    * @param version The plugin version 
    * @return The plugin instance 
    */ 
    public static Plugin plugin(String groupId, String artifactId, String version) 
    { 
     Plugin plugin = new Plugin(); 
     plugin.setArtifactId(artifactId); 
     plugin.setGroupId(groupId); 
     plugin.setVersion(version); 
     return plugin; 
    } 

    /** 
    * Wraps the group id string in a more readable format 
    * @param groupId The value 
    * @return The value 
    */ 
    public static String groupId(String groupId) 
    { 
     return groupId; 
    } 

    /** 
    * Wraps the artifact id string in a more readable format 
    * @param artifactId The value 
    * @return The value 
    */ 
    public static String artifactId(String artifactId) 
    { 
     return artifactId; 
    } 

    /** 
    * Wraps the version string in a more readable format 
    * @param version The value 
    * @return The value 
    */ 
    public static String version(String version) 
    { 
     return version; 
    } 

    /** 
    * Wraps the goal string in a more readable format 
    * @param goal The value 
    * @return The value 
    */ 
    public static String goal(String goal) 
    { 
     return goal; 
    } 

    /** 
    * Wraps the element name string in a more readable format 
    * @param name The value 
    * @return The value 
    */ 
    public static String name(String name) 
    { 
     return name; 
    } 

    /** 
    * Constructs the element with a textual body 
    * @param name The element name 
    * @param value The element text value 
    * @return The element object 
    */ 
    public static Element element(String name, String value) 
    { 
     return new Element(name, value); 
    } 

    /** 
    * Constructs the element containg child elements 
    * @param name The element name 
    * @param elements The child elements 
    * @return The Element object 
    */ 
    public static Element element(String name, Element... elements) 
    { 
     return new Element(name, elements); 
    } 

    /** 
    * Element wrapper class for configuration elements 
    */ 
    public static class Element 
    { 
     private final Element[] children; 
     private final String name; 
     private final String text; 

     public Element(String name, Element... children) 
     { 
      this(name, null, children); 
     } 

     public Element(String name, String text, Element... children) 
     { 
      this.name = name; 
      this.text = text; 
      this.children = children; 
     } 

     public Xpp3Dom toDom() 
     { 
      Xpp3Dom dom = new Xpp3Dom(name); 
      if (text != null) 
      { 
       dom.setValue(text); 
      } 
      for (Element e: children) 
      { 
       dom.addChild(e.toDom()); 
      } 
      return dom; 
     } 
    } 

    /** 
    * Collects Maven execution information 
    */ 
    public static class ExecutionEnvironment 
    { 
     private final MavenProject mavenProject; 
     private final MavenSession mavenSession; 
     private final BuildPluginManager pluginManager; 

     public ExecutionEnvironment(MavenProject mavenProject, MavenSession mavenSession, 
                   BuildPluginManager pluginManager) 
     { 
      if (mavenProject == null) 
       throw new NullPointerException("mavenProject may not be null"); 
      if (mavenSession == null) 
       throw new NullPointerException("mavenSession may not be null"); 
      if (pluginManager == null) 
       throw new NullPointerException("pluginManager may not be null"); 
      this.mavenProject = mavenProject; 
      this.mavenSession = mavenSession; 
      this.pluginManager = pluginManager; 
     } 

     public MavenProject getMavenProject() 
     { 
      return mavenProject; 
     } 

     public MavenSession getMavenSession() 
     { 
      return mavenSession; 
     } 

     public BuildPluginManager getPluginManager() 
     { 
      return pluginManager; 
     } 
    } 
} 

tôi sẽ cố gắng góp phần thay đổi của tôi trở lại vào plugin Mojo Executor chính thức.

+6

Tôi là người duy trì hiện tại của thư viện Mojo Executor. Gili đã liên lạc với tôi để cho tôi biết về phiên bản vá lỗi của mình. Điều này đã được tích hợp vào nhánh chính của dự án tại https://github.com/TimMoore/mojo-executor và đã được triển khai dưới dạng phiên bản 2.0-SNAPSHOT . Nếu bất kỳ người dùng Maven 3 nào có thể kiểm tra nó và cho tôi biết nếu có bất kỳ vấn đề nào (tốt nhất là bằng cách gửi các vấn đề trên trang GitHub), điều đó sẽ thực sự hữu ích. Cảm ơn! –

+0

Vâng, plugin Mojo Executor rất tuyệt! – JodaStephen

+0

@Gili Xin chào, bạn có thể cho tôi biết làm thế nào tôi có thể khởi tạo các trường này? MavenProject mavenProject; MavenSession mavenSession; BuildPluginManager pluginManager; –