////
     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.1 
:jbake-type: page-noaside
:jbake-tags: download
:jbake-status: published
:keywords: Apache NetBeans 11.1 Download
:description: Apache NetBeans 11.1 Download
:toc: left
:toc-title:
:icons: font

Apache NetBeans 11.1 was released on July 22, 2019.
See link:/download/nb111/index.html[Apache NetBeans 11.1 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.1 is available for download from your closest Apache mirror.

- Binaries: 
link:https://archive.apache.org/dist/netbeans/netbeans/11.1/netbeans-11.1-bin.zip[netbeans-11.1-bin.zip] (
link:https://archive.apache.org/dist/netbeans/netbeans/11.1/netbeans-11.1-bin.zip.sha512[SHA-512],
link:https://archive.apache.org/dist/netbeans/netbeans/11.1/netbeans-11.1-bin.zip.asc[PGP ASC])

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

- Source: link:https://archive.apache.org/dist/netbeans/netbeans/11.1/netbeans-11.1-source.zip[netbeans-11.1-source.zip] 
(link:https://archive.apache.org/dist/netbeans/netbeans/11.1/netbeans-11.1-source.zip.sha512[SHA-512],
link:https://archive.apache.org/dist/netbeans/netbeans/11.1/netbeans-11.1-source.zip.asc[PGP ASC])

- Javadoc for this release is available at https://bits.netbeans.org/11.1/javadoc

////
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://archive.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.1 runs on JDK 8, 11, and 12.  (JDK 12 is the current JDK release at the time of this NetBeans release).


== Building from source

To build Apache NetBeans 11.1 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://archive.apache.org/dist/netbeans/netbeans/11.1/netbeans-11.1-source.zip[netbeans-11.1-source.zip]
in a directory of your liking.
2. `cd` to that directory, and then run `ant` to build the Apache NetBeans IDE.
Once built you can run the IDE by typing `./nbbuild/netbeans/bin/netbeans`

== 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/481ef107e6f5d8d6dfb35a831134bbbce3c6adb725e915ea8e5159d6@%3Cdev.netbeans.apache.org%3E[PMC vote]
- link:https://lists.apache.org/thread.html/b5d559bf860a5e6f5a908afec791c07ef1e0d0d16e6c739c73c454d9@%3Cdev.netbeans.apache.org%3E[PMC vote result]

== Earlier releases

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

