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

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

=== I want my module to disable some of the modules that would normally be enabled. Possible?

If you're building a complete application (for example, selecting the *Standalone Application* option for a module suite) just use the *Libraries* panel of the suite's *Properties* dialog to exclude modules you don't need from clusters you are otherwise including.

If you have a single module which you want to install in an existing application (e.g. the NetBeans IDE) and disable another module, it's a little trickier. You can do it in your `ModuleInstall.restored()` method:

link:http://bits.netbeans.org/dev/javadoc/org-openide-modules/org/openide/modules/doc-files/api.html#listing[Modules API - List of Modules]

Sample:

link:http://hg.netbeans.org/main/file/tip/versioning.system.cvss/src/org/netbeans/modules/versioning/system/cvss/ModuleLifecycleManager.java[ModuleLifecycleManager.java] of the Java CVS Module

You can also go through the Auto Update Services API:
link:http://blogs.sun.com/geertjan/entry/parsing_the_command_line_to1[Geertjan shows how]

-

Applies to: NetBeans 6.5 and later

=== 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/DevFaqSuppressExistingModule[http://wiki.netbeans.org/DevFaqSuppressExistingModule] , 
that was last modified by NetBeans user Jglick 
on 2009-12-03T14:01:41Z.


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