~~ 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 NB Repository Plugin 
 ------
 Milos Kleint
 <mkleint@codehaus.org>
 ------
 2012-10-19

HOWTO: Upload NetBeans release binaries to a Maven repository


 There is a goal that converts the NetBeans module information into Maven metadata
and is capable of uploading the module jar file, javadoc, sources and nbm files to local
and remote repositories. See {{{./populate-mojo.html}<<<populate>>> goal}} description.

 For a binary-only upload (jar files and nbm files only), it's possible to download the bits from official sites. See below for URLs.
For the complete upload, you will need to checkout the sources of the IDE/Platform you
want to upload. See this FAQ entry on {{{http://wiki.netbeans.org/DevFaqAccessSourcesUsingMercurial}HowTo checkout sources from Hg}}

 To have external dependencies correctly identified by their real GAV, you will need to download the index from central (or other) repository. 
See {{{./download-mojo.html}<<<download>>> goal}}

 The goal has multiple input parameters that link the goal to binaries prepared beforehand.

   * <<netbeansInstallDirectory>> designates the base directory where resides the NetBeans installation
that shall be uploaded. It can be either {{{http://www.netbeans.org/downloads/index.html}downloaded as zip}} or built from sources.
Run <<<ant>>> in your local hg clone to build the distribution at <<<nbbuild/netbeans>>> sundirectory.

   * <<netbeansNbmDirectory>> designates the base directory where the nbm files are located.
Run <<<ant build-nbms>>> in your local <<<hg clone>>> to build the nbms at <<<nbbuild/nbms>>> directory or download it from the
{{{http://updates.netbeans.org/netbeans}http://updates.netbeans.org/netbeans}} space eg.
final <<6.5>> version at {{{http://updates.netbeans.org/netbeans/6.5/final/uc/}http://updates.netbeans.org/netbeans/<<6.5>>/final/uc/}}.
Use a tool like <<<wget>>> to download the complete directory tree to a directory designated by the <<netbeansNbmDirectory>> parameter.

  * <<netbeansSourcesDirectory>> designates the base directory containing zip files with module jar sources.
Run <<<ant build-source-zips>>> in your local hg clone to build the nbms at <<<nbbuild/build/source-zips>>> directory.

  * <<netbeansJavadocDirectory>> designates the base directory containing zip files with javadoc zips for modules with public apis.
Run <<<ant build-javadoc>>> in your local hg clone to build the nbms at <<<nbbuild/build/javadoc>>> directory.


