<?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 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>
         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>