miércoles, 22 de junio de 2016

Lenguajes de Programacion: Java

Java es un lenguaje de programación orientado a objetos desarrollado por Sun

Microsystems a principios de los años 90. El lenguaje en sí mismo toma mucha de su

sintaxis de Lenguaje de Programación C y C++, pero tiene un modelo de objetos más

simple y elimina herramientas de bajo nivel, que suelen inducir a muchos errores, como la

manipulación directa de punteros o memoria.

Las aplicaciones Java están típicamente compiladas en un bytecode, aunque la

compilación en código máquina nativo también es posible. En el tiempo de ejecución, el

bytecode es normalmente interpretado o compilado a código nativo para la ejecución,

aunque la ejecución directa por hardware del bytecode por un procesador Java también es

posible.

La implementación original y de referencia del compilador, la máquina virtual y las

bibliotecas de clases de Java fueron desarrollados por Sun Microsystems en 1995. Desde

entonces, Sun ha controlado las especificaciones, el desarrollo y evolución del lenguaje a

través del Java Community Process, si bien otros han desarrollado también

implementaciones alternativas de estas tecnologías de Sun, algunas incluso bajo licencias

de software libre.

Entre noviembre de 2006 y mayo de 2007, Sun Microsystems liberó la mayor parte de sus

tecnologías Java bajo la licencia GNU GPL, de acuerdo con las especificaciones del Java

Community Process, de tal forma que prácticamente todo el Java de Sun es ahora software

libre (aunque la biblioteca de clases de Sun que se requiere para ejecutar los programas

Java aún no lo es).

Filosofía


El lenguaje Java se creó con cinco objetivos principales:

Debería usar la metodología de la programación orientada a objetos.

Debería permitir la ejecución de un mismo programa en múltiples sistemas operativos.

Debería incluir por defecto soporte para trabajo en red.

Debería diseñarse para ejecutar código en sistemas remotos de forma segura.

Debería ser fácil de usar y tomar lo mejor de otros lenguajes orientados a objetos, como

C++.

Para conseguir la ejecución de código remoto y el soporte de red, los programadores de

Java a veces recurren a extensiones como CORBA (Common Object Request Broker

Architecture), Internet Communications Engine o OSGi respectivamente

Independencia de la plataforma

 

La segunda característica, la independencia de la plataforma, significa que programas

escritos en el lenguaje Java pueden ejecutarse igualmente en cualquier tipo de hardware.

Este es el significado de ser capaz de escribir un programa una vez y que pueda ejecutarse

en cualquier dispositivo, tal como reza el axioma de Java, ‘’’write once, run everywhere’’’.

Para ello, se compila el código fuente escrito en lenguaje Java, para generar un código

conocido como “bytecode” (específicamente Java bytecode)—instrucciones máquina

simplificadas específicas de la plataforma Java. Esta pieza está “a medio camino” entre el

código fuente y el código máquina que entiende el dispositivo destino. El bytecode es

ejecutado entonces en la máquina virtual (JVM), un programa escrito en código nativo de la

plataforma destino (que es el que entiende su hardware), que interpreta y ejecuta el código.

Además, se suministran bibliotecas adicionales para acceder a las características de cada

dispositivo (como los gráficos, ejecución mediante hebras o threads, la interfaz de red) de

forma unificada. Se debe tener presente que, aunque hay una etapa explícita de

compilación, el bytecode generado es interpretado o convertido a instrucciones máquina del

código nativo por el compilador JIT (Just In Time).

Hay implementaciones del compilador de Java que convierten el código fuente

directamente en código objeto nativo, como GCJ. Esto elimina la etapa intermedia donde se

genera el bytecode, pero la salida de este tipo de compiladores sólo puede ejecutarse en

un tipo de arquitectura.

La licencia sobre Java de Sun insiste que todas las implementaciones sean “compatibles”.

Esto dio lugar a una disputa legal entre Microsoft y Sun, cuando éste último alegó que la

implementación de Microsoft no daba soporte a las interfaces RMI y JNI además de haber

añadido características ‘’dependientes’’ de su plataforma. Sun demandó a Microsoft y ganó

por daños y perjuicios (unos 20 millones de dólares) así como una orden judicial forzando la

acatación de la licencia de Sun. Como respuesta, Microsoft no ofrece Java con su versión

de sistema operativo, y en recientes versiones de Windows, su navegador Internet Explorer

no admite la ejecución de applets sin un conector (o plugin) aparte. Sin embargo, Sun y

otras fuentes ofrecen versiones gratuitas para distintas versiones de Windows.

Las primeras implementaciones del lenguaje usaban una máquina virtual interpretada para

conseguir la portabilidad. Sin embargo, el resultado eran programas que se ejecutaban

comparativamente más lentos que aquellos escritos en C o C++. Esto hizo que Java se

ganase una reputación de lento en rendimiento. Las implementaciones recientes de la JVM

dan lugar a programas que se ejecutan considerablemente más rápido que las versiones

antiguas, empleando diversas técnicas, aunque sigue siendo mucho más lento que otros

lenguajes.

La primera de estas técnicas es simplemente compilar directamente en código nativo como

hacen los compiladores tradicionales, eliminando la etapa del bytecode. Esto da lugar a un

gran rendimiento en la ejecución, pero tapa el camino a la portabilidad. Otra técnica,

conocida como compilación JIT (Just In Time, o ‘’’compilación al vuelo’’’), convierte el

bytecode a código nativo cuando se ejecuta la aplicación. Otras máquinas virtuales más

sofisticadas usan una ‘’’recompilación dinámica’’’ en la que la VM es capaz de analizar el

comportamiento del programa en ejecución y recompila y optimiza las partes críticas. La

recompilación dinámica puede lograr mayor grado de optimización que la compilación

tradicional (o estática), ya que puede basar su trabajo en el conocimiento que de primera

mano tiene sobre el entorno de ejecución y el conjunto de clases cargadas en memoria. La

compilación JIT y la recompilación dinámica permiten a los programas Java aprovechar la

velocidad de ejecución del código nativo sin por ello perder la ventaja de la portabilidad en

ambos.

La portabilidad es técnicamente difícil de lograr, y el éxito de Java en ese campo ha sido

dispar. Aunque es de hecho posible escribir programas para la plataforma Java que actúen

de forma correcta en múltiples plataformas de distinta arquitectura, el gran número de estas

con pequeños errores o inconsistencias llevan a que a veces se parodie el eslogan de Sun,

"Write once, run anywhere" como "Write once, Debug everywhere" (o “Escríbelo una vez,

ejecútalo en cualquier parte” por “Escríbelo una vez, depúralo en todas partes”)

El concepto de independencia de la plataforma de Java cuenta, sin embargo, con un gran

éxito en las aplicaciones en el entorno del servidor, como los Servicios Web, los Servlets,

los Java Beans, así como en sistemas empotrados basados en OSGi, usando entornos

Java empotrados.

El recolector de basura


En Java el problema de las fugas de memoria se evita en gran medida gracias a la

Recolección de basura (o automatic garbage collector). El programador determina cuándo

se crean los objetos y el entorno en tiempo de ejecución de Java (Java runtime) es el

responsable de gestionar el ciclo de vida de los objetos. El programa, u otros objetos

pueden tener localizado un objeto mediante una referencia a éste. Cuando no quedan

referencias a un objeto, el recolector de basura de Java borra el objeto, liberando así la

memoria que ocupaba previniendo posibles fugas (ejemplo: un objeto creado y únicamente

usado dentro de un método sólo tiene entidad dentro de éste; al salir del método el objeto

es eliminado). Aun así, es posible que se produzcan fugas de memoria si el código

almacena referencias a objetos que ya no son necesarios—es decir, pueden aún ocurrir,

pero en un nivel conceptual superior. En definitiva, el recolector de basura de Java permite

una fácil creación y eliminación de objetos, mayor seguridad y puede que más rápida que

en C++.

Sintaxis


La sintaxis de Java se deriva en gran medida de C++. Pero a diferencia de éste, que

combina la sintaxis para programación genérica, estructurada y orientada a objetos, Java

fue construido desde el principio para ser completamente orientado a objetos. Todo en Java

es un objeto (salvo algunas excepciones), y todo en Java reside en alguna clase

(recordemos que una clase es un molde a partir del cual pueden crearse varios objetos).

Hola Mundo


Aplicaciones autónomas
// Hola.java
import java.io*;
public class Hola 
{
    public static void main(String[] args)throws IOException {
        System.out.println("¡Hola, mundo!"); 
    } 
}
Este ejemplo necesita una pequeña explicación.

Todo en Java está dentro de una clase, incluyendo programas autónomos. 

El código fuente se guarda en archivos con el mismo nombre que la clase que contienen y

con extensión “.java”. Una clase (class) declarada pública (public) debe seguir este convenio.

En el ejemplo anterior, la clase es Hola, por lo que el código fuente debe guardarse en el

fichero “Hola.java”

El compilador genera un archivo de clase (con extensión “.class”) por cada una de las

clases definidas en el archivo fuente. Una clase anónima se trata como si su nombre fuera

la concatenación del nombre de la clase que la encierra, el símbolo “$”, y un número

entero. 

Los programas que se ejecutan de forma independiente y autónoma, deben contener el

método ”main()”

La palabra reservada ”void” indica que el método main no devuelve nada. 

El método main debe aceptar un Array de objetos tipo String. Por acuerdo se referencia

como ”args”, aunque puede emplearse cualquier otro identificador.  


La palabra reservada ”static” indica que el método es un método de clase, asociado a la

clase en vez de una instancias de la misma. El método main debe ser estático o ’’de

clase’’. 

La palabra reservada public significa que un método puede ser llamado desde otras clases,

o que la clase puede ser usada por clases fuera de la jerarquía de la propia clase. Otros

tipos de acceso son ”private” o ”protected”

La utilidad de impresión (en pantalla por ejemplo) forma parte de la biblioteca estándar de

Java: la clase ‘’’System’’’ define un campo público estático llamado ‘’’out’’’. El objeto out es

una instancia de ‘’’PrintStream’’’, que ofrece el método ‘’’println (String)’’’ para volcar datos

en la pantalla (la salida estándar).  

Las aplicaciones autónomas se ejecutan dando al entorno de ejecución de Java el nombre

de la clase cuyo método main debe invocarse. Por ejemplo, una línea de comando (en Unix

o Windows) de la forma java –cp . Hola ejecutará el programa del ejemplo (previamente

compilado y generado “Hola.class”) . El nombre de la clase cuyo método main se llama

puede especificarse también en el fichero “MANIFEST” del archivo de empaquetamiento de

Java (.jar).

Applets

Las Applet Java son programas incrustados en otras aplicaciones, normalmente una página

Web que se muestra en un navegador. 
// Hola.java
import java.applet.Applet;
import java.awt.Graphics;
 
public class Hola extends Applet {
    public void paint(Graphics gc) {
        gc.drawString("Hola, mundo!", 65, 95);
    }    
}
 <!-- Hola.html -->
<html>
 <head>
   <title>Applet Hola Mundo</title>
 </head>
 <body>
   <applet code="Hola.class" width="200" height="200">
   </applet>
 </body>
</html>
La sentencia import indica al compilador de Java que incluya las clases java.applet.

Applet y java.awt. Graphics, para poder referenciarlas por sus nombres, sin tener que

anteponer la ruta completa cada vez que se quieran usar en el código fuente.

La clase Hola extiende (extends) a la clase Applet, es decir, es una subclase de ésta. La

clase Applet permite a la aplicación mostrar y controlar el estado del applet. La clase

Applet es un componente del AWT (Abstract Window Toolkit), que permite al applet

mostrar una inteterfaz gráfica de usuario o GUI (Graphical User Interface), y responder a

eventos generados por el usuario.

La clase Hola sobrecarga el método paint (Graphics) heredado de la superclase

contenedora (Applet en este caso), para acceder al código encargado de dibujar. El

método paint() recibe un objeto Graphics que contiene el contexto gráfico para dibujar el

applet. El método paint() llama al método drawString (String, int, int) del objeto Graphics

para mostrar la cadena de caracteres Hola, mundo! en la posición (65, 96) del espacio de

dibujo asignado al applet.

La referencia al applet es colocada en un documento HTML usando la etiqueta <applet>.

Esta etiqueta o tag tiene tres atributos: code="Hola" indica el nombre del applet, y

width="200" height="200" establece la anchura y altura, respectivamente, del applet. Un

applet también pueden alojarse dentro de un documento HTML usando los elementos

object, o embed, aunque el soporte que ofrecen los navegadores Web no es uniforme.

Servlets

Los Servlets son componentes de la parte del servidor de Java EE, encargados de generar

respuestas a las peticiones recibidas de los clientes. 
// Hola.java
import java.io.*;
import javax.servlet.*;
 
public class Hola extends GenericServlet 
{
    public void service(ServletRequest request, ServletResponse response)
        throws ServletException, IOException
    {
        response.setContentType("text/html");
        PrintWriter pw = response.getWriter();
        pw.println("Hola, mundo!");
        pw.close();
    }
}
Las sentencias import indican al compilador de Java la inclusión de todas las clases

públicas e interfaces de los paquetes java.io y javax.servlet en la compilación.

La clase Hola extiende (extends), es heredera de la clase GenericServlet. Esta clase

proporciona la interfaz para que el servidor le pase las peticiones al servlet y el mecanismo

para controlar el ciclo de vida del servlet.

La clase Hola sobrecarga el método service (ServletRequest, ServletResponse), definido

por la interfaz servlet para acceder al manejador de la petición de servicio. El método

service() recibe un objeto de tipo ServletRequest que contiene la petición del cliente y un

objeto de tipo ServletResponse, usado para generar la respuesta que se devuelve al

cliente. El método service() puede lanzar (throws) excepciones de tipo ServletException e

IOException si ocurre algún tipo de anomalía.

El método setContentType (String) en el objeto respuesta establece el tipo de contenido

MIME a "text/html", para indicar al cliente que la respuesta a su petición es una página con

formato HTML. El método getWriter() del objeto respuesta devuelve un objeto de tipo

PrintWriter, usado como una tubería por la que viajarán los datos al cliente. El método

println (String) escribe la cadena "Hola, mundo!" en la respuesta y finalmente se llama al

método close() para cerrar la conexión, que hace que los datos escritos en la tubería o

stream sean devueltos al cliente.

Aplicaciones con Ventanas

Swing es la biblioteca para la interfaz gráfica de usuario avanzada de la plataforma Java

SE.  
// Hola.java
 import javax.swing.*;
 
 public class Hola extends JFrame {
     Hola() {
         setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
         add(new JLabel("Hola, mundo!"));
         pack();
     }
 
     public static void main(String[] args) {
         new Hola().setVisible(true);
     }
 }
Las instrucciones import indican al compilador de Java que las clases e interfaces del

paquete javax.swing se incluyan en la compilación.

La clase Hola extiende (extends) la clase javax.swing.JFrame, que implementa una

ventana con una barra de título y un control para cerrarla.

El constructor Hola() inicializa el marco o frame llamando al método

setDefaultCloseOperation (int) heredado de JFrame para establecer las operaciones por

defecto cuando el control de cierre en la barra de título es seleccionado al valor

WindowConstants.DISPOSE_ON_CLOSE. Esto hace que se liberen los recursos tomados

por la ventana cuando es cerrada, y no simplemente ocultada, lo que permite a la máquina

virtual y al programa acabar su ejecución. A continuación se crea un objeto de tipo JLabel

con el texto "Hola, mundo!", y se añade al marco mediante el método add (Component),

heredado de la clase Container. El método pack(), heredado de la clase Window, es

invocado para dimensionar la ventana y distribuir su contenido.

El método main() es llamado por la JVM al comienzo del programa. Crea una instancia de la

clase Hola y hace la ventana sea mostrada invocando al método setVisible (boolean) de la

superclase (clase de la que hereda) con el parámetro a true. Véase que, una vez el marco

es dibujado, el programa no termina cuando se sale del método main(), ya que el código del

que depende se encuentra en un hilo de ejecución independiente ya lanzado, y que

permanecerá activo hasta que todas las ventanas hayan sido destruidas.

Entorno de Funcionamiento


El diseño de Java, su robustez, el respaldo de la industria y su fácil portabilidad han hecho

de Java uno de los lenguajes con un mayor crecimiento y amplitud de uso en distintos

ámbitos de la industria de la informática.

En Dispositivos Móviles y Sistemas Empotrados

Desde la creación de la especificación J2ME (Java 2 Platform, Micro Edition), una versión

del entorno de ejecución Java reducido y altamente optimizado, especialmente desarrollado

para el mercado de dispositivos electrónicos de consumo se ha producido toda una

revolución en lo que a la extensión de Java se refiere.

Es posible encontrar microprocesadores específicamente diseñados para ejecutar bytecode

Java y software Java para tarjetas inteligentes (JavaCard), teléfonos móviles,

buscapersonas, set-top-boxes, sintonizadores de TV y otros pequeños electrodomésticos.

El modelo de desarrollo de estas aplicaciones es muy semejante a las applets de los

navegadores salvo que en este caso se denominan MIDlets.

En el Navegador Web

Desde la primera versión de java existe la posibilidad de desarrollar pequeñas aplicaciones

(Applets) en Java que luego pueden ser incrustadas en una página HTML para que sean

descargadas y ejecutadas por el navegador web. Estas mini-aplicaciones se ejecutan en

una JVM que el navegador tiene configurada como extensión (plug-in) en un contexto de

seguridad restringido configurable para impedir la ejecución local de código potencialmente

malicioso.

El éxito de este tipo de aplicaciones (la visión del equipo de Gosling) no fue realmente el

esperado debido a diversos factores, siendo quizás el más importante la lentitud y el

reducido ancho de banda de las comunicaciones en aquel entonces que limitaba el tamaño

de las applets que se incrustaban en el navegador. La aparición posterior de otras

alternativas (aplicaciones web dinámicas de servidor) dejó un reducido ámbito de uso para

esta tecnología, quedando hoy relegada fundamentalmente a componentes específicos

para la intermediación desde una aplicación web dinámica de servidor con dispositivos

ubicados en la máquina cliente donde se ejecuta el navegador.

Las applets Java no son las únicas tecnologías (aunque sí las primeras) de componentes

complejos incrustados en el navegador. Otras tecnologías similares pueden ser: ActiveX de

Microsoft, Flash, Java Web Start, etc.

En Sistemas de Servidor

En la parte del servidor, Java es más popular que nunca, desde la aparición de la

especificación de Servlets y JSP (Java Server Pages).

Hasta entonces, las aplicaciones web dinámicas de servidor que existían se basaban

fundamentalmente en componentes CGI y lenguajes interpretados. Ambos tenían diversos

inconvenientes (fundamentalmente lentitud, elevada carga computacional o de memoria y

propensión a errores por su interpretación dinámica).

Los servlets y las JSPs supusieron un importante avance ya que:

El API de programación es muy sencilla, flexible y extensible.

Los servlets no son procesos independientes (como los CGIs) y por tanto se ejecutan

dentro del mismo proceso que la JVM mejorando notablemente el rendimiento y reduciendo

la carga computacional y de memoria requeridas.

Las JSPs son páginas que se compilan dinámicamente (o se pre-compilan previamente a

su distribución) de modo que el código que se consigue una ventaja en rendimiento

substancial frente a muchos lenguajes interpretados.

La especificación de Servlets y JSPs define un API de programación y los requisitos para

un contenedor (servidor) dentro del cual se puedan desplegar estos componentes para

formar aplicaciones web dinámicas completas. Hoy día existen multitud de contenedores

(libres y comerciales) compatibles con estas especificaciones.

A partir de su expansión entre la comunidad de desarrolladores, estas tecnologías han

dado paso a modelos de desarrollo mucho más elaborados con frameworks (pe Struts,

Webwork) que se sobreponen sobre los servlets y las JSPs para conseguir un entorno de

trabajo mucho más poderoso y segmentado en el que la especialización de roles sea

posible (desarrolladores, diseñadores gráficos, ...) y se facilite la reutilización y robustez de

código. A pesar de todo ello, las tecnologías que subyacen (Servlets y JSPs) son

substancialmente las mismas.

Este modelo de trabajo se ha convertido en uno de los estándar de-facto para el desarrollo

de aplicaciones web dinámicas de servidor.

En Aplicaciones de Escritorio

Hoy en día existen multitud de aplicaciones gráficas de usuario basadas en Java. El

entorno de ejecución Java (JRE) se ha convertido en un componente habitual en los PC de

usuario de los sistemas operativos más usados en el mundo. Además, muchas

aplicaciones Java lo incluyen dentro del propio paquete de la aplicación de modo que se

ejecuten en cualquier PC.

En las primeras versiones de la plataforma Java existían importantes limitaciones en las

APIs de desarrollo gráfico (AWT). Desde la aparición de la biblioteca Swing la situación

mejoró substancialmente y posteriormente con la aparición de bibliotecas como SWT hacen

que el desarrollo de aplicaciones de escritorio complejas y con gran dinamismo, usabilidad,

etc. sea relativamente sencillo.

Plataformas Soportadas

Una versión del entorno de ejecución Java JRE (Java Runtime Environment) está

disponible en la mayoría de equipos de escritorio. Sin embargo, Microsoft no lo ha incluido

por defecto en sus sistemas operativos. En el caso de Apple, éste incluye una versión

propia del JRE en su sistema operativo, el Mac OS. También es un producto que por

defecto aparece en la mayoría de las distribuciones de GNU/Linux. Debido a

incompatibilidades entre distintas versiones del JRE, muchas aplicaciones prefieren instalar

su propia copia del JRE antes que confiar su suerte a la aplicación instalada por defecto.

Los desarrolladores de Applets de Java o bien deben insistir a los usuarios en la

actualización del JRE, o bien desarrollar bajo una versión antigua de Java y verificar el

correcto funcionamiento en las versiones posteriores

Recursos


JRE

El JRE (Java Runtime Environment, o Entorno en Tiempo de Ejecución de Java) es el

software necesario para ejecutar cualquier aplicación desarrollada para la plataforma Java.

El usuario final usa el JRE como parte de paquetes software o plugins (o conectores) en un

navegador Web. Sun ofrece también el SDK de Java 2, o JDK (Java Development Kit) en

cuyo seno reside el JRE, e incluye herramientas como el compilador de Java, Javadoc para

generar documentación o el Depurador. Puede también obtenerse como un paquete

independiente, y puede considerarse como el entorno necesario para ejecutar una

aplicación Java, mientras que un desarrollador debe además contar con otras facilidades

que ofrece el JDK.

Componentes

Bibliotecas de Java, que son el resultado de compilar el código fuente desarrollado por

quien implementa la JRE, y que ofrecen apoyo para el desarrollo en Java. Algunos

ejemplos de estas bibliotecas son: 

Las bibliotecas centrales, que incluyen: 

Una colección de bibliotecas para implementar Estructuras de datos como Listas, arrays,

árboles y conjuntos. 

Bibliotecas para análisis de XML. 

Seguridad. 

Bibliotecas de internacionalización y localización. 

Bibliotecas de integración, que permiten la comunicación con sistemas externos. Estas

bibliotecas incluyen: 

La API para acceso a bases de datos JDBC (Java DataBase Conectivity). 

La interfaz JNDI (Java Naming and Directory Interface) para servicios de directorio. 

RMI (Remote Method Invocation) y CORBA para el desarrollo de aplicaciones distribuidas.

Bibliotecas para la interfaz de usuario, que incluyen: 

El conjunto de herramientas nativas AWT (Abstract Windowing Toolkit), que ofrece

componentes GUI (Graphical User Interface), mecanismos para usarlos y manejar sus

eventos asociados. 

Las Bibliotecas de Swing, construidas sobre AWT pero ofrecen implementaciones no

nativas de los componentes de AWT. 

APIs para la captura, procesamiento y reproducción de audio. 

Una implementación dependiente de la plataforma en que se ejecuta de la máquina virtual

de Java (JVM), que es la encargada de la ejecución del código de las bibliotecas y las

aplicaciones externas. 

Plugins o conectores que permiten ejecutar applets en los navegadores Web. 

Java Web Start, para la distribución de aplicaciones Java a través de Internet. 

Documentación y licencia.

APIs

Sun define tres plataformas en un intento por cubrir distintos entornos de aplicación. Así, ha

distribuido muchas de sus APIs (Application Program Interface) de forma que pertenezcan

a cada una de las plataformas:

Java ME (Java Platform, Micro Edition) o J2ME — orientada a entornos de limitados

recursos, como teléfonos móviles, PDAs (Personal Digital Assistant), etc. 

Java SE (Java Platform, Standard Edition) o J2SE — para entornos de gama media y

estaciones de trabajo. Aquí se sitúa al usuario medio en un PC de escritorio. 

Java EE (Java Platform, Enterprise Edition) o J2EE — orientada a entornos distribuidos

empresariales o de Internet.

Las clases en las APIs de Java se organizan en grupos disjuntos llamados Paquetes. Cada

paquete contiene un conjunto de interfaces, clases y excepciones relacionadas. La

información sobre los paquetes que ofrece cada plataforma puede encontrarse en la

documentación de ésta.

El conjunto de las APIs es controlado por Sun Microsystems junto con otras entidades o

personas a través del programa JCP (Java Community Process). Las compañías o

individuos participantes del JCP pueden influir de forma activa en el diseño y desarrollo de

las APIs, algo que ha sido motivo de controversia.

En 2004, IBM y BEA apoyaron públicamente la idea de crear una implementación de

Código abierto (open source) de Java, algo a lo que Sun, a fecha de 2006, se ha negado.

Extensiones y Arquitecturas relacionadas

Las extensiones de Java están en paquetes que cuelgan de la raíz javax: javax.*. No se

incluyen en la JDK o el JRE. Algunas de las extensiones y arquitecturas ligadas

estrechamente al lenguaje Java son:

Java EE (Java Platform, Enterprise Edition; antes J2EE) —para aplicaciones distribuidas

orientadas al entorno empresarial.

Java en Código Abierto


Java se ha convertido en un lenguaje con una implantación masiva en todos los entornos

(personales y empresariales). El control que mantiene Sun sobre éste genera reticencias en

la comunidad de empresas con fuertes intereses en Java (IBM, Oracle) y obviamente en la

comunidad de desarrolladores de Software libre.

La evolución basada en un comité en el que participen todos los implicados no es suficiente

y la comunidad demandaba desde hace tiempo la liberación de las APIs y bibliotecas

básicas de la JDK.

En Diciembre de 2006, Sun comenzó relanzamiento de su plataforma Java bajo la licencia

GPL de GNU.

Alternativas Libres

Existen alternativas para el entorno de ejecución y de desarrollo de Java con una gran

cobertura de funcionalidades con respecto a las implementaciones comerciales de Sun,

IBM, Bea, etc.

Información obtenida de

http://www.ecured.cu/Java


Lenguaje de Programación Java en el programa Java Eclipse


Tutorial de Java en el programa Java Eclipse