// 
//     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 (incubating) 9.0 RC1 released
:author: Geertjan Wielenga
:revdate: 2018-05-29
:jbake-type: post
:jbake-tags: blogentry
:jbake-status: published
:keywords: Apache NetBeans 18 release
:description: Apache NetBeans 18 release
:toc: left
:toc-title:
:syntax: true




The Apache NetBeans team is proud to announce the release of Apache NetBeans (incubating) 9.0 RC1.

Apache NetBeans (incubating) 9.0 RC1 constitutes all the modules in the 'release90' branch of the Apache NetBeans Git repo (link:https://github.com/apache/incubator-netbeans[https://github.com/apache/incubator-netbeans]), which together provide the NetBeans Platform (i.e., the underlying application framework), which was released as Apache NetBeans 9.0 Alpha (incubating), as well as all the modules that provide the Java SE-related features of Apache NetBeans. In short, Apache NetBeans (incubating) 9.0 RC1 is a full IDE for Java SE development.

Download not available

Details on Apache NetBeans (incubating) 9.0 RC1, including a list of open issues to be resolved prior to the final release:

link:https://cwiki.apache.org/confluence/display/NETBEANS/Apache+NetBeans+9.0+RC1[https://cwiki.apache.org/confluence/display/NETBEANS/Apache+NetBeans+9.0+RC1]

What must be done for the final version of Apache NetBeans (incubating) 9.0 to be released?

. The items in the link above need to be fixed, e.g, new splash screen needs to be integrated.
. Cherry picking of pull requests merged into 'main' for 'release90' branch.
. Put together rc2 release, sanity test it via NetCAT, and publish it.
. Community Acceptance survey.
. Start Apache voting for the final release, incorporating input from the Community Acceptance survey.
. Release 9.0, which will be an IDE for Java SE development only, the other features have not been donated yet by Oracle and are being audited and processed and be part of subsequent releases of Apache NetBeans.

Take note of the Apache NetBeans release criteria:

link:https://cwiki.apache.org/confluence/display/NETBEANS/NetBeans+9.0+Release+Criteria[https://cwiki.apache.org/confluence/display/NETBEANS/NetBeans+9.0+Release+Criteria]

FYI, see the below for the donation status of features that have not been donated to Apache yet, e.g., features for working with Java EE, JavaScript, PHP, C/C++, and more:

link:https://cwiki.apache.org/confluence/display/NETBEANS/Apache+Transition[https://cwiki.apache.org/confluence/display/NETBEANS/Apache+Transition]

Work is being done on bringing netbeans.org to Apache. We already have our Apache site set up, here:

xref:../../index.adoc[https://netbeans.apache.org/]

On behalf of the Apache NetBeans PPMC

Geertjan
