 -----
 Introduction
 -----
 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

${project.name}

  The Maven Artifact Transfer Component is intended as an API
  to install, deploy and resolving artifacts in Maven 3.
  
  The {{{./comparison.html} comparison will show }} the differences between
  a dependency, artifact and a maven project.
  
  The {{{./install-project.html} install project}} part will show
  how to this component to make an install of an existing project
  which makes the handling within plugins much easier.

  <<Current State Of The Component>>
  Currently this shared component has not yet reached the final 1.0.0 version state which means the interfaces can
  change.
  

  
