You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by hb...@apache.org on 2017/12/20 09:35:29 UTC

[maven-help-plugin] 36/37: [maven-scm] copy for tag maven-help-plugin-2.0

This is an automated email from the ASF dual-hosted git repository.

hboutemy pushed a commit to annotated tag maven-help-plugin-2.0
in repository https://gitbox.apache.org/repos/asf/maven-help-plugin.git

commit 89cd8745b7feffb2e0055bf004640ed2155270c7
Author: Brett Leslie Porter <br...@apache.org>
AuthorDate: Sun May 7 03:32:31 2006 +0000

    [maven-scm] copy for tag maven-help-plugin-2.0
    
    git-svn-id: https://svn.apache.org/repos/asf/maven/plugins/tags/maven-help-plugin-2.0@400407 13f79535-47bb-0310-9956-ffa450edef68
---
 maven-help-plugin/pom.xml                          |  46 ++
 .../maven/plugins/help/ActiveProfilesMojo.java     | 161 +++++
 .../apache/maven/plugins/help/DescribeMojo.java    | 767 +++++++++++++++++++++
 .../maven/plugins/help/EffectivePomMojo.java       | 162 +++++
 .../maven/plugins/help/EffectiveSettingsMojo.java  | 133 ++++
 .../src/site/apt/active-profiles-mojo.apt          |  27 +
 maven-help-plugin/src/site/apt/describe-mojo.apt   |  93 +++
 .../src/site/apt/effective-pom-mojo.apt            |  28 +
 .../src/site/apt/effective-settings-mojo.apt       |  26 +
 maven-help-plugin/src/site/site.xml                |  43 ++
 10 files changed, 1486 insertions(+)

diff --git a/maven-help-plugin/pom.xml b/maven-help-plugin/pom.xml
new file mode 100644
index 0000000..3dbfbb0
--- /dev/null
+++ b/maven-help-plugin/pom.xml
@@ -0,0 +1,46 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <parent>
+    <artifactId>maven-plugins</artifactId>
+    <groupId>org.apache.maven.plugins</groupId>
+    <version>1</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <artifactId>maven-help-plugin</artifactId>
+  <packaging>maven-plugin</packaging>
+  <name>Maven Help Plugin</name>
+  <version>2.0.1</version>
+  <description>
+    The Maven Help plugin provides goals aimed at helping to make sense out of
+    the build environment. It includes the ability to view the effective
+    POM and settings files, after inheritance and active profiles
+    have been applied, as well as a describe a particular plugin goal to give usage information.
+  </description>
+  <inceptionYear>2001</inceptionYear>
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-plugin-api</artifactId>
+      <version>2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-settings</artifactId>
+      <version>2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-core</artifactId>
+      <version>2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-plugin-tools-api</artifactId>
+      <version>2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-plugin-descriptor</artifactId>
+      <version>2.0</version>
+    </dependency>
+  </dependencies>
+</project>
\ No newline at end of file
diff --git a/maven-help-plugin/src/main/java/org/apache/maven/plugins/help/ActiveProfilesMojo.java b/maven-help-plugin/src/main/java/org/apache/maven/plugins/help/ActiveProfilesMojo.java
new file mode 100644
index 0000000..2a9a251
--- /dev/null
+++ b/maven-help-plugin/src/main/java/org/apache/maven/plugins/help/ActiveProfilesMojo.java
@@ -0,0 +1,161 @@
+package org.apache.maven.plugins.help;
+
+import org.apache.maven.model.Profile;
+import org.apache.maven.plugin.AbstractMojo;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.logging.Log;
+import org.apache.maven.project.MavenProject;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.Writer;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+
+/*
+ * Copyright 2001-2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/** Lists the profiles which are currently active for this build.
+ * 
+ * @goal active-profiles
+ * @aggregator
+ */
+public class ActiveProfilesMojo extends AbstractMojo
+{
+    
+    /**
+     * This is the list of projects currently slated to be built by Maven.
+     * 
+     * @parameter expression="${reactorProjects}"
+     * @required
+     * @readonly
+     */
+    private List projects;
+    
+    /**
+     * This is an optional parameter for a file destination for the output
+     * of this mojo...the listing of active profiles per project.
+     * 
+     * @parameter expression="${output}"
+     */
+    private File output;
+
+    public void execute()
+        throws MojoExecutionException
+    {
+        StringBuffer message = new StringBuffer();
+        
+        for ( Iterator it = projects.iterator(); it.hasNext(); )
+        {
+            MavenProject project = (MavenProject) it.next();
+            
+            getActiveProfileStatement( project, message );
+            
+            message.append( "\n\n" );
+        }
+        
+        if ( output != null )
+        {
+            writeFile( message );
+        }
+        else
+        {
+            Log log = getLog();
+            log.info( message );
+        }
+    }
+    
+    private void writeFile( StringBuffer message ) 
+        throws MojoExecutionException
+    {
+        Writer writer = null;
+        try
+        {
+            File dir = output.getParentFile();
+            
+            if( !dir.exists() )
+            {
+                dir.mkdirs();
+            }
+            
+            writer = new FileWriter( output );
+            
+            writer.write( "Created by: " + getClass().getName() + "\n" );
+            writer.write( "Created on: " + new Date() + "\n\n" );
+            writer.write( message.toString() );
+            writer.flush();
+            
+            getLog().info( "Active profile report written to: " + output );
+        }
+        catch ( IOException e )
+        {
+            throw new MojoExecutionException( "Cannot write output to file: " + output, e );
+        }
+        finally
+        {
+            if ( writer != null )
+            {
+                try
+                {
+                    writer.close();
+                }
+                catch ( IOException e )
+                {
+                    getLog().debug( "Failed to close output file writer.", e );
+                }
+            }
+        }
+    }
+
+    private void getActiveProfileStatement( MavenProject project, StringBuffer message )
+    {
+        List profiles = project.getActiveProfiles();
+        
+        message.append( "\n" );
+        
+        message.append( "Active Profiles for Project \'" + project.getId() + "\': \n\n" );
+        
+        if( profiles == null || profiles.isEmpty() )
+        {
+            message.append( "There are no active profiles." );
+        }
+        else
+        {
+            message.append( "The following profiles are active:\n" );
+            
+            for ( Iterator it = profiles.iterator(); it.hasNext(); )
+            {
+                Profile profile = (Profile) it.next();
+                
+                message.append( "\n - " )
+                       .append( profile.getId() )
+                       .append(" (source: " )
+                       .append( profile.getSource() ).append( ")" );
+            }
+            
+        }
+        
+        message.append( "\n" );
+    }
+
+    public final void setProjects( List projects )
+    {
+        this.projects = projects;
+    }
+
+}
diff --git a/maven-help-plugin/src/main/java/org/apache/maven/plugins/help/DescribeMojo.java b/maven-help-plugin/src/main/java/org/apache/maven/plugins/help/DescribeMojo.java
new file mode 100644
index 0000000..c3dd2f3
--- /dev/null
+++ b/maven-help-plugin/src/main/java/org/apache/maven/plugins/help/DescribeMojo.java
@@ -0,0 +1,767 @@
+package org.apache.maven.plugins.help;
+
+/*
+ * Copyright 2001-2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+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.versioning.InvalidVersionSpecificationException;
+import org.apache.maven.execution.MavenSession;
+import org.apache.maven.model.Plugin;
+import org.apache.maven.plugin.AbstractMojo;
+import org.apache.maven.plugin.InvalidPluginException;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.plugin.PluginManager;
+import org.apache.maven.plugin.PluginManagerException;
+import org.apache.maven.plugin.PluginNotFoundException;
+import org.apache.maven.plugin.descriptor.MojoDescriptor;
+import org.apache.maven.plugin.descriptor.Parameter;
+import org.apache.maven.plugin.descriptor.PluginDescriptor;
+import org.apache.maven.plugin.version.PluginVersionNotFoundException;
+import org.apache.maven.plugin.version.PluginVersionResolutionException;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.project.MavenProjectBuilder;
+import org.apache.maven.project.ProjectBuildingException;
+import org.apache.maven.settings.Settings;
+import org.codehaus.plexus.component.repository.ComponentRequirement;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.Writer;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Describes the attributes of a plugin and/or plugin mojo.
+ *
+ * @goal describe
+ * @requiresProject false
+ * @aggregator
+ */
+public class DescribeMojo
+    extends AbstractMojo
+{
+
+    /**
+     * The plugin/mojo to describe. This must be specified in one of three ways:
+     * <p/>
+     * 1. plugin-prefix
+     * 2. groupId:artifactId
+     * 3. groupId:artifactId:version
+     *
+     * @parameter expression="${plugin}" alias="prefix"
+     */
+    private String plugin;
+
+    /**
+     * The plugin groupId to describe.
+     * <br/>
+     * (Used with artifactId specification).
+     *
+     * @parameter expression="${groupId}"
+     */
+    private String groupId;
+
+    /**
+     * The plugin artifactId to describe.
+     * <br/>
+     * (Used with groupId specification).
+     *
+     * @parameter expression="${artifactId}"
+     */
+    private String artifactId;
+
+    /**
+     * The plugin version to describe.
+     * <br/>
+     * (Used with groupId/artifactId specification).
+     *
+     * @parameter expression="${version}"
+     */
+    private String version;
+
+    /**
+     * The goal name of a mojo to describe within the specified plugin.
+     * <br/>
+     * If this parameter is specified, only the corresponding mojo will
+     * <br/>
+     * be described, rather than the whole plugin.
+     *
+     * @parameter expression="${mojo}"
+     */
+    private String mojo;
+
+    /**
+     * The plugin manager instance used to resolve plugin descriptors.
+     *
+     * @component role="org.apache.maven.plugin.PluginManager"
+     */
+    private PluginManager pluginManager;
+
+    /**
+     * The project builder instance used to retrieve the super-project instance
+     * <br/>
+     * in the event there is no current MavenProject instance. Some MavenProject
+     * <br/>
+     * instance has to be present to use in the plugin manager APIs.
+     *
+     * @component role="org.apache.maven.project.MavenProjectBuilder"
+     */
+    private MavenProjectBuilder projectBuilder;
+
+    /**
+     * The current project, if there is one. This is listed as optional, since
+     * <br/>
+     * the help plugin should be able to function on its own. If this
+     * <br/>
+     * parameter is empty at execution time, this mojo will instead use the
+     * <br/>
+     * super-project.
+     *
+     * @parameter expression="${project}"
+     * @readonly
+     */
+    private MavenProject project;
+
+    /**
+     * The current user system settings for use in Maven. This is used for
+     * <br/>
+     * plugin manager API calls.
+     *
+     * @parameter expression="${settings}"
+     * @required
+     * @readonly
+     */
+    private Settings settings;
+
+    /**
+     * The current build session instance. This is used for
+     * <br/>
+     * plugin manager API calls.
+     *
+     * @parameter expression="${session}"
+     * @required
+     * @readonly
+     */
+    private MavenSession session;
+
+    /**
+     * The local repository ArtifactRepository instance. This is used
+     * <br/>
+     * for plugin manager API calls.
+     *
+     * @parameter expression="${localRepository}"
+     * @required
+     * @readonly
+     */
+    private ArtifactRepository localRepository;
+
+    /**
+     * If specified, this parameter will cause the plugin/mojo descriptions
+     * <br/>
+     * to be written to the path specified, instead of writing to the console.
+     *
+     * @parameter expression="${output}"
+     */
+    private File output;
+
+    /**
+     * This flag specifies that full (verbose) information should be
+     * <br/>
+     * given. Use true/false.
+     *
+     * @parameter expression="${full}" default-value="false"
+     */
+    private boolean full;
+
+    public void execute()
+        throws MojoExecutionException, MojoFailureException
+    {
+        if ( project == null )
+        {
+            try
+            {
+                project = projectBuilder.buildStandaloneSuperProject( localRepository );
+            }
+            catch ( ProjectBuildingException e )
+            {
+                throw new MojoExecutionException( "Error while retrieving the super-project.", e );
+            }
+        }
+
+        PluginInfo pi = new PluginInfo();
+
+        parsePluginLookupInfo( pi );
+
+        PluginDescriptor descriptor = lookupPluginDescriptor( pi );
+
+        StringBuffer descriptionBuffer = new StringBuffer();
+
+        if ( mojo != null && mojo.length() > 0 )
+        {
+            describeMojo( descriptor.getMojo( mojo ), descriptionBuffer );
+        }
+        else
+        {
+            describePlugin( descriptor, descriptionBuffer );
+        }
+
+        writeDescription( descriptionBuffer );
+    }
+
+    private void writeDescription( StringBuffer descriptionBuffer )
+        throws MojoExecutionException
+    {
+        if ( output != null )
+        {
+            Writer out = null;
+            try
+            {
+                output.getParentFile().mkdirs();
+
+                out = new FileWriter( output );
+
+                out.write( descriptionBuffer.toString() );
+            }
+            catch ( IOException e )
+            {
+                throw new MojoExecutionException( "Cannot write plugin/mojo description.", e );
+            }
+            finally
+            {
+                if ( out != null )
+                {
+                    try
+                    {
+                        out.close();
+                    }
+                    catch ( IOException e )
+                    {
+                        getLog().debug( "Error closing file output.", e );
+                    }
+                }
+            }
+
+            getLog().info( "Wrote descriptions to: " + output );
+        }
+        else
+        {
+            getLog().info( descriptionBuffer.toString() );
+        }
+    }
+
+    private PluginDescriptor lookupPluginDescriptor( PluginInfo pi )
+        throws MojoExecutionException, MojoFailureException
+    {
+        PluginDescriptor descriptor = null;
+
+        Plugin forLookup = null;
+
+        if ( pi.prefix != null )
+        {
+            descriptor = pluginManager.getPluginDescriptorForPrefix( pi.prefix );
+
+            if ( descriptor == null )
+            {
+                forLookup = pluginManager.getPluginDefinitionForPrefix( pi.prefix, session, project );
+            }
+        }
+        else if ( pi.groupId != null && pi.artifactId != null )
+        {
+            forLookup = new Plugin();
+
+            forLookup.setGroupId( pi.groupId );
+            forLookup.setArtifactId( pi.artifactId );
+
+            if ( pi.version != null )
+            {
+                forLookup.setVersion( pi.version );
+            }
+        }
+        else
+        {
+            throw new MojoFailureException(
+                "You must either specify \'groupId\' and \'artifactId\', or a valid \'plugin\' parameter." );
+        }
+
+        if ( descriptor == null && forLookup != null )
+        {
+            try
+            {
+                descriptor = pluginManager.verifyPlugin( forLookup, project, settings, localRepository );
+            }
+            catch ( ArtifactResolutionException e )
+            {
+                throw new MojoExecutionException( "Error retrieving plugin descriptor for:\n\ngroupId: \'" + groupId +
+                    "\'\nartifactId: \'" + artifactId + "\'\nversion: \'" + version + "\'\n\n", e );
+            }
+            catch ( PluginManagerException e )
+            {
+                throw new MojoExecutionException( "Error retrieving plugin descriptor for:\n\ngroupId: \'" + groupId +
+                    "\'\nartifactId: \'" + artifactId + "\'\nversion: \'" + version + "\'\n\n", e );
+            }
+            catch ( PluginVersionResolutionException e )
+            {
+                throw new MojoExecutionException( "Error retrieving plugin descriptor for:\n\ngroupId: \'" + groupId +
+                    "\'\nartifactId: \'" + artifactId + "\'\nversion: \'" + version + "\'\n\n", e );
+            }
+            catch ( ArtifactNotFoundException e )
+            {
+                throw new MojoExecutionException( "Plugin dependency does not exist: " + e.getMessage(), e );
+            }
+            catch ( InvalidVersionSpecificationException e )
+            {
+                throw new MojoExecutionException( "Error retrieving plugin descriptor for:\n\ngroupId: \'" + groupId +
+                    "\'\nartifactId: \'" + artifactId + "\'\nversion: \'" + version + "\'\n\n", e );
+            }
+            catch ( InvalidPluginException e )
+            {
+                throw new MojoExecutionException( "Error retrieving plugin descriptor for:\n\ngroupId: \'" + groupId +
+                    "\'\nartifactId: \'" + artifactId + "\'\nversion: \'" + version + "\'\n\n", e );
+            }
+            catch ( PluginNotFoundException e )
+            {
+                getLog().debug( "Unable to find plugin", e );
+                throw new MojoFailureException( "Plugin does not exist: " + e.getMessage() );
+            }
+            catch ( PluginVersionNotFoundException e )
+            {
+                getLog().debug( "Unable to find plugin version", e );
+                throw new MojoFailureException( e.getMessage() );
+            }
+        }
+
+        if ( descriptor == null )
+        {
+            throw new MojoFailureException(
+                "Plugin could not be found. If you believe it is correct, check your pluginGroups setting, and run with -U to update the remote configuration" );
+        }
+
+        return descriptor;
+    }
+
+    private void parsePluginLookupInfo( PluginInfo pi )
+        throws MojoFailureException
+    {
+        if ( plugin != null && plugin.length() > 0 )
+        {
+            if ( plugin.indexOf( ":" ) > -1 )
+            {
+                String[] pluginParts = plugin.split( ":" );
+
+                switch ( pluginParts.length )
+                {
+                    case ( 1 ):
+                    {
+                        pi.prefix = pluginParts[0];
+                        break;
+                    }
+                    case ( 2 ):
+                    {
+                        pi.groupId = pluginParts[0];
+                        pi.artifactId = pluginParts[1];
+                        break;
+                    }
+                    case ( 3 ):
+                    {
+                        pi.groupId = pluginParts[0];
+                        pi.artifactId = pluginParts[1];
+                        pi.version = pluginParts[2];
+                        break;
+                    }
+                    default:
+                    {
+                        throw new MojoFailureException(
+                            "plugin parameter must be a plugin prefix, or conform to: 'groupId:artifactId[:version]." );
+                    }
+                }
+            }
+            else
+            {
+                pi.prefix = plugin;
+            }
+        }
+        else
+        {
+            pi.groupId = groupId;
+            pi.artifactId = artifactId;
+            pi.version = version;
+        }
+    }
+
+    private void describePlugin( PluginDescriptor pd, StringBuffer buffer )
+    {
+        String name = pd.getName();
+        if ( name == null )
+        {
+            name = pd.getId();
+        }
+
+        buffer.append( "Plugin: \'" ).append( name ).append( '\'' );
+        buffer.append( "\n-----------------------------------------------" );
+        buffer.append( "\nGroup Id:  " ).append( pd.getGroupId() );
+        buffer.append( "\nArtifact Id: " ).append( pd.getArtifactId() );
+        buffer.append( "\nVersion:     " ).append( pd.getVersion() );
+        buffer.append( "\nGoal Prefix: " ).append( pd.getGoalPrefix() );
+
+        buffer.append( "\nDescription:\n\n" );
+        prettyAppend( formatDescription( pd.getDescription() ), buffer );
+        buffer.append( "\n" );
+
+        if ( full )
+        {
+            buffer.append( "\nMojos:\n" );
+
+            String line = "\n===============================================";
+
+            for ( Iterator it = pd.getMojos().iterator(); it.hasNext(); )
+            {
+                MojoDescriptor md = (MojoDescriptor) it.next();
+
+                buffer.append( line );
+                buffer.append( "\nGoal: \'" ).append( md.getGoal() ).append( '\'' );
+                buffer.append( line );
+
+                describeMojoGuts( md, buffer, true );
+
+                buffer.append( line );
+                buffer.append( "\n\n" );
+            }
+        }
+    }
+
+    private String formatDescription( String description )
+    {
+        if ( description == null )
+        {
+            return null;
+        }
+
+        String result = description.replaceAll( " ?\\<br\\/?\\> ?", "\n" );
+
+        result = result.replaceAll( " ?\\<p\\> ?", "" );
+        result = result.replaceAll( " ?\\</p\\> ?", "\n\n" );
+
+        return result;
+    }
+
+    private void prettyAppend( String messagePart, StringBuffer buffer )
+    {
+        if ( messagePart != null && messagePart.length() > 0 )
+        {
+            buffer.append( messagePart );
+        }
+        else
+        {
+            buffer.append( "Unknown" );
+        }
+    }
+
+    private void describeMojo( MojoDescriptor md, StringBuffer buffer )
+    {
+        String line = "\n===============================================";
+
+        buffer.append( "Mojo: \'" ).append( md.getFullGoalName() ).append( '\'' );
+        buffer.append( line );
+        buffer.append( "\nGoal: \'" ).append( md.getGoal() ).append( "\'" );
+
+        describeMojoGuts( md, buffer, full );
+
+        buffer.append( line );
+        buffer.append( "\n\n" );
+    }
+
+    private void describeMojoGuts( MojoDescriptor md, StringBuffer buffer, boolean fullDescription )
+    {
+        buffer.append( "\nDescription:\n\n" );
+        prettyAppend( formatDescription( md.getDescription() ), buffer );
+        buffer.append( "\n" );
+
+        String deprecation = md.getDeprecated();
+
+        if ( deprecation != null )
+        {
+            buffer.append( "\n\nNOTE: This mojo is deprecated.\n" ).append( deprecation ).append( "\n" );
+        }
+
+        if ( fullDescription )
+        {
+            buffer.append( "\nImplementation: " ).append( md.getImplementation() );
+            buffer.append( "\nLanguage: " ).append( md.getLanguage() );
+
+            String phase = md.getPhase();
+            if ( phase != null )
+            {
+                buffer.append( "\nBound to Phase: " ).append( phase );
+            }
+
+            String eGoal = md.getExecuteGoal();
+            String eLife = md.getExecuteLifecycle();
+            String ePhase = md.getExecutePhase();
+
+            if ( eGoal != null || ePhase != null )
+            {
+                buffer.append( "\n\nBefore this mojo executes, it will call:\n" );
+
+                if ( eGoal != null )
+                {
+                    buffer.append( "\nSingle mojo: \'" ).append( eGoal ).append( "\'" );
+                }
+
+                if ( ePhase != null )
+                {
+                    buffer.append( "\nPhase: \'" ).append( ePhase ).append( "\'" );
+
+                    if ( eLife != null )
+                    {
+                        buffer.append( " in Lifecycle Overlay: \'" ).append( eLife ).append( "\'" );
+                    }
+                }
+            }
+
+            describeMojoParameters( md, buffer );
+
+            describeMojoRequirements( md, buffer );
+        }
+    }
+
+    private void describeMojoRequirements( MojoDescriptor md, StringBuffer buffer )
+    {
+        buffer.append( "\n" );
+
+        List reqs = md.getRequirements();
+
+        if ( reqs == null || reqs.isEmpty() )
+        {
+            buffer.append( "\nThis mojo doesn't have any component requirements." );
+        }
+        else
+        {
+            buffer.append( "\nComponent Requirements:\n" );
+
+            String line = "\n-----------------------------------------------";
+
+            int idx = 0;
+            for ( Iterator it = reqs.iterator(); it.hasNext(); idx++ )
+            {
+                ComponentRequirement req = (ComponentRequirement) it.next();
+
+                buffer.append( line );
+
+                buffer.append( "\n[" ).append( idx ).append( "] " );
+                buffer.append( "Role: " ).append( req.getRole() );
+
+                String hint = req.getRoleHint();
+                if ( hint != null )
+                {
+                    buffer.append( "\nRole-Hint: " ).append( hint );
+                }
+
+                buffer.append( "\n" );
+            }
+
+            buffer.append( line );
+        }
+    }
+
+    private void describeMojoParameters( MojoDescriptor md, StringBuffer buffer )
+    {
+        buffer.append( "\n" );
+
+        List params = md.getParameters();
+
+        if ( params == null || params.isEmpty() )
+        {
+            buffer.append( "\nThis mojo doesn't use any parameters." );
+        }
+        else
+        {
+            buffer.append( "\nParameters:" );
+
+            String line = "\n-----------------------------------------------";
+
+            int idx = 0;
+            for ( Iterator it = params.iterator(); it.hasNext(); )
+            {
+                Parameter parameter = (Parameter) it.next();
+
+                buffer.append( line );
+                buffer.append( "\n\n[" ).append( idx++ ).append( "] " );
+                buffer.append( "Name: " );
+                prettyAppend( parameter.getName(), buffer );
+
+                String alias = parameter.getAlias();
+                if ( alias != null )
+                {
+                    buffer.append( " (Alias: " ).append( alias ).append( ")" );
+                }
+
+                buffer.append( "\nType: " );
+                prettyAppend( parameter.getType(), buffer );
+
+                String expression = parameter.getExpression();
+                if ( expression != null )
+                {
+                    buffer.append( "\nExpression: " ).append( expression );
+                }
+
+                String defaultVal = parameter.getDefaultValue();
+                if ( defaultVal != null )
+                {
+                    buffer.append( "\nDefault value: \'" ).append( defaultVal );
+                }
+
+                buffer.append( "\nRequired: " ).append( parameter.isRequired() );
+                buffer.append( "\nDirectly editable: " ).append( parameter.isEditable() );
+
+                buffer.append( "\nDescription:\n\n" );
+                prettyAppend( formatDescription( parameter.getDescription() ), buffer );
+
+                String deprecation = parameter.getDeprecated();
+
+                if ( deprecation != null )
+                {
+                    buffer.append( "\n\nNOTE: This parameter is deprecated.\n" ).append( deprecation ).append( "\n" );
+                }
+
+                buffer.append( "\n" );
+            }
+
+            buffer.append( line );
+        }
+    }
+
+    public final String getPlugin()
+    {
+        return plugin;
+    }
+
+    public final void setPlugin( String plugin )
+    {
+        this.plugin = plugin;
+    }
+
+    public final PluginManager getPluginManager()
+    {
+        return pluginManager;
+    }
+
+    public final void setPluginManager( PluginManager pluginManager )
+    {
+        this.pluginManager = pluginManager;
+    }
+
+    public final String getArtifactId()
+    {
+        return artifactId;
+    }
+
+    public final void setArtifactId( String artifactId )
+    {
+        this.artifactId = artifactId;
+    }
+
+    public final String getGroupId()
+    {
+        return groupId;
+    }
+
+    public final void setGroupId( String groupId )
+    {
+        this.groupId = groupId;
+    }
+
+    public final ArtifactRepository getLocalRepository()
+    {
+        return localRepository;
+    }
+
+    public final void setLocalRepository( ArtifactRepository localRepository )
+    {
+        this.localRepository = localRepository;
+    }
+
+    public final String getMojo()
+    {
+        return mojo;
+    }
+
+    public final void setMojo( String mojo )
+    {
+        this.mojo = mojo;
+    }
+
+    public final File getOutput()
+    {
+        return output;
+    }
+
+    public final void setOutput( File output )
+    {
+        this.output = output;
+    }
+
+    public final MavenProject getProject()
+    {
+        return project;
+    }
+
+    public final void setProject( MavenProject project )
+    {
+        this.project = project;
+    }
+
+    public final Settings getSettings()
+    {
+        return settings;
+    }
+
+    public final void setSettings( Settings settings )
+    {
+        this.settings = settings;
+    }
+
+    public final String getVersion()
+    {
+        return version;
+    }
+
+    public final void setVersion( String version )
+    {
+        this.version = version;
+    }
+
+    private static class PluginInfo
+    {
+        String prefix;
+
+        String groupId;
+
+        String artifactId;
+
+        String version;
+
+        String mojo;
+
+        Plugin plugin;
+
+        PluginDescriptor pluginDescriptor;
+    }
+
+}
diff --git a/maven-help-plugin/src/main/java/org/apache/maven/plugins/help/EffectivePomMojo.java b/maven-help-plugin/src/main/java/org/apache/maven/plugins/help/EffectivePomMojo.java
new file mode 100644
index 0000000..41f8325
--- /dev/null
+++ b/maven-help-plugin/src/main/java/org/apache/maven/plugins/help/EffectivePomMojo.java
@@ -0,0 +1,162 @@
+package org.apache.maven.plugins.help;
+
+import org.apache.maven.model.Model;
+import org.apache.maven.model.io.xpp3.MavenXpp3Writer;
+import org.apache.maven.plugin.AbstractMojo;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.project.MavenProject;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+
+/*
+ * Copyright 2001-2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/** Display the effective POM for this build, with the active profiles factored in.
+ * 
+ * @goal effective-pom
+ * @aggregator
+ */
+public class EffectivePomMojo
+    extends AbstractMojo
+{
+
+    /**
+     * The projects in the current build. The effective-POM for
+     * each of these projects will written.
+     * 
+     * @parameter expression="${reactorProjects}"
+     * @required
+     * @readonly
+     */
+    private List projects;
+
+    /**
+     * If specified, write the output to this path.
+     * 
+     * @parameter expression="${output}"
+     */
+    private File output;
+
+    public void execute()
+        throws MojoExecutionException
+    {
+        StringBuffer message = new StringBuffer();
+        
+        for ( Iterator it = projects.iterator(); it.hasNext(); )
+        {
+            MavenProject project = (MavenProject) it.next();
+            
+            getEffectivePom( project, message );
+            
+            message.append( "\n\n" );
+        }
+        
+        if ( output != null )
+        {
+            FileWriter fWriter = null;
+            try
+            {
+                File dir = output.getParentFile();
+
+                if ( !dir.exists() )
+                {
+                    dir.mkdirs();
+                }
+
+                getLog().info( "Writing effective-POM to: " + output );
+
+                fWriter = new FileWriter( output );
+
+                fWriter.write( "Created by: " + getClass().getName() + "\n" );
+                fWriter.write( "Created on: " + new Date() + "\n\n" );
+                
+                fWriter.write( message.toString() );
+            }
+            catch ( IOException e )
+            {
+                throw new MojoExecutionException( "Cannot write effective-POM to output: " + output, e );
+            }
+            finally
+            {
+                if ( fWriter != null )
+                {
+                    try
+                    {
+                        fWriter.close();
+                    }
+                    catch ( IOException e )
+                    {
+                        getLog().debug( "Cannot close FileWriter to output location: " + output, e );
+                    }
+                }
+            }
+        }
+        else
+        {
+            StringBuffer formatted = new StringBuffer();
+
+            formatted.append( "\nEffective POMs, after inheritance, interpolation, and profiles are applied:\n\n" );
+            formatted.append( message.toString() );
+            formatted.append( "\n" );
+
+            getLog().info( message );
+        }
+    }
+
+    private void getEffectivePom( MavenProject project, StringBuffer message ) 
+        throws MojoExecutionException
+    {
+        Model pom = project.getModel();
+
+        StringWriter sWriter = new StringWriter();
+
+        MavenXpp3Writer pomWriter = new MavenXpp3Writer();
+
+        try
+        {
+            pomWriter.write( sWriter, pom );
+            
+            message.append( "\n************************************************************************************" );
+            message.append( "\nEffective POM for project \'" + project.getId() + "\'" );
+            message.append( "\n************************************************************************************" );
+            message.append( "\n" );
+            message.append( sWriter.toString() );
+            message.append( "\n************************************************************************************" );
+        }
+        catch ( IOException e )
+        {
+            throw new MojoExecutionException( "Cannot serialize POM to XML.", e );
+        }
+
+    }
+
+    protected final void setOutput( File output )
+    {
+        this.output = output;
+    }
+
+    protected final void setProjects( List projects )
+    {
+        this.projects = projects;
+    }
+
+}
diff --git a/maven-help-plugin/src/main/java/org/apache/maven/plugins/help/EffectiveSettingsMojo.java b/maven-help-plugin/src/main/java/org/apache/maven/plugins/help/EffectiveSettingsMojo.java
new file mode 100644
index 0000000..adeb2bf
--- /dev/null
+++ b/maven-help-plugin/src/main/java/org/apache/maven/plugins/help/EffectiveSettingsMojo.java
@@ -0,0 +1,133 @@
+package org.apache.maven.plugins.help;
+
+/*
+ * Copyright 2001-2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.maven.plugin.AbstractMojo;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.settings.Settings;
+import org.apache.maven.settings.io.xpp3.SettingsXpp3Writer;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.StringWriter;
+
+/** Print out the calculated settings for this project, given any profile enhancement and 
+ *  the inheritance of the global settings into the user-level settings.
+ *  
+ * @goal effective-settings
+ * @requiresProject false
+ */
+public class EffectiveSettingsMojo
+    extends AbstractMojo
+{
+
+    /**
+     * The system settings for Maven. This is the instance resulting from 
+     * merging global- and user-level settings files.
+     * 
+     * @parameter expression="${settings}"
+     * @readonly
+     * @required
+     */
+    private Settings settings;
+
+    /**
+     * If specified write the effective settings file out to this path.
+     * 
+     * @parameter expression="${output}"
+     */
+    private String output;
+
+    public void execute()
+        throws MojoExecutionException
+    {
+        StringWriter sWriter = new StringWriter();
+
+        SettingsXpp3Writer settingsWriter = new SettingsXpp3Writer();
+
+        try
+        {
+            settingsWriter.write( sWriter, settings );
+        }
+        catch ( IOException e )
+        {
+            throw new MojoExecutionException( "Cannot serialize Settings to XML.", e );
+        }
+
+        if ( output != null && output.trim().length() > 0 )
+        {
+            FileWriter fWriter = null;
+            try
+            {
+                File outFile = new File( output ).getAbsoluteFile();
+
+                File dir = outFile.getParentFile();
+
+                if ( !dir.exists() )
+                {
+                    dir.mkdirs();
+                }
+
+                getLog().info( "Writing effective-settings to: " + outFile );
+
+                fWriter = new FileWriter( outFile );
+
+                fWriter.write( sWriter.toString() );
+            }
+            catch ( IOException e )
+            {
+                throw new MojoExecutionException( "Cannot write effective-settings to output: " + output, e );
+            }
+            finally
+            {
+                if ( fWriter != null )
+                {
+                    try
+                    {
+                        fWriter.close();
+                    }
+                    catch ( IOException e )
+                    {
+                        getLog().debug( "Cannot close FileWriter to output location: " + output, e );
+                    }
+                }
+            }
+        }
+        else
+        {
+            StringBuffer message = new StringBuffer();
+
+            message.append( "\nEffective settings:\n\n" );
+            message.append( sWriter.toString() );
+            message.append( "\n\n" );
+
+            getLog().info( message );
+        }
+    }
+
+    public final void setOutput( String output )
+    {
+        this.output = output;
+    }
+
+    public final void setSettings( Settings settings )
+    {
+        this.settings = settings;
+    }
+
+}
diff --git a/maven-help-plugin/src/site/apt/active-profiles-mojo.apt b/maven-help-plugin/src/site/apt/active-profiles-mojo.apt
new file mode 100644
index 0000000..75d15be
--- /dev/null
+++ b/maven-help-plugin/src/site/apt/active-profiles-mojo.apt
@@ -0,0 +1,27 @@
+  ---
+  Maven Help Plugin :: Active Profiles Mojo
+  ---
+  John Casey
+  ---
+  12-October-2005
+  ---
+  
+Active Profiles Mojo
+
+*Summary
+
+  The <<<active-profiles>>> mojo is used to discover which profiles have been
+  applied to the projects currently being built. For each project in the build
+  session, it will output a list of profiles which have been applied to that 
+  project, along with the source of the profile (POM, settings.xml, or profiles.xml).
+  
+  Optionally, the output parameter can be specified to divert this output to a
+  file.
+  
+*Configurable Parameters
+
+*---------------+----------------------------+--------------+-------------------+--------------+
+| <<Parameter>> | <<Description>>            | <<Type>>     | <<Default Value>> | <<Required>> |
+*---------------+----------------------------+--------------+-------------------+--------------+
+| output        | Write output to this path. | java.io.File | <<(none)>>        | No           |
+*---------------+----------------------------+--------------+-------------------+--------------+
diff --git a/maven-help-plugin/src/site/apt/describe-mojo.apt b/maven-help-plugin/src/site/apt/describe-mojo.apt
new file mode 100644
index 0000000..1af7688
--- /dev/null
+++ b/maven-help-plugin/src/site/apt/describe-mojo.apt
@@ -0,0 +1,93 @@
+  ---
+  Maven Project Help Plugin :: Describe Mojo
+  ---
+  John Casey
+  ---
+  12-October-2005
+  ---
+  
+Describe Mojo
+
+*Summary
+
+  The <<<describe>>> mojo is used to discover information about Maven plugins.
+  Given a plugin prefix or groupId, artifactId, and optionally version, the mojo
+  will lookup that plugin and output details about it. If the user also specifies
+  which mojo to describe, the <<describe>> mojo will limit output to the details
+  of that mojo, including parameters.
+  
+  Optionally, the output parameter can be specified to divert this output to a
+  file.
+  
+*Configurable Parameters
+
+*---------------+----------------------------------------------------------------+--------------+-------------------+--------------+
+| <<Parameter>> | <<Description>>                                                | <<Type>>     | <<Default Value>> | <<Required>> |
+*---------------+----------------------------------------------------------------+--------------+-------------------+--------------+
+| plugin        | One-liner substitute for groupId/artifactId/version, or prefix | String       | <<(none)>>        | No           |
+*---------------+----------------------------------------------------------------+--------------+-------------------+--------------+
+| groupId       | The plugin groupId to lookup                                   | String       | <<(none)>>        | No           |
+*---------------+----------------------------------------------------------------+--------------+-------------------+--------------+
+| artifactId    | The plugin artifactId to lookup                                | String       | <<(none)>>        | No           |
+*---------------+----------------------------------------------------------------+--------------+-------------------+--------------+
+| version       | The plugin version to lookup                                   | String       | <<(none)>>        | No           |
+*---------------+----------------------------------------------------------------+--------------+-------------------+--------------+
+| mojo          | The specific mojo to describe, rather than the whole plugin    | String       | <<(none)>>        | No           |
+*---------------+----------------------------------------------------------------+--------------+-------------------+--------------+
+| output        | A path for description output, instead of the console          | java.io.File | <<(none)>>        | No           |
+*---------------+----------------------------------------------------------------+--------------+-------------------+--------------+
+| full          | If false, provide a brief description. Otherwise, detail all   | boolean      | <<(none)>>        | No           |
+*---------------+----------------------------------------------------------------+--------------+-------------------+--------------+
+
+*Note on <<<-Dplugin=...>>>
+
+  This parameter is meant to provide two things: convenience and prefix-based access.
+  
+  The convenience comes when specifying a plugin by groupId:artifactId, or by
+  groupId:artifactId:version. Where the more traditional specification of separate
+  fields would mean specifying this:
+  
++---+
+  -DgroupId=org.somewhere -DartifactId=some-plugin -Dversion=0.0.0
++---+
+
+  the use of the plugin parameter allows this:
+  
++---+
+  -Dplugin=org.somewhere:some-plugin:0.0.0
++---+
+
+  (NOTE: version is always optional here.)
+  
+  On the other hand, the plugin parameter also offers the option to specify a 
+  plugin by its prefix, like this:
+  
++---+
+  -Dplugin=help
++---+
+
+*Examples
+
+  [[1]] To display a brief summary of the entire help plugin, using the
+        prefix for plugin lookup:
+        
++---+
+        mvn help:describe -Dplugin=help
++---+
+
+  [[2]] To display a full summary of only the describe mojo, again using the 
+        prefix to lookup the plugin:
+        
++---+
+        mvn help:describe -Dplugin=help -Dmojo=describe -Dfull=true
++---+
+
+  [[3]] To display the most information available for the entire help
+        plugin, and avoid any confusion about which plugin might be resolved
+        for a particular prefix:
+        
++---+
+        mvn help:describe -Dfull=true \
+                                -DgroupId=org.apache.maven.plugins \
+                                -DartifactId=maven-help-plugin
++---+
diff --git a/maven-help-plugin/src/site/apt/effective-pom-mojo.apt b/maven-help-plugin/src/site/apt/effective-pom-mojo.apt
new file mode 100644
index 0000000..5f4e3c2
--- /dev/null
+++ b/maven-help-plugin/src/site/apt/effective-pom-mojo.apt
@@ -0,0 +1,28 @@
+  ---
+  Maven Help Plugin :: Effective POM Mojo
+  ---
+  John Casey
+  ---
+  12-October-2005
+  ---
+  
+Effective POM Mojo
+
+*Summary
+
+  The <<<effective-pom>>> mojo is used to make visible the POM that results from
+  the application of interpolation, inheritance, and active profiles. It provides
+  a useful way of removing the guesswork about just what ends up in the POM that
+  Maven uses to build your project. It will iterate over all projects in the current
+  build session, printing the effective POM for each.
+  
+  Optionally, the output parameter can be specified to divert this output to a
+  file.
+  
+*Configurable Parameters
+
+*---------------+----------------------------+--------------+-------------------+--------------+
+| <<Parameter>> | <<Description>>            | <<Type>>     | <<Default Value>> | <<Required>> |
+*---------------+----------------------------+--------------+-------------------+--------------+
+| output        | Write output to this path. | java.io.File | <<(none)>>        | No           |
+*---------------+----------------------------+--------------+-------------------+--------------+
diff --git a/maven-help-plugin/src/site/apt/effective-settings-mojo.apt b/maven-help-plugin/src/site/apt/effective-settings-mojo.apt
new file mode 100644
index 0000000..d63c6c1
--- /dev/null
+++ b/maven-help-plugin/src/site/apt/effective-settings-mojo.apt
@@ -0,0 +1,26 @@
+  ---
+  Maven Help Plugin :: Effective Settings Mojo
+  ---
+  John Casey
+  ---
+  12-October-2005
+  ---
+  
+Effective Settings Mojo
+
+*Summary
+
+  The <<<effective-settings>>> mojo is used to view the Settings that Maven 
+  actually uses to run the build. This Settings instance is a result of merging
+  the global file with the user's file, with the user's file taking precedence.
+  
+  Optionally, the output parameter can be specified to divert this output to a
+  file.
+  
+*Configurable Parameters
+
+*---------------+----------------------------+--------------+-------------------+--------------+
+| <<Parameter>> | <<Description>>            | <<Type>>     | <<Default Value>> | <<Required>> |
+*---------------+----------------------------+--------------+-------------------+--------------+
+| output        | Write output to this path. | java.io.File | <<(none)>>        | No           |
+*---------------+----------------------------+--------------+-------------------+--------------+
diff --git a/maven-help-plugin/src/site/site.xml b/maven-help-plugin/src/site/site.xml
new file mode 100644
index 0000000..e58efad
--- /dev/null
+++ b/maven-help-plugin/src/site/site.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<!--
+/*
+ * Copyright 2001-2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+
+<project name="Maven Help Plugin">
+  <bannerLeft>
+    <name>Maven Help</name>
+    <src>http://maven.apache.org/images/apache-maven-project.png</src>
+    <href>http://maven.apache.org/</href>
+  </bannerLeft>
+  <bannerRight>
+    <src>http://maven.apache.org/images/maven-small.gif</src>
+  </bannerRight>
+  <body>
+    <links>
+      <item name="Maven 2" href="http://maven.apache.org/maven2/"/>
+    </links>
+
+    <menu name="Goals">
+      <item name="active-profiles" href="/active-profiles-mojo.html"/>
+      <item name="describe" href="/describe-mojo.html"/>
+      <item name="effective-pom" href="/effective-pom-mojo.html"/>
+      <item name="effective-settings" href="/effective-settings-mojo.html"/>
+    </menu>
+    ${reports}
+  </body>
+</project>

-- 
To stop receiving notification emails like this one, please contact
"commits@maven.apache.org" <co...@maven.apache.org>.