<?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="what-is-ear">
     <question>What is an EAR archive?</question>
     <answer>
       <p>
         An EAR archive is used to deploy standalone EJBs, usually separated from the web application. Thus, there is no
         need for a web application to access these EJBs. The EJBs are still accessible though using EJB clients.
       </p>
     </answer>
   </faq>
   <faq id="har-files">
     <question>
       The EAR Plugin throws an exception when encountering artifact types it is unfamiliar with. Is this a bug?
     </question>
     <answer>
       <p>
         The exception can be prevented by adding your custom artifact type to the artifactTypeMappings configuration.
         There is a mini-guide on how to do that in the <a href="modules.html#Custom Artifact Types">modules
         configuration</a> section.
       </p>
     </answer>
   </faq>   
 </part>
</faqs>

