 ------
 Add a Project
 ------
 Emmanuel Venisse
 Olivier Lamy
 ------
 Oct 11 2007
 ------

Add a Project

~~%{toc|section=0}

* {Maven 2 project}

  From the menu, choose the 'Maven 2.0.x Project' entry
    
[../../images/add-m2-project-menu.png] Add a maven2 project

  The pom.xml file must be available through one of the following protocols: http, https, or ftp 
  (The file protocol is also supported but is disabled by default for security and must enabled manually).
    
  Or it can be uploaded from a local file (Note this doesn't support multi modules project).
    
[../../images/add-m2-project.png] Add a maven2 project

  You can define username/password if the POM URL requires authentication.

  If your SCM stores credentials like CVS or SVN and you want to use the SCM Credentials cache, check the "Use SCM Credentials Cache" field.

  You can define the group you want to use or "Defined by POM" in this case project.name will be use as Project Group.

  By default, Continuum adds each sub-module POM as an individual Continuum Project. If you want to add only the root POM without sub-modules, check the "load only root as recursive build" field.
  
  You can choose a Build Definition Template which will be applied to your project.  If you choose a Build Definition
  Template, the build definitions from the template will be added in addition to any build definitions that are defined
  at the project group level.

* {Maven 1 project}
    
  From the menu, choose the 'Maven 1.x Project' entry
    
[../../images/add-m1-project-menu.png] Add a maven1 project

  The project.xml file must be available through one of the following format : http, https and ftp 
  (file protocol is off by default for security and must enabled manually).
    
  Or it can be uploaded (Note this doesn't support multi modules project).

  The project you're adding can't use a parent.
    
[../../images/add-m1-project.png] Add a maven1 project

  You can define username/password if the POM URL require an authentication.

  If your SCM store credentials like CVS or SVN and you want to use the SCM Credentials cache, check the "Use SCM Credentials Cache" field.

  You can define the group you want to use or "Defined by POM." In this case project.name will be used as the Project Group.
  
  You can choose a Build Definition Template which will be applied to your project.

* {ANT Project}

  From the menu, choose the 'Ant Project' entry
    
[../../images/add-ant-project-menu.png] Add a Ant project

    TO WRITE

[../../images/add-ant-project.png] Add a Ant project

* {Shell Project}

  From the menu, choose the 'Shell Project' entry
    
[../../images/add-shell-project-menu.png] Add a shell project

    TO WRITE

[../../images/add-shell-project.png] Add a shell script project

* {Add a project from the Project Group}

    From the Project Group, you can add a project without using the menu. With this operation, the Project Group will be set to the current group.

[../../images/add-project-from-group.png] Add a project from a project group

* {Scm hints}

** {ClearCase}

    With ClearCase, you can configure SCM things in few ways. For example, you can use, in the scm URL in your POM, the absolute path of your config spec file like this:

+----------------------------+
<scm>
  <connection>scm:clearcase:absolute_path_of_config_spec</connection>
</scm>
+----------------------------+

    The SCM URL format used for ClearCase is defined {{{http://maven.apache.org/scm/clearcase.html}here}}

    and you can create a <<<clearcase-settings.xml>>> file under <<<${user.home}/.scm/>>> with the following content:

+----------------------------+
<clearcase-settings>
    <viewstore>\\mymachine\myvwstore</viewstore>
    <useVWSParameter>true</useVWSParameter>
</clearcase-settings>
+----------------------------+

    This configuration won't work with each ClearCase installation because each ClearCase configuration is different, so we recommend reading the
    {{{http://maven.apache.org/scm/clearcase.html}ClearCase page}} on the Maven-SCM site.
