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

 ------
 Maven 2 NBM Plugin 
 ------
 Milos Kleint
 <mkleint@codehaus.org>
 ------
 2007-06-15

Example nbm descriptors - since 3.8 DEPRECATED.

 These descriptors are referenced from the {{{./nbm-mojo.html}nbm:nbm}} mojo. The descriptor file is deprecated since version 3.8.
 
*Usual case

 A rather common module descriptor. Basic properties filled in, defines some libraries that ship with the module and
 declared dependencies on other NetBeans modules.

+-----+
<nbm>
   <moduleType>normal</moduleType>
   <codeNameBase>org.codehaus.mevenide.netbeans/2</codeNameBase>
   <cluster>mevenide</cluster>
   <manifest>src/main/nbm/manifest.mf</manifest>
   <!-- distributionUrl important when creating an autoupdate center. The expected download URL for the module is:
            ${distributionUrl}/${finalName}.nbm
     -->
   <distributionUrl>http://mevenide.codehaus.org/nbm_release2</distributionUrl>
   <licenseName>Apache License, Version 2.0</licenseName>
   <licenseFile>license.txt</licenseFile>
   <libraries>
       <!-- these dependencies get copied to modules/ext directory in the mevenide cluster and
            get referenced from the module's jar usign the Class-Path manifest entry. 
            Not necessary since 2.5 version of nbm-maven-plugin
         -->
       <library>org.netbeans.api:org-netbeans-graph</library>
       <library>org.netbeans.api:org-netbeans-graph-vmd</library>
   </libraries>
   <dependencies>
      <!-- all of these dependencies get referrenced as module dependencies of this project's artifact. 
        Not necessary since 2.5 version of nbm-maven-plugin
        -->
      <dependency>
          <id>org.codehaus.mevenide:run-jar-bridge</id>
      </dependency>
      <dependency>
          <id>org.codehaus.mevenide:debugger-bridge</id>
      </dependency>
      <dependency>
          <id>org.netbeans.api:org-netbeans-api-debugger-jpda</id>
      </dependency>
      <dependency>
          <id>org.netbeans.api:org-netbeans-api-debugger</id>
      </dependency>
      <dependency>
          <id>org.netbeans.api:org-netbeans-modules-options-api</id>
      </dependency>
      <dependency>
          <id>org.netbeans.api:org-openide-io</id>
      </dependency>
      <dependency>
          <id>org.netbeans.api:org-openide-modules</id>
      </dependency>
   </dependencies> 
</nbm>
+-----+

*Additional custom files in module

 Apart from the usual properties, this one declares additional files that ought to be packed into the module.

+-----+
<nbm>
   <moduleType>eager</moduleType>
   <codeNameBase>org.codehaus.mevenide.netbeans.nbrepo/2</codeNameBase>
   <cluster>mevenide</cluster>
   <manifest>src/main/nbm/manifest.mf</manifest>
   <distributionUrl>http://mevenide.codehaus.org/nbm_release2</distributionUrl>
   <licenseName>Apache License, Version 2.0</licenseName>
   <licenseFile>license.txt</licenseFile>
   <dependencies>
       <dependency>
           <id>org.codehaus.mevenide:nb-project</id>
       </dependency>
   </dependencies> 
   <nbmResources>
       <nbmResource>
           <baseDirectory>../ide-mojos/target</baseDirectory>
           <includes>
               <include>m2-repository/**</include>
           </includes>
       </nbmResource>
   </nbmResources>
</nbm>
+-----+
