~~ Licensed to the Apache Software Foundation (ASF) under one
~~ or more contributor license agreements.  See the NOTICE file
~~ distributed with this work for additional information
~~ regarding copyright ownership.  The ASF licenses this file
~~ to you 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.    
 
  ------
  Introduction
  ------
  Apache Directory Project
  ------
  Oct 2007
  ------
  
NOTE: THIS IS ONLY SANDBOX DOCUMENTATION!


Directory Studio Maven Plugin

  The directory studio maven plugin provides the capability to manipulate artifacts. It
  can prefix existing jar content with a director or can replace/add a file within an existing
  zip/jar archive.

* Goals Overview

  The directory studio maven plugin has 6 goals:
  
  * {{{prepare-jar-package-mojo.html}studio:prepare-jar-package}} prepares for building jar - copy artifacts not scoped "provided" 
  to ${project.build.outputDirectory}/libraryPath (default is target/classes/lib)
  
  * {{{unpack-with-artifactid-prefix-mojo.html}studio:unpack-with-artifactid-prefix}} unpack an artifact in a desired location and put
  the artifact content into a directory named like the final artifacts name (This is mainly used
  to unpack a *-feature.jar).

  * {{{clean-mojo.html}studio:clean}} cleans stuff generated by {{{eclipse-mojo.html}studio:eclipse}}
  
  * {{{replace-file-in-eclipse-artifact-mojo.html}studio:replace-file-in-eclipse-artifact}} takes a list of artifacts defined in
  the plugin configuration section and a configured directory where the artifacts
  are located (not in the local maven repository, but after a being copied e.g. to target
  directory) and replaced/adds a desired file to them.

  * {{{eclipse-mojo.html}studio:eclipse}} prepares for eclipse:\
      Copy artifacts nonscoped "provided" to ${basedir}/lib.\
      Add artifacts not scoped "provided" to Bundle-ClassPath in MANIFEST.MF.\
      Adapt ${basedir}/.classpath for artifacts not scoped "provided".\

  * {{{copy-eclipse-artifact-mojo.html}studio:copy-eclipse-artifact}}Copy a set of artifacts to a configured output directory 
  by replacing the separator between artifactId and version by an underscore instead of a dash.

  []
  
* Usage

   * Instructions on how to use the dependency plugin can be found {{{usage.html}here}}.

  []
