<?xml version="1.0" encoding="UTF-8"?>

<!--
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.
-->


<faqs xmlns="http://maven.apache.org/FML/1.0.1"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/FML/1.0.1 http://maven.apache.org/xsd/fml-1.0.1.xsd"
  id="FAQ" title="Frequently Asked Questions">
 <part id="General">
   <faq id="question">
     <question>I get an Unsupported Protocol Error when deploying a 3rd party jar. What should I do?</question>
     <answer>
       <p>
         If you are using the <code>deploy:deploy-file</code> goal and encounter
         this error:
       </p>
       <p>
         <i>"Error deploying artifact: Unsupported Protocol: 'ftp': Cannot find
         wagon which supports the requested protocol: ftp"</i>
       </p>
       <p>
         Then you need to place the appropriate wagon provider in your
         <code>%M2_HOME%/lib</code>. In this case the provider needed is ftp,
         so we have to place the wagon-ftp jar in the lib directory of your
         Maven 2 installation.
       </p>
       <p>
         As an alternative to placing the wagon provider into the Maven distribution, you can also create a dummy
         POM that declares the required wagon as an <code>&lt;extension&gt;</code> inside the current directory.
       </p>
       <p>
         If the error description is something like this:
       </p>
       <p>
         <i>"Error deploying artifact: Unsupported Protocol: 'ftp': Cannot find
         wagon which supports the requested protocol: ftp
         org/apache/commons/net/ftp/FTP"</i>
       </p>
       <p>
         Then you need to place the commons-net jar in
         <code>%M2_HOME%/lib</code>.
       </p>
     </answer>
   </faq>
     <faq id="skip">
       <question>I don't want to deploy one of the artifacts in my multi-module build.  Can I skip deployment?</question>
       <answer>
         <p>
           Yes, you can skip deployment of individual modules by configuring the Deploy Plugin as follows:
         </p>
         <p>
           <source>
             <plugin>
               <artifactId>maven-deploy-plugin</artifactId>
               <version>X.Y</version>
               <configuration>
                 <skip>true</skip>
               </configuration>
             </plugin>
           </source>
         </p>
       </answer>
     </faq>
 </part>
</faqs>