////
     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 signatures should be matched against the link:https://www.apache.org/dist/netbeans/KEYS[KEYS] file which contains the PGP keys used to sign this release.

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.

[start=2]
. `cd` to that directory, and then run `ant build` to build the Apache NetBeans IDE.

[start=3]
. A zip of the IDE will be built inside `nbbuild`. Unzip this in a place of your choosing.

[start=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.

