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

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

=== Can I disable Auto Update (for example, while running tests)?

The IDE often checks for updates on startup.
This behavior may not be desired in some cases;
for example, when running tests on the GUI,
because they can slow the application down or potentially change its behavior
from what you expected.
In order to prevent the Auto Update check,
run the application with the `netbeans.full.hack` system property set to `true`.
For example, use `-J-Dnetbeans.full.hack=true` on the command line.

Setting this property has some other side-effects; see: link:DevFaqNetBeansFullHack.asciidoc[DevFaqNetBeansFullHack]

Functional tests using `NbModuleSuite` get this property set automatically.
So do unit tests using `NbTestCase` (though they would rarely need it anyway).

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


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