 -----
 Install a Project
 -----
 Karl Heinz Marbaise
 -----
 2017-05-07
 -----

 ~~ 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.

 ~~ NOTE: For help with the syntax of this file, see:
 ~~ http://maven.apache.org/doxia/references/apt-format.html

Install a Project

  If you are developing a Maven plugin or other components related to Maven, you need
  often to install artifacts into the local repository which is a little bit cumbersome. 

  With this component, this can be easily done via the following code parts:

+---  
   @Parameter ( defaultValue = "${session}", required = true, readonly = true )
   private MavenSession session;
   @Parameter ( defaultValue = "${project}", required = true, readonly = true )
   private MavenProject project;

   @Component
   private ProjectInstaller installer;
   ...
   public void execute()
   {
      
      ProjectInstallerRequest pir =
           new ProjectInstallerRequest()
             .setProject( project );

      installer.install( session.getProjectBuildingRequest(), pir );
      ...
   }
   
+---

   
   