<?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="deploy">
      <question>If the Assembly Plugin is run during the package phase, do my assemblies get deployed during the deploy phase?</question>
      <answer>
        <p>Yes. The assemblies created by the Assembly Plugin is attached to your project so it gets deployed too.</p>
      </answer>
    </faq>
    <faq id="classifier">
      <question>Can I use an artifact created by the assembly plugin as a dependency?</question>
      <answer>
        <p>Yes. You can refer to it using the id of the assembly as the dependency classifier.</p>
      </answer>
    </faq>
    <faq id="javadoc">
      <question>How do I use the Assembly Plugin to package my project's javadoc files?</question>
      <answer>
        <p>The Javadoc Plugin can generate the javadoc files of your projects. Also, the Javadoc Plugin can package them!</p>
        <p>Please see the <a href="http://maven.apache.org/plugins/maven-javadoc-plugin/">Javadoc Plugin Documentation</a>.</p>
      </answer>
    </faq>
  </part>
  <part id="Artifact and Directory Formatting">
    <faq id="dashClassifier">
      <question>
        I have a dependencySet that includes some artifacts with classifiers, and others without classifiers. 
        How can I setup the file mappings to handle both cases appropriately?
      </question>
      <answer>
        <p>
          The best way to handle a mixed bag of dependencies with and without classifiers is to use the
          <b>${dashClassifier?}</b> expression, added in version 2.2-beta-2 of the assembly plugin especially
          for this purpose. This expression will determine whether each artifact has a classifier, and if it
          does, it will substitute the artifact's classifier - prepended by a dash - in place of the expression.
        </p>
        <p>
          For example, suppose you want to include two artifacts, commons-logging-1.0.4.jar, and 
          yourserver-1.0-client.jar (where 'client' is the classifier of the second artifact). To do this,
          simply add the following to your dependencySet:
        </p>
        <pre>
&lt;outputFileNameMapping&gt;${artifact.artifactId}-${artifact.version}${dashClassifier?}.${artifact.extension}&lt;/outputFileNameMapping&gt;
        </pre>
      </answer>
    </faq>
  </part>
</faqs>
