~~ 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>
 ------
 Oct 19, 2012

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.


