You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@maven.apache.org by JF <jf...@his.co.uk> on 2011/11/25 19:59:21 UTC

Retrieving information from embedded Maven

I am running Maven in an embedded way (thanks to Espen Wiborg) in the 
manner shown below;

I wish to create some state to pass back to the caller of this "Maven 
Server" from my Mojo.
I can do this using MavenProject.getProperties().setProperty... But what 
is the "best" way of doing this other than writing to storage or sending 
information to a server?
If I have tried to create plexus component instances (see below) in the 
context of the MvnServer class using plexus.addComponent or plexus.lookup,
but obvioulsy these instances are not the ones created and injected to 
the Mojo.

Should I be submitting questions covering this sort of topic to 
MavenDevelopers?

import org.apache.maven.Maven;
import org.apache.maven.cli.MavenCli;
import org.apache.maven.cli.MavenLoggerManager;
import org.apache.maven.execution.DefaultMavenExecutionRequest;
import org.apache.maven.execution.MavenExecutionRequest;
import org.apache.maven.execution.MavenExecutionResult;
import org.apache.maven.model.building.ModelProcessor;
import org.apache.maven.project.MavenProject;
import org.apache.maven.settings.Mirror;
import org.codehaus.plexus.DefaultContainerConfiguration;
import org.codehaus.plexus.DefaultPlexusContainer;
import org.codehaus.plexus.PlexusContainerException;
import org.codehaus.plexus.classworlds.ClassWorld;
import 
org.codehaus.plexus.component.repository.exception.ComponentLookupException;
import org.codehaus.plexus.logging.Logger;
import org.codehaus.plexus.logging.console.ConsoleLogger;


public class MvnServer {

     private final Logger logger;
     private final Maven maven;
     private final ModelProcessor modelProcessor;
     private final DefaultPlexusContainer plexus;
     private MavenProject project;

     public MvnServer() throws PlexusContainerException, 
ComponentLookupException {
         ClassWorld classWorld = new ClassWorld("plexus.core",
                                                
  getClass().getClassLoader());
         DefaultContainerConfiguration cc =
             new DefaultContainerConfiguration();
         cc.setClassWorld(classWorld);
         cc.setName("embedder");

         plexus = new DefaultPlexusContainer(cc);
         logger = new ConsoleLogger();
         plexus.setLoggerManager(new MavenLoggerManager(logger));

         maven = plexus.lookup(Maven.class);
         modelProcessor = plexus.lookup(ModelProcessor.class);
     }

     private MavenExecutionRequest newRequest(File basedir, String[] 
profiles) {

         DefaultMavenExecutionRequest req = new 
DefaultMavenExecutionRequest();
         Properties systemProperties = req.getSystemProperties();
         systemProperties.putAll(System.getProperties());
         req.setUserSettingsFile(MavenCli.DEFAULT_USER_SETTINGS_FILE);
         req.setGlobalSettingsFile(MavenCli.DEFAULT_GLOBAL_SETTINGS_FILE);
         req.setBaseDirectory(basedir);
         req.setPom(modelProcessor.locatePom(basedir));

         Mirror mirror = new Mirror();
         .
         .
         .
         req.setMirrors(Collections.singletonList(mirror));
         return req;
     }

     public boolean run(String pomFileName, String... goals) {
         return run(pomFileName, true, goals).run();
     }

     private RunDescriptor run(String pomFileName, boolean recursive, 
String... goals) {
         RunDescriptor desc = new RunDescriptor();
         desc.mvnServer = this;
         desc.pom = new File(pomFileName);
         desc.recursive = recursive;
         desc.goals = goals;
         return desc;
     }

     public MavenProject getProject() {
         return project;
     }

     private class RunDescriptor
     {
         File pom;
         boolean recursive;
         String[] goals;
         String[] profiles = new String[0];
         Properties properties = new Properties();

         MvnServer mvnServer;

         public boolean run() {
             try {
                 MavenExecutionRequest req = 
mvnServer.newRequest(pom.getParentFile(), profiles);
                 req.setGoals(Arrays.asList(goals));
                 req.setRecursive(recursive);
                 req.setUserProperties(properties);
                 MavenExecutionResult result = mvnServer.maven.execute(req);
                 project = result.getProject();
                 if(result.hasExceptions()) {
                     List<Throwable> exList = result.getExceptions();
                     for (Throwable e : exList) {
                         e.printStackTrace();
                     }
                 }
                 return !result.hasExceptions();

             } finally {
             }
         }
     }

     public static void main(String[] args) {
         try {
             System.out.println("Start! x");
             MvnServer server = new MvnServer();
             String[] args2 = {"compile"};
            
  server.run("C:\\Users\\Administrator\\workspace\\maventest\\pom.xml", 
args2);
             System.out.println("Dones! x");
         } catch (PlexusContainerException e) {
             e.printStackTrace();
         } catch (ComponentLookupException e) {
             e.printStackTrace();
         }

     }
}


Example component creation
import org.codehaus.plexus.component.annotations.Component;

@Component( role = BuildEventListener.class, hint = "impl" )
public class MyComponent implements BuildEventListener
{
     private String property;

     public MyComponent() {
         System.out.println("Constructing " + this);
     }

     public String getProperty() {
         return property;
     }

     public void setProperty(String property) {
         System.out.println("MyComponent " + property );
         this.property = property;
     }

     public void trackEvent(String event) {
         System.out.println("MyComponent " + property + " got event " + 
event);
         setProperty(event);
     }


}

Example Mojo using component


import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.project.MavenProject;

/**
  *
  *
  * @goal test
  *
  * @phase test
  */
public class MyMojo
     extends AbstractMojo
{
     /**
      * The maven project.
      *
      * @parameter expression="${project}"
      * @readonly
      */
      private MavenProject project;

       /**
       * @component role-hint="impl"
       */
      private BuildEventListener listener;
      ...



---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@maven.apache.org
For additional commands, e-mail: users-help@maven.apache.org