////
     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.
////
= About Apache NetBeans
:jbake-type: page
:jbake-tags: about
:jbake-status: published
:keywords: Apache NetBeans About
:description: About Apache NetBeans
:toc: left
:toc-title:
:icons: font

== Welcome to Apache NetBeans

In June 2000, NetBeans was made open source by Sun Microsystems, which remained
the project sponsor until January 2010 when Sun Microsystems became a
subsidiary of Oracle. 

Throughout its history in Sun Microsystems and Oracle, NetBeans has been free
and open source and has been leveraged by its sponsor as a mechanism for
driving the Java ecosystem forward. 

In 2016, Oracle donated the NetBeans source code to the link:https://www.apache.org/[Apache Software Foundation]. 
In April 2019 Apache NetBeans became a top level Apache project.  Please see
our link:history.html[History section] for more information.

== About Apache NetBeans

Apache NetBeans is top level Apache Project dedicated to providing rock solid
software development products (the Apache NetBeans IDE and the Apache NetBeans
Platform) that address the needs of developers, users and the businesses who
rely on NetBeans as a basis for their products; particularly, to enable them to
develop these products quickly, efficiently and easily by leveraging the
strengths of the Java platform and other relevant industry standards.

The two base products, the Apache NetBeans IDE and Apache NetBeans Platform,
are free for commercial and non-commercial use, under the link:https://www.apache.org/licenses/[Apache license]. 
The source code to both is available to anyone to reuse as they see fit, within the terms of use. 

The Apache NetBeans project is also a vibrant community in which people from across
the globe can ask questions, give advice, contribute and ultimately share in
the success of our products. On the link:/community/mailing-lists.html[NetBeans mailing lists] and forums, you will
find posts from students, developers from top companies, and individuals
looking to expand their skills.

=== The Apache NetBeans IDE

With over 18 million downloads of the NetBeans IDE to date, and over 800,000
participating developers, the NetBeans project is thriving and continues to
grow, thanks to the individuals and partner companies. To be a part of the
community, simply register for free.

Most developers recognize the NetBeans IDE as the original free Java IDE. It is
that, and much more! The Apache NetBeans IDE provides support for several languages
(Java, PHP, JavaFX, JavaScript, etc.) and frameworks, and more (C/C++) will be
incorporated soon.

=== The Apache NetBeans Platform

The Apache NetBeans Platform is a generic framework for Swing applications. It
provides the "plumbing" that, before, every developer had to write
themselves—saving state, connecting actions to menu items, toolbar items and
keyboard shortcuts; window management, and so on.

[.feature]
---
image::gephi-metrics-small.png[role="left", link="gephi-metrics.png"]
---

The NetBeans Platform provides all of these out of the box. You don't need to
manually code these or other basic features, yourself, anymore. See what some
NetBeans-based applications look like. The platform does not add a lot of
overhead to your application — but it can save a huge amount of time and work.

The Apache NetBeans Platform provides a reliable and flexible application
architecture. Your application does not have to look anything like an IDE. It
can save you years of development time. The NetBeans Platform gives you a
time-tested architecture for free. An architecture that encourages sustainable
development practices. Because the NetBeans Platform architecture is modular,
it's easy to create applications that are robust and extensible. 


