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

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

== How can I customize the default project directory for my application, replacing "NetBeansProjects"?

You configure such things either in the launcher (netbeans.conf for the NB IDE, some other *.conf for a custom app), or at runtime in a ModuleInstall. 

[source,java]
----

File userDir = new File(System.getProperty("user.home"));
File myProjectsDir = new File(userDir, "My Projects");
if (!myProjectsDir.exists()) {
    myProjectsDir.mkdirs();
}
System.setProperty("netbeans.projects.dir", myProjectsDir.getAbsolutePath());
----



Source:

link:http://osdir.com/ml/java.netbeans.modules.openide.devel/2007-12/msg00195.html[http://osdir.com/ml/java.netbeans.modules.openide.devel/2007-12/msg00195.html]

== 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/DevFaqNetBeansProjectsDirectory[http://wiki.netbeans.org/DevFaqNetBeansProjectsDirectory] , 
that was last modified by NetBeans user Jglick 
on 2010-06-14T20:26:10Z.


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