 ------
 Manifest customization
 ------
 Dennis Lundberg
 ------
 2006-07-12
 ------

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

 ~~ NOTE: For help with the syntax of this file, see:
 ~~ http://maven.apache.org/doxia/references/apt-format.html

Manifest customization

* The Default Manifest

  The default contents of the manifest is described in the documentation for
  {{{/shared/maven-archiver/examples/manifest.html}Maven Archiver}}.

  Starting with version 2.1, the maven-jar-plugin uses Maven Archiver ${mavenArchiverVersion}. This
  means that it no longer creates the Specification and Implementation details
  in the manifest by default. If you want them you have to say so explicitly in
  your plugin configuration. This is also is described in the documentation for
  {{{/shared/maven-archiver/examples/manifest.html}Maven Archiver}}.

* Customization the Manifest

  The default manifest can be altered with the <<<archive>>> configuration
  element. Below you will find some of the configuration options that are
  available. For more info see the
  {{{/shared/maven-archiver/index.html}Maven Archiver reference}}.

+-----------------+
<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>${project.version}</version>
        <configuration>
          <archive>
            <index>true</index>
            <manifest>
              <addClasspath>true</addClasspath>
            </manifest>
            <manifestEntries>
              <mode>development</mode>
              <url>\${project.url}</url>
              <key>value</key>
            </manifestEntries>
          </archive>
        </configuration>
        ...
      </plugin>
    </plugins>
  </build>
  ...
</project>
+-----------------+
