// 
//     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.
//

= [ANNOUNCE] Apache NetBeans 14 Released
Geertjan Wielenga
2022-06-17
:jbake-type: post
:jbake-tags: blogentry
:jbake-status: published
:keywords: Apache NetBeans blog index
:description: Apache NetBeans blog index
:toc: left
:toc-title:
:syntax: true


The Apache NetBeans team is pleased to announce that Apache NetBeans 14 was released on June 9, 2022 (though there's been a delay in announcing the release).

What's in the Apache NetBeans 14 release:

https://github.com/apache/netbeans/releases/tag/14

Note it's the first time we're doing a generated changelog like the above, next time it will be even better, we'll work on generating different sections and highlights, to make it easier to read through.

Downloads:

xref:../download/nb14/index.adoc[Apache NetBeans 14 Download page]

See our release schedule:

https://cwiki.apache.org/confluence/display/NETBEANS/Release+Schedule

Feel free to share the good news!

Thanks everyone, and best wishes,

Neil, Eric, Geertjan

on behalf of Apache NetBeans PMC

