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

= Integration with External Tools and Services
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Integration with External Tools and Services - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Integration with External Tools and Services

To facilitate development of various types of applications, the NetBeans IDE provides integration with some external tools and services. The resources listed below will help you learn how to configure and use such tools and services, for example, connect to databases, manage your source code using version control software, and use the integrated support for issue trackers.

== Tutorials and Articles

=== Databases

* link:../docs/ide/oracle-db.html[+Connecting to Oracle Database from NetBeans IDE+]
* link:../docs/ide/java-db.html[+Working with the Java DB (Derby) Database+]
* link:../docs/ide/mysql.html[+Connecting to a MySQL Database+]
* link:../docs/web/mysql-webapp.html[+Creating a Simple Web Application Using a MySQL Database+]
* link:../docs/ide/install-and-configure-mysql-server.html[+Setting Up the MySQL Database Server in the Windows Operating System+]

=== Maven

* link:../docs/java/maven-hib-java-se.html[+Creating a Maven Swing Application Using Hibernate+]
* link:http://wiki.netbeans.org/MavenBestPractices[+Maven Best Practices+]

=== Source Code Management

* link:../docs/ide/mercurial-queues.html[+Using Mercurial Queues Support in NetBeans IDE+]
* link:../docs/ide/git.html[+Using Git Support in NetBeans IDE+]
* link:../docs/ide/mercurial.html[+Using Mercurial Support in Netbeans IDE+]
* link:../docs/ide/subversion.html[+Using Subversion Support in Netbeans IDE+]
* link:../docs/ide/cvs.html[+Using CVS Support in Netbeans IDE+]
* link:../docs/ide/clearcase.html[+Using ClearCase Support in Netbeans IDE+]

=== Collaborative Development

* link:../docs/ide/team-servers.html[+Working With a Team Server in NetBeans IDE+]

=== Optimization

* link:../docs/java/profile-loadgenerator.html[+Using a Load Generator in NetBeans IDE+]

== Screencasts

* link:../docs/ide/github_nb_screencast.html[+Demo: Setting Up a GitHub Repository Using NetBeans IDE+]
* link:../docs/ide/git_nb_ssh_screencast.html[+Demo: Cloning a Git Repository Using NetBeans IDE+]
* YouTube: link:http://www.youtube.com/watch?v=mQS-CViDHBU[+FindBugs in NetBeans IDE+] (_by Geertjan Wielenga_)

== Community-Contributed Docs

* Geertjan's Blog: link:https://blogs.oracle.com/geertjan/entry/git_in_netbeans_ide_7[+Git with Rebase in NetBeans IDE+]
* link:http://wiki.netbeans.org/TutorialUsingSVNLocalRepository[+Using a Subversion (SVN) Local Repository+]
* link:http://wiki.netbeans.org/AccessMssql[+Accessing MS Access / MS SQL from NetBeans+]

== Other Resources

* link:http://www.oracle.com/pls/topic/lookup?ctx=nb8000&id=NBDAG1790[+Working and Connecting with Databases+] in _Developing Applications with NetBeans IDE_
* link:http://www.oracle.com/pls/topic/lookup?ctx=nb8000&id=NBDAG620[+Working with Maven in NetBeans+] in _Developing Applications with NetBeans IDE_
* link:http://www.oracle.com/pls/topic/lookup?ctx=nb8000&id=NBDAG234[+Versioning Applications with Version Control+] in _Developing Applications with NetBeans IDE_
* link:http://www.oracle.com/pls/topic/lookup?ctx=nb8000&id=NBDAG348[+Working in a Collaborative Environment+] in _Developing Applications with NetBeans IDE_
* link:http://wiki.netbeans.org/NetBeansUserFAQ#Version_Control_Systems[+Version Control FAQs+]
* link:http://wiki.netbeans.org/NetBeansUserFAQ#Database_Connectivity[+Database Connectivity FAQs+]
* link:http://www.mysql.com/why-mysql/java/[+MySQL and Java - Resources+]
