 -----
 Install 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. 
  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 );
      ...
   }
   
+---

   
   