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

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

= How to run/execute an external program?

Use the "External Execution Support API".

* link:http://bits.netbeans.org/dev/javadoc/org-netbeans-modules-extexecution/overview-summary.html[http://bits.netbeans.org/dev/javadoc/org-netbeans-modules-extexecution/overview-summary.html]
* link:http://bits.netbeans.org/dev/javadoc/org-netbeans-modules-extexecution/org/netbeans/api/extexecution/ExecutionService.html[http://bits.netbeans.org/dev/javadoc/org-netbeans-modules-extexecution/org/netbeans/api/extexecution/ExecutionService.html]
* link:https://blogs.oracle.com/phejl/entry/external_execution_support_1_2[https://blogs.oracle.com/phejl/entry/external_execution_support_1_2]
* link:https://blogs.oracle.com/phejl/entry/external_execution_support_2_2[https://blogs.oracle.com/phejl/entry/external_execution_support_2_2]

Please not that some of the API mentioned in the links above got deprecated in NB 8.1. Please use `extexecution.base` instead. 
For more details see link:https://netbeans.org/bugzilla/show_bug.cgi?id=244308[https://netbeans.org/bugzilla/show_bug.cgi?id=244308]

=== 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/DevFaqExternalExecution[http://wiki.netbeans.org/DevFaqExternalExecution] , 
that was last modified by NetBeans user Markiewb 
on 2016-08-21T11:34:42Z.


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