diff --git a/maven-core/src/main/resources/META-INF/plexus/components.xml b/maven-core/src/main/resources/META-INF/plexus/components.xml
index 78b3d8acf6..73af020167 100644
--- a/maven-core/src/main/resources/META-INF/plexus/components.xml
+++ b/maven-core/src/main/resources/META-INF/plexus/components.xml
@@ -307,6 +307,30 @@
+
+ org.apache.maven.lifecycle.mapping.LifecycleMapping
+ rar
+ org.apache.maven.lifecycle.mapping.DefaultLifecycleMapping
+
+
+
+ org.apache.maven.plugins:maven-resources-plugin:resources
+ org.apache.maven.plugins:maven-compiler-plugin:compile
+ org.apache.maven.plugins:maven-resources-plugin:testResources
+ org.apache.maven.plugins:maven-compiler-plugin:testCompile
+ org.apache.maven.plugins:maven-surefire-plugin:test
+
+ org.apache.maven.plugins:maven-jar-plugin:jar,
+ org.apache.maven.plugins:maven-source-plugin:jar,
+ org.apache.maven.plugins:maven-rar-plugin:rar
+
+ org.apache.maven.plugins:maven-install-plugin:install
+ org.apache.maven.plugins:maven-deploy-plugin:deploy
+
+
+
+
+
org.apache.maven.plugin.version.PluginVersionManager
default
diff --git a/sandbox/maven-rar-plugin/pom.xml b/sandbox/maven-rar-plugin/pom.xml
new file mode 100644
index 0000000000..30f94f49a9
--- /dev/null
+++ b/sandbox/maven-rar-plugin/pom.xml
@@ -0,0 +1,24 @@
+
+
+ maven-plugin-parent
+ org.apache.maven.plugins
+ 2.0-beta-1-SNAPSHOT
+
+ 4.0.0
+ maven-rar-plugin
+ maven-plugin
+ Maven Rar plugin
+ 2.0-beta-1-SNAPSHOT
+
+
+ org.apache.maven
+ maven-archiver
+ 2.0-beta-1-SNAPSHOT
+
+
+ org.apache.maven
+ maven-project
+ 2.0-beta-1-SNAPSHOT
+
+
+
diff --git a/sandbox/maven-rar-plugin/src/main/java/org/apache/maven/plugin/rar/RarMojo.java b/sandbox/maven-rar-plugin/src/main/java/org/apache/maven/plugin/rar/RarMojo.java
new file mode 100644
index 0000000000..7e8398a58c
--- /dev/null
+++ b/sandbox/maven-rar-plugin/src/main/java/org/apache/maven/plugin/rar/RarMojo.java
@@ -0,0 +1,221 @@
+package org.apache.maven.plugin.rar;
+
+/*
+ * 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.archiver.MavenArchiver;
+import org.apache.maven.archiver.MavenArchiveConfiguration;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.artifact.Artifact;
+import org.codehaus.plexus.util.FileUtils;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.Set;
+
+/**
+ * Builds J2EE Resource Adapter Archive (RAR) files.
+ *
+ * @author Stephane Nicoll
+ * @version $Id$
+ * @goal rar
+ * @phase package
+ * @requiresDependencyResolution test
+ * @description builds a rar
+ */
+public class RarMojo
+ extends AbstractMojo
+{
+ public static final String RA_XML_URI = "META-INF/ra.xml";
+
+
+ /**
+ * Single directory for extra files to include in the RAR.
+ *
+ * @parameter expression="${basedir}/src/rar"
+ * @required
+ */
+ private String rarSourceDirectory;
+
+ /**
+ * The location of the ra.xml file to be used within the rar file.
+ *
+ * @parameter expression="${basedir}/src/rar/META-INF/ra.xml"
+ */
+ private String raXmlLocation;
+
+ /**
+ * Specify if the generated jar file of this project should be
+ * included in the rar file ; default is true.
+ *
+ * @parameter
+ */
+ private Boolean includeJar = Boolean.TRUE;
+
+ /**
+ * The location of the manifest file to be used within the rar file.
+ *
+ * @parameter expression="${basedir}/src/rar/META-INF/MANIFEST.MF"
+ * @TODO handle this field
+ */
+ private String manifestLocation;
+
+ /**
+ * Directory that resources are copied to during the build.
+ *
+ * @parameter expression="${project.build.directory}/${project.build.finalName}"
+ * @required
+ */
+ private String workDirectory;
+
+ /**
+ * The directory for the generated RAR.
+ *
+ * @parameter expression="${project.build.directory}"
+ * @required
+ */
+ private String outputDirectory;
+
+ /**
+ * The name of the RAR file to generate.
+ *
+ * @parameter alias="rarName" expression="${project.build.finalName}"
+ * @required
+ * @readonly
+ */
+ private String finalName;
+
+ /**
+ * The maven project.
+ *
+ * @parameter expression="${project}"
+ * @required
+ * @readonly
+ * @description "the maven project to use"
+ */
+ private MavenProject project;
+
+ /**
+ * The maven archiver to use.
+ *
+ * @parameter
+ */
+ private MavenArchiveConfiguration archive = new MavenArchiveConfiguration();
+
+
+ private File buildDir;
+
+
+ public void execute()
+ throws MojoExecutionException
+ {
+ getLog().debug( " ======= RarMojo settings =======" );
+ getLog().debug( "rarSourceDirectory[" + rarSourceDirectory + "]" );
+ getLog().debug( "manifestLocation[" + manifestLocation + "]" );
+ getLog().debug( "raXmlLocation[" + raXmlLocation + "]" );
+ getLog().debug( "workDirectory[" + workDirectory + "]" );
+ getLog().debug( "outputDirectory[" + outputDirectory + "]" );
+ getLog().debug( "finalName[" + finalName + "]" );
+
+ // Check if jar file is there and if requested, copy it
+ try
+ {
+ if (includeJar.booleanValue()) {
+ File generatedJarFile = new File( outputDirectory, finalName + ".jar" );
+ if (generatedJarFile.exists()) {
+ getLog().info( "Including generated jar file["+generatedJarFile.getName()+"]");
+ FileUtils.copyFileToDirectory( generatedJarFile, getBuildDir());
+ }
+ }
+ }
+ catch ( IOException e )
+ {
+ throw new MojoExecutionException( "Error copying generated Jar file", e );
+ }
+
+ // Copy dependencies
+ try
+ {
+ Set artifacts = project.getArtifacts();
+ for ( Iterator iter = artifacts.iterator(); iter.hasNext(); )
+ {
+ Artifact artifact = (Artifact) iter.next();
+ if ( !Artifact.SCOPE_TEST.equals( artifact.getScope() ) &&
+ !Artifact.SCOPE_PROVIDED.equals( artifact.getScope() ) )
+ {
+ getLog().info("Copying artifact[" + artifact.getGroupId() + ", " + artifact.getId() + ", " +
+ artifact.getScope() + "]");
+ FileUtils.copyFileToDirectory( artifact.getFile(), getBuildDir() );
+ }
+ }
+ }
+ catch ( IOException e )
+ {
+ throw new MojoExecutionException( "Error copying RAR dependencies", e );
+ }
+
+ // Copy source files
+ try
+ {
+ File rarSourceDir = new File( rarSourceDirectory );
+ if ( rarSourceDir.exists() )
+ {
+ getLog().info( "Copy rar resources to " + getBuildDir().getAbsolutePath() );
+ FileUtils.copyDirectoryStructure( rarSourceDir, getBuildDir() );
+ }
+ }
+ catch ( IOException e )
+ {
+ throw new MojoExecutionException( "Error copying RAR resources", e );
+ }
+
+ // Check if connector deployment descriptor is there
+ File ddFile = new File( getBuildDir(), RA_XML_URI );
+ if ( !ddFile.exists() )
+ {
+ getLog().warn(
+ "Connector deployment descriptor: " + ddFile.getAbsolutePath() + " does not exist." );
+ }
+
+ try
+ {
+ File rarFile = new File( outputDirectory, finalName + ".rar" );
+ MavenArchiver archiver = new MavenArchiver();
+ archiver.setOutputFile( rarFile );
+
+ archiver.getArchiver().addDirectory( getBuildDir() );
+ archiver.createArchive( project, archive );
+ }
+ catch ( Exception e )
+ {
+ throw new MojoExecutionException( "Error assembling RAR", e );
+ }
+
+
+ }
+
+ protected File getBuildDir()
+ {
+ if ( buildDir == null )
+ {
+ buildDir = new File( workDirectory );
+ }
+ return buildDir;
+ }
+}