////
     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: 
See https://www.apache.org/dev/release-download-pages.html 
for important requirements for download pages for Apache projects.

////
= Downloading Apache NetBeans 11.2 
:jbake-type: page-noaside
:jbake-tags: download
:jbake-status: published
:keywords: Apache NetBeans 11.2 Download
:description: Apache NetBeans 11.2 Download
:toc: left
:toc-title:
:icons: font

Apache NetBeans 11.2 was released on October 25, 2019.
See link:/download/nb112/index.html[Apache NetBeans 11.2 Features] for a full list of features.

////
NOTE: It's mandatory to link to the source. It's optional to link to the binaries.
NOTE: It's mandatory to link against https://www.apache.org for the sums & keys. https is recommended.
NOTE: It's NOT recommended to link to github.
////
Apache NetBeans 11.2 is available for download from your closest Apache mirror.

- Binaries: 
link:https://www.apache.org/dyn/closer.cgi/netbeans/netbeans/11.2/netbeans-11.2-bin.zip[netbeans-11.2-bin.zip] (
link:https://www.apache.org/dist/netbeans/netbeans/11.2/netbeans-11.2-bin.zip.sha512[SHA-512],
link:https://www.apache.org/dist/netbeans/netbeans/11.2/netbeans-11.2-bin.zip.asc[PGP ASC])

- Source: link:https://www.apache.org/dyn/closer.cgi/netbeans/netbeans/11.2/netbeans-11.2-source.zip[netbeans-11.2-source.zip] 
(link:https://www.apache.org/dist/netbeans/netbeans/11.2/netbeans-11.2-source.zip.sha512[SHA-512],
link:https://www.apache.org/dist/netbeans/netbeans/11.2/netbeans-11.2-source.zip.asc[PGP ASC])

- Installers:
 
* link:https://www.apache.org/dyn/closer.cgi/netbeans/netbeans/11.2/Apache-NetBeans-11.2-bin-windows-x64.exe[Apache-NetBeans-11.2-bin-windows-x64.exe] (
link:https://www.apache.org/dist/netbeans/netbeans/11.2/Apache-NetBeans-11.2-bin-windows-x64.exe.sha512[SHA-512],
link:https://www.apache.org/dist/netbeans/netbeans/11.2/Apache-NetBeans-11.2-bin-windows-x64.exe.asc[PGP ASC])
* link:https://www.apache.org/dyn/closer.cgi/netbeans/netbeans/11.2/Apache-NetBeans-11.2-bin-linux-x64.sh[Apache-NetBeans-11.2-bin-linux-x64.sh] (
link:https://www.apache.org/dist/netbeans/netbeans/11.2/Apache-NetBeans-11.2-bin-linux-x64.sh.sha512[SHA-512],
link:https://www.apache.org/dist/netbeans/netbeans/11.2/Apache-NetBeans-11.2-bin-linux-x64.sh.asc[PGP ASC])
* link:https://www.apache.org/dyn/closer.cgi/netbeans/netbeans/11.2/Apache-NetBeans-11.2-bin-macosx.dmg[Apache-NetBeans-11.2-bin-macosx.dmg] (
link:https://www.apache.org/dist/netbeans/netbeans/11.2/Apache-NetBeans-11.2-bin-macosx.dmg.sha512[SHA-512],
link:https://www.apache.org/dist/netbeans/netbeans/11.2/Apache-NetBeans-11.2-bin-macosx.dmg.asc[PGP ASC])

////
NOTE: Using https below is highly recommended.
////
Officially, it is important that you link:https://www.apache.org/dyn/closer.cgi#verify[verify the integrity]
of the downloaded files using the PGP signatures (.asc file) or a hash (.sha512 files).
The PGP keys used to sign this release are available link:https://www.apache.org/dist/netbeans/KEYS[here].

Apache NetBeans can also be installed as a self-contained link:https://snapcraft.io/netbeans[snap package] on Linux.

== Deployment platforms

Apache NetBeans 11.2 runs on JDK 8, 11, and 13.  (JDK 13 is the current JDK release at the time of this NetBeans release).

== Building from source

To build Apache NetBeans 11.2 from source you need:

. Oracle's Java 8 or OpenJDK v8.
. Apache Ant 1.10 or greater (https://ant.apache.org).

Once you have everything installed then:

1. Unzip link:https://www.apache.org/dyn/closer.cgi/netbeans/netbeans/11.2/netbeans-11.2-source.zip[netbeans-11.2-source.zip]
in a directory of your liking.
2. `cd` to that directory, and then run `ant build` to build the Apache NetBeans IDE.
3. A zip of the IDE will be built inside `nbbuild`. Unzip this in a place of your choosing.
4. Inside the unzipped IDE run `./bin/netbeans` (Linux / macOS) or `./bin/netbeans.exe` (Windows).

== Community approval

As in any other Apache Project, the Apache NetBeans Community approved this release
through the following voting processes in our link:/community/mailing-lists.html[mailing lists] :

- link:https://lists.apache.org/thread.html/a562f51f614364f931a35f8dfd310cfd15ebf44b150e40277e94ff40@%3Cdev.netbeans.apache.org%3E[PMC vote]
- link:https://lists.apache.org/thread.html/ec2ea0f6546cdfc89cc2c86abd13019561427d5e8f4f25dc9408df9e@%3Cdev.netbeans.apache.org%3E[PMC vote result]

== Earlier releases

Please visit the link:/download/index.html[Apache NetBeans Download page] for further details.

