 ----
 Install From Remote Repo
 ----
 ----
 2010-07-05
 ----
~~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.

Install From Remote Repo

 First, configure your settings.xml file to point to your repo. You may choose to enter the public snapshot repo
 below or to enter your own repo that hosts the NPanday VS installer.

+----+
  <profiles>
    <profile>
      <id>apache.snapshots</id>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
      <repositories>
        <repository>
          <id>org.apache</id>
          <name>Maven Snapshots</name>
          <url>http://people.apache.org/repo/m2-snapshot-repository</url>
          <releases>
            <enabled>false</enabled>
          </releases>
          <snapshots>
            <enabled>true</enabled>
          </snapshots>
        </repository>
      </repositories>
      <pluginRepositories>
        <pluginRepository>
          <id>org.apache</id>
          <name>Maven Plugin Snapshots</name>
          <url>http://people.apache.org/repo/m2-snapshot-repository</url>
          <releases>
            <enabled>false</enabled>
          </releases>
          <snapshots>
            <enabled>true</enabled>
          </snapshots>
        </pluginRepository>
      </pluginRepositories>
    </profile>
  </profiles>
+----+

 Due to a bug in Maven, if you are remotely resolving a plugin that doesn't exist in central, you will need to install
 from a directory containing a pom.xml file. So if you have a pom.xml handy, goto that directory from the command line.
 If not, you will need to download the {{{./pom.xml}pom.xml}} and goto to the download directory from the command line.
 Now type the following from the command line:

+----+
 mvn org.apache.npanday.plugins:maven-vsinstaller-plugin:install
+----+

 This will download the plugin and all of its dependencies.
