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

= Trilha de Tecnologia de Aplicações Java ME Embedded e Java Card
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Trilha de Tecnologia de Aplicações Java ME Embedded e Java Card - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Trilha de Tecnologia de Aplicações Java ME Embedded e Java Card

== O que é uma Aplicação Móvel? 

A maioria das aplicações móveis utiliza a plataforma Java Micro Edition (Java ME), que foi desenvolvida para pequenos dispositivos, como celulares, mas agora é utilizada em uma ampla variedade de dispositivos. O Java ME usa subconjuntos escalonados de componentes Java SE, máquinas virtuais e APIs. Ele também define APIs que são especificamente orientadas aos dispositivos móveis de consumidores e incorporados. O NetBeans IDE suporta link:http://www.oracle.com/us/technologies/java/embedded/micro-edition/overview/index.html[+Oracle Java ME Embedded+] e link:http://www.oracle.com/technetwork/java/javame/javacard/overview/getstarted/index.html[+plataforma Java Card+].

== Introdução

* link:../docs/javame/imp-ng.html[+Criando, Depurando e Criando Perfil em uma Aplicação Incorporada Móvel+]
* link:../docs/javame/java-card.html[+Guia de Início Rápido do Desenvolvimento de Java Card no NetBeans+]

== Tutoriais e Artigos

=== Desenvolvendo Aplicações Java Card

* link:../docs/javame/javacard.html[+Artigo de Início Rápido do Java Card+]
* link:http://www.oracle.com/technetwork/articles/javase/javacard-servlets-136657.html[+Implantando Servlets em Cartões Inteligentes: Servidores da Web Portáteis com Java Card 3.0+]

== Screencasts

* link:../docs/javame/nb_me8_screencast.html[+Demonstração: Suporte do NetBeans IDE para Java ME 8+]
* YouTube: link:http://youtu.be/_1PPSt2AwpM[+ Introduction into Java Micro Edition (ME) 8 (Introdução a Java Micro Edition (ME) 8)+] (_por Terrence Bar_)
* link:../docs/javame/nb_mesdk_screencast.html[+Demonstração: Configurando o NetBeans IDE para Desenvolvimento Móvel no Windows+]
* link:../docs/javame/imp-ng-screencast.html[+Demonstração: Suporte para Perfil IMP-NG no NetBeans IDE+]

== Documentos de Contribuição da Comunidade

* link:http://plugins.netbeans.org/PluginPortal/faces/PluginDetailPage.jsp?pluginid=11194[+Instalando o Plug-in Blackberry RIM para o NetBeans IDE+]
* link:http://nbandroid.org/wiki/index.php/Installation[+Como Instalar o Plug-in do Android no NetBeans+]

== Outros Recursos

* link:http://wiki.netbeans.org/JavaMESDKSupport[+Página Wiki do NetBeans no Suporte a Java ME SDK+]
* link:http://docs.oracle.com/javame/config/cldc/rel/8/rpi/html/getstart_rpi/debugging.htm#sthref31[+ Usando o NetBeans com o Raspberry Pi Board+] no _Guia de Conceitos Básicos sobre Oracle® Java ME Embedded para a Plataforma de Referência (Raspberry Pi) Release 8 EA 2_
* link:http://docs.oracle.com/javame/config/cldc/rel/3.3/win/gs/html/getstart_win32/setup_nbenv.htm[+ Usando o Software Oracle Java ME SDK com NetBeans+]
* link:http://www.oracle.com/pls/topic/lookup?ctx=nb8000&id=NBDAG1552[+Desenvolvendo Aplicações Java ME+] em _Desenvolvendo Aplicações com o NetBeans IDE_

=== Recursos da Comunidade do NetBeans Mobility

* link:http://wiki.netbeans.org/NetBeansUserFAQ#Java_ME.2FMobility[+Perguntas Frequentes do NetBeans Mobility+]
* link:http://forums.netbeans.org/javame-users.html[+Fórum do Usuário do NetBeans Java ME+]

=== Sites Relacionados ao Java ME

* link:http://www.oracle.com/technetwork/java/embedded/resources/me-embeddocs/index.html[+Documentação Incorporada do Java ME+]
* link:http://www.oracle.com/technetwork/java/javame/index.html[+Oracle Technology Network - Página Inicial do Java ME +]
