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

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

== How can I find Javadoc of Autoupdate API with hints to use it?

Since NetBeans 6.0 there is a public *API* to use *Autoupdate Services*. Autoupdate API provides several services to applications built on NetBeans Platform: it allows users to download and install available updates of installed plugins, search and install new plugins from subscribed Update Centers, browsing and manipulating plugins already installed. To use these services NetBeans Platform supplies a GUI (_Plugin Manager_ in _Tools->Plugins_ menu item) to easy call these services. AutoUpdate API also cares about registration of Update Centers.

* Where to find Javadoc? link:http://bits.netbeans.org/dev/javadoc/org-netbeans-modules-autoupdate-services/overview-summary.html[http://bits.netbeans.org/dev/javadoc/org-netbeans-modules-autoupdate-services/overview-summary.html]
* Which version of NetBeans should I use? This API was firstly introduced in NetBeans 6.0 Platform where the API was still in development. In NetBeans 6.1 Platform it was made official API, it means further changes should be backward compatible. Use link:http://platform.netbeans.org/platform-get.html[NetBeans Platform of the latest version] for the best performance.

=== Related articles

* link:DevFaqWhatIsNbm.asciidoc[What is an NBM?]
* link:FaqPluginManagerCustomization.asciidoc[How to customize Plugin Manager?]
* link:DevFaqNbmPostInstall.asciidoc[How to specify post-install code in NBM?]
* link:FaqDevComponentWithCustomInstaller.asciidoc[How to install components using its custom installers?]

=== Other resources

* link:https://blogs.oracle.com/rechtacek/[Rechtacek's Blog]
* link:https://blogs.oracle.com/geertjan/[Geertjan's Blog]

== 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/DevFaqAutoUpdateAPIJavadoc[http://wiki.netbeans.org/DevFaqAutoUpdateAPIJavadoc] , 
that was last modified by NetBeans user Skygo 
on 2013-12-16T19:59:27Z.


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