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

= DevFaqGeneralPackageNamingConventions
:jbake-type: wiki
:jbake-tags: wiki, devfaq, needsreview
:jbake-status: published
:keywords: Apache NetBeans wiki DevFaqGeneralPackageNamingConventions
:description: Apache NetBeans wiki DevFaqGeneralPackageNamingConventions
:toc: left
:toc-title:
:syntax: true

=== Why are some packages org.netbeans.api.something and others are org.netbeans.something.api?

There is a naming convention for APIs in NetBeans.  Generally when a new API is introduced, it will be under development and not stable for a while.  During that period, the naming convention for its package is `org.netbeans.modules.something.api`.  So, if you rely on an API with a name like that, your code could break.  Generally it is the responsibility of the author of that API to refactor all modules in NetBeans source repository when the API graduates to "official" status.

An official API uses the naming convention `org.netbeans.api.something`.  APIs named this way should remain backward compatible.

=== Apache Migration Information

The content in this page was kindly donated by Oracle Corp. to the
Apache Software Foundation.

This page was exported from link:http://wiki.netbeans.org/DevFaqGeneralPackageNamingConventions[http://wiki.netbeans.org/DevFaqGeneralPackageNamingConventions] , 
that was last modified by NetBeans user Anebuzelsky 
on 2010-06-11T14:40:26Z.


*NOTE:* This document was automatically converted to the AsciiDoc format on 2018-02-07, and needs to be reviewed.
