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

= Обзор IDE NetBeans 8.0
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Обзор IDE NetBeans 8.0 - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Обзор IDE NetBeans 8.0

В этом видеообзоре рассматриваются функциональные возможности IDE NetBeans 8.0.

link:https://netbeans.org/community/releases/80/[+NetBeans IDE 8.0+] обеспечивает полную поддержку новейших технологий Java 8 — Java SE 8, Java SE Embedded 8 и Java ME Embedded 8. Кроме того, IDE предоставляет ряд улучшений, расширяющих поддержку Maven и Java EE с PrimeFaces, новые инструменты для HTML5, в частности для AngularJS, и обеспечивает усовершенствованную поддержку PHP и C/C++.

link:http://bits.netbeans.org/media/nb80_overview_video.mp4[+Загрузить видео+] [Размер: 28,7 МБ]


 


== Связанные ссылки

* link:../../../kb/index.html[+Учебные курсы по IDE NetBeans+]
* link:../intro-screencasts.html[+Экранные демонстрации IDE NetBeans+]
* link:../../../community/index.html[+Сообщество NetBeans+]
link:/about/contact_form.html?to=3&subject=Feedback:%20NetBeans%207.4%20overview%20screencast[+Мы ждем ваших отзывов+]


