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

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

== Can I create a console or server (non-GUI) app with the NetBeans Platform?

While most documentation explains the NetBeans Platform in terms of Java desktop applications, it is possible to build a non-GUI application on the NetBeans Platform.  This might be useful, for example, when creating a platform-based application which will distribute computationally expensive work among a group of machines.  Note that this explains how to develop an application which is only ever meant to run headless, not how to develop a single application which can run in either GUI _or_ command line mode (which is described in the second half of this page).

This is done by simply starting with the NetBeans Platform and removing all but the most essential components.  NetBeans architect link:http://www.apidesign.org/[Jaroslav Tulach] calls this subset of the NetBeans platform the "link:http://wiki.apidesign.org/wiki/NetBeans_Runtime_Container[runtime container]" and wrote an application which uses it to link:http://dvbcentral.sourceforge.net/[control his television].  

Here are the steps for creating a runtime container application:

1. Create a new suite
2. Exclude all clusters from the suite
3. Re-enable the platform cluster, but disable all but the following modules:
* Bootstrap
* File System API
* Lookup API
* Module System API
* Startup
* Utilities API
4. Add a new module to the suite
5. Create and register a `ModuleInstall` class
6. The `restored()` method is effectively your application's `main` method.
7. You may optionally override the `close()` method of your `ModuleInstall` to clean up resources upon shutdown, but be sure then to call `LifecycleManager.getDefault().shutDown()`.

You will also need to suppress the splash screen by passing `--nosplash` argument when starting the app.

== How Can I Make My NetBeans Platform Run in GUI or Command-Line Mode?

If your application performs some repetitive task like engineering analysis and you have some users who prefer using the command line and some who don't, you may be asked to modify your application so that it can run in either the normal GUI mode or in batch processing mode from the command line.

The exact method for doing this will vary per application, but you will typically need to add a module to interpret some custom command-line arguments using the link:http://bits.netbeans.org/dev/javadoc/org-netbeans-modules-sendopts/[Command Line Processing API].  Inside the process(Env env, Map<Option, String[]> map) method of your option processor, you'll invoke whatever code corresponds to the arguments the user specified (e.g. myapp --import path/to/file.txt might import some file).  

Remember that you should not use System.out, System.err and System.in for the output, error and input streams in the options processor but instead get them from the Env object passed as a parameter to the process method.  

When running a platform application which contains the Window System and other GUI modules, you will also need to specify --nosplash --nogui on the command line at startup to prevent the splash screen and window system from being displayed.  You may also wish to set the netbeans.logger.console system property to true (e.g. specify -J-Dnetbeans.logger.console=true on the command line) so that you will see NetBeans' error messages on the console.  It might also be a good idea to specify the plugin.manager.check.interval=NEVER system property to avoid checks for new plugins when running in command line mode.

Finally, note that prior to NetBeans 6.10, the current working directory available from the Env object was set to the directory of the application's installation, not the directory from which the command was executed.  The consequence of this is that resolving relative file paths did not work as expected on Microsoft Windows systems, although it does work correctly on all versions of UNIX I tested.  This has been resolved (link:http://netbeans.org/bugzilla/show_bug.cgi?id=189791[http://netbeans.org/bugzilla/show_bug.cgi?id=189791]), but the suggested workaround for affected versions of the platform is to introduce an additional batch file which invokes the NetBeans executable by passing in a Java system property that specifies the current (execution) directory.
<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/DevFaqNonGuiPlatformApp[http://wiki.netbeans.org/DevFaqNonGuiPlatformApp] , 
that was last modified by NetBeans user Tomwheeler 
on 2010-09-10T16:38:01Z.


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