////
     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 13 
:jbake-type: page_noaside
:jbake-tags: download
:jbake-status: published
:keywords: Apache NetBeans 13 Download
:description: Apache NetBeans 13 Download
:toc: left
:toc-title:
:icons: font

Apache NetBeans 13 was released on March 4, 2022. See link:/download/nb13/index.html[Apache NetBeans 13 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 13 is available for download from your closest Apache mirror.

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

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

IMPORTANT: macOS installer is in progress, not available for release yet. In the meantime, you're advised to unzip the binary ZIP listed above.

- Source: link:https://www.apache.org/dyn/closer.cgi/netbeans/netbeans/13/netbeans-13-source.zip[netbeans-13-source.zip] (link:https://downloads.apache.org/netbeans/netbeans/13/netbeans-13-source.zip.sha512[SHA-512],
link:https://downloads.apache.org/netbeans/netbeans/13/netbeans-13-source.zip.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://downloads.apache.org/netbeans/KEYS[here].

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

== Deployment Platforms

The Apache NetBeans 13 binary releases require JDK 11+, and officially support running on JDK 11 and JDK 17.

TIP: The current JDKs have an issue on macOS Big Sur, that causes freezes on dialogs. That could be fixed by applying the workaround described at link:https://issues.apache.org/jira/browse/NETBEANS-5037?focusedCommentId=17234878&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-17234878[NETBEANS-5037] .

== Building from Source

To build Apache NetBeans 13 from source you need:

. A distribution of OpenJDK 8 or 11.
. 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/13/netbeans-13-source.zip[netbeans-13-source.zip]
in a directory of your liking.

[start=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:https://netbeans.apache.org/community/mailing-lists.html[mailing lists]:

- link:https://lists.apache.org/thread/5skxn6g0h7nrtw62tqbsktjrbg9txzdh[PMC vote]
- link:https://lists.apache.org/thread/znnh36sjxttsdlk3hztr58l2n9zy4cwd[PMC vote result]

== Earlier Releases

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

