Primeros pasos con Java Web Start (2): La consola de Java

miércoles, 14 de julio de 2010

En un post anterior hacía una introducción a Java Web Start. Ahora quiero comentar acerca de una característica que proporciona Java, y esta es su consola. La consola de Java viene con la instalación del JRE. De acuerdo al sitio ayuda de Java,

La consola de Java ofrece información acerca de la versión del entorno de ejecución de Java (JRE), el directorio de inicio del usuario y los mensajes de error que aparezcan durante la ejecución de un applet o una aplicación.
Pues bien, lo que nos interesa en este momento de la consola es la posibilidad de mostrar los mensajes de error que se lanzan durante la ejecución de una aplicación; para este caso nos será de mucha ayuda al momento de probar y depurar nuestras aplicaciones Java Web Start ya que podremos ver con más detalle los errores que sucedan durante la ejecución de nuestras aplicaciones.
Por defecto la consola de Java no se muestra, por lo tanto habrá que habilitarla siguiendo los pasos que se describen en la misma página y que a continuación presento.
Habilitación de la Consola de Java para la plataforma Windows, para las versiones de Java 6.0, 1.5.0
  1. Haga clic en Inicio.
  2. Seleccione Configuración.
  3. Seleccione Panel de control.
  4. Haga doble clic en el icono de Java.
  5. Haga clic en la ficha Avanzado.
  6. Haga clic en el signo + situado junto a Consola de Java. (Img. 1)
  7. Seleccione Ver consola y haga clic en Aplicar.
Img. 1. La Ventana de configuración

Una vez hecho esto, si ejecutamos nuestra aplicación Java Web Start o cualquier otra podremos ver una ventana como la mostrada abajo en la que veremos los errores que lance la aplicación.


Para otras versiones de Java o la visualización de la consola en navegadores como Firefox y otros pueden ver la página de ayuda de Java donde se explica.

Illegal character in path at index 18: file: ~/.m2/repository/org/apache/ant/ant/1.7.0/ant-1.7.0.jar

domingo, 11 de julio de 2010

Hace unos días mientras generaba mis CRUD usando la herramienta appfuse:gen de Appfuse me mostró el siguiente error extraño:

[INFO] null
Illegal character in path at index 18: file:/~/.m2/repository/org/apache/ant/ant/1.7.0/ant-1.7.0.jar
[INFO] ------------------------------------------------------------------------
[INFO] Trace
java.lang.IllegalArgumentException
Después de buscar pocos minutos, enseguida encontré cuál era el problema. El problema es que Maven tiene ciertos conflictos al intentar parsear la ubicación del repositorio si tal ubicación contiene espacios en blanco. Y este es un error ya muy conocido que me había tocado ver antes, pero lo había olvidado (algo muy común).
Como en mi caso, que por estar usando un Windows XP en español, por defecto Maven genera el repositorio en "C:/Documents and Settings/<usuario>/.m2/repository/org/apache/ant/ant/1.7.0/ant-1.7.0.jar", por lo tanto generará este error en alguna ejecución. Los pasos para corregir el error fue:
  1. Mover el repositorio que Maven genera, que por defecto se encuentra en "C:/Documents and Settings/<usuario>/.m2/" a una que no contenga espacios como "C:\.m2"
  2. Editar el archivo de configuración de Maven que se encuentra en <MAVEN_HOME>\conf\settings.xml. Descomentar y actualizar la directiva que apunta al repositorio local en

    c:\.m2\repository
  3. y BUILD SUCCESSFUL

Espero les sirva para cualquier ejecución de Maven con el mismo problema.

SAXNotRecognizedException: Property 'http://apache.org/xml/features/nonvalidating/load-external-dtd' is not recognized

miércoles, 7 de julio de 2010

Actualmente estoy desarrollando una pequeña aplicación usando Appfuse 2.0.2. Appfuse cuenta con una herramienta de generación de código muy potente que usa Maven.

mvn appfuse:gen -Dentity=NombrePojo

Pues bien, al momento de intentar generar mis CRUD (Create, Retrieve, Update y Delete) me marcó el error:
org.xml.sax.SAXNotRecognizedException: Property 'http://apache.org/xml/features/nonvalidating/load-external-dtd'

Después de buscar un rato en la lista de correo de Appfuse encontré que es una funcionalidad no probada aún con Java 6 y recomiendan solucionarlo apuntando a otra URL, pero había que hacer algunos cambios muy drásticos, pero lo que quería era solamente solucionar ese error y no tenía inconvenientes en cambiar de versión de Java, así que
  1. instalé la versión 5 de Java,
  2. cambié el valor de la variable de entorno JAVA_HOME a la ubicación del JDK5 en vez de la 6,
  3. abrí una nueva ventana de comandos,
  4. ejecuté nuevamente la instrucción mvn appfuse:gen -Dentity=NombrePojo y
  5. vualá BUILD SUCCESSFUL.
Espero que les sirva si están usando Appfuse

Primeros pasos con Java Web Start

domingo, 25 de abril de 2010

Hace algún tiempo tuve que aprender a usar esta definición de la plataforma Java para desarrollar una pequeña aplicación Swing que se ejecutaría vía Java Web Start desde un link en una aplicación Web. Para usar Java Web Start se requiere más que nada realizar varias configuraciones, nada de programación.

Para hacer esto seguí estos sencillos pasos.

Pasos para habilitar la ejecución de JavaWebStart desde una aplicación Web

1. Empaquetar la aplicación
Lo primero que deberemos hacer será empaquetar nuestra aplicación en un archivo JAR. Además, para poder ejecutar nuestra aplicación desde una aplicación de JavaWebStart deberemos firmar el JAR digitalmente, pero esto se explicará más adelante. Para empaquetar nuestra aplicación usamos la herramienta de línea de comandos de Java. Aunque en todo caso, puede usarse cualquier herramienta disponible en nuestro IDE, si se dispone de uno.


<MIAPLICACION_DIR>.jar –cf <nombre-archivo-jar>.jar <clase-java1>.class <clase-java2>.class <clase-javaN>.class


2. Firma digital
Ya tenemos casi listo nuestro JAR, ahora solo deberemos firmarlo. Esta firma digital es importante ya que todas las aplicaciones se ejecutan dentro de un sandbox, que es un espacio de seguridad del cliente donde se ejecutará la aplicación. Los pasos son los siguientes.

a) Generar el Keystore: Desde línea de comandos entrar al direcotorio bin de nuestra instalación de Java (el JAVA_HOME).

<JAVA_HOME>\bin>keytool -genkey -alias test –keyalg RSA -keystore test.jks

Luego se habrá generado el archivo test.jks en el directorio bin .

b)
Lo siguiente será firmar el JAR con la herramienta KeyTool IUI disponible en KeyTool IUI 2.4.1

Con estos pasos tendremos una aplicación empaquetada y firmada que podrá ejecutarse en el cliente. Para más información al respecto de firma digital escuche el podcast de Javahispano no. 080 - Criptografia y Firma Digital.

3. Archivo de configuración de Java Web Start
Ahora crearemos el archivo de configuración de nuestra aplicación Java Web Start en nuestro editor de texto preferido. El archivo de configuración tendrá el nombre que deseemos y con la extensión .jnlp (holaMundo.jnlp). Se puede encontrar más información sobre cómo crearlo y más opciones de configuración en el siguiente enlace JNLP File Syntax.

<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+"
codebase="http://localhost:8080/micontextoweb/javaws"
href="TheTime.jnlp"
>
<!-- Información general de nuestra aplicación -->
<information>
<title>Hola Mundo</title>
<vendor>Jorge Ruiz Aquino</vendor>
<homepage href="/micontextoweb" />
<description>Archivo de ejemplo</description>
</information>
<offline-allowed/>
<!-- Se establecen los permisos para la aplicación dentro del sandbox -->
<security>
<all-permissions/>
</security>
<!--
Se listan los recursos necesarios para la ejecución de la aplicación,
como la versión mínima de Java requerida, la ubicación del JAR de nuestra aplicación,
además de las librerías externas que se usarán.
-->
<resources>
<j2se version="1.5+" />
<jar href="http://localhost:8080/micontextoweb/javaws/AplicacionFirmada.jar"/>
</resources>
<!-- Se establece el nombre de la clase que contiene el método main() -->
<application-desc main-class="ClaseMain" />
</jnlp>

Los permisos en nuestra configuración anterior son necesarios además de la firma digital que hemos agregado al JAR en el paso anterior.

Ahora que tenemos nuestro archivo AplicacionFirmada.jar y nuestra configuración JavaWebStart holaMundo.jnlp; pondremos estos archivos y las librerías necesarias en donde corresponda dentro de nuestro servidor Web. En mi caso, será en mi servidor Web Apache Tomcat /micontextoweb/javaws/, tal como está configurado en el archivo .jnlp, en el apartado .

4. Soporte de JNLP en el servidor Web
Lo siguiente será asegurarse que el servidor Web soporta archivos de tipo JNLP, que es la extensión de las aplicaciones Java Web Start. Para esto se debe habilitar el soporte del tipo MIME en la configuración del servidor, por ejemplo, en el servidor Web Tomcat se puede habilitar en la configuración del archivo /conf/web.xml agregando un nuevo mapping para el tipo MIME. Por defecto Tomcat ya lo tiene habilitado.

<mime-mapping>
<extension>jnlp</extension>
<mime-type>application/x-java-jnlp-file</mime-type>
</mime-mapping>


5. Soporte de JNLP en el navegador Web

Posteriormente, en nuestra aplicación Web agregaremos una porción de código Javascript para verificar que el navegador soporta el tipo MIME. Aunque, actualmente la mayoría de los navegadores soporta este tipo de archivos.

function mimetypeCheck() {
// First, determine if Webstart is available
if (navigator.mimeTypes['application/x-java-jnlp-file']) {
plugin = navigator.mimeTypes['application/x-java-jnlp-file'];
} else {
document.write ("no jnlp file association
");
}
// Next, check for appropriate version family
for (var i = 0; i < navigator.mimeTypes.length; i++) {
plugin = navigator.mimeTypes[i];
}
}
mimetypeCheck();


6. Enlace a la aplicación Java Web Start en la aplicación Web
Finalmente, agregamos un enlace en nuestra aplicación Web para poder descargar la aplicación JNLP.

<a href="http://localhost:8080/micontextoweb/javaws/archivo.jnlp">Descargar JNLP</a>



Ahora estamos listo para arrancar el servidor Web y probar la ejecución de nuestra primera aplicación Java Web Start.


Suerte con su primera taza de Java Web Start.

Comenzando con Java (3) - La variable JAVA_HOME (Windows)

domingo, 21 de marzo de 2010

Normalmente cuando estamos comenzando a usar Java nos encontramos con que tenemos que agregar el JAVA_HOME (el directorio de instalación de Java) a las variables de entorno de Windows. Pues bien, para esa "primera vez" me he dado a la tarea de escribir este pequeño tutorial. Para este tutorial debemos tener presentes los siguientes conceptos:

Variables de entorno
Autoexec.bat
PATH: Que es donde el intérprete de comandos buscará los comandos de ejecución que escribamos en la consola, siempre y cuando no usemos una ruta específica para llamar al comando.

La idea del JAVA_HOME es que agreguemos una nueva variable de entorno a nuestro sistema. En este caso JAVA_HOME es el nombre de facto, aunque podría ser cualquier otro, lo importante es que además lo agreguemos al PATH para que Windows pueda reconocer los comandos de Java. Incluso podríamos no definir la variable JAVA_HOME y hacerlo todo directamente sobre la variable PATH, pero por convención y practicidad es mejor definirla, esto te será más claro conforme sigas usando Java.
Para agregar la nueva variable de entorno hay dos caminos a seguir.

El primero es usando la ventana de Propiedades del sistema de Windows.
(La forma en que siempre lo hago)

1. Hacer la combinación de teclas Inicio(la tecla de la ventanita) + Pausa para abrir la ventana de Propiedades del sistema.



2. Dentro de la ficha Opciones avanzadas, oprimir el botón Variables de entorno, lo que abrirá una nueva ventana titulada Variables de entorno.


Nota: Dentro de las variables de entorno tenemos las Variables de usuario y las Variables del sistema, las primeras funcionan mientras la sesión del usuario para la cuál está definida está abierta, las otras funcionan para todos los usuarios y se necesitan permisos de administrador para definirlas. Preferentemente yo siempre uso las Variables de sistema, a menos que haya una situación particular que requiera que use las variables de usuario.

3. En la sección de las Variables del sistema haremos clic sobre el botón Nueva, esto nos abrirá un pequeño cuadro de diálogo donde agregaremos los siguientes valores:
* en la caja Nombre de variable: JAVA_HOME
* en la caja Valor de variable: la ubicación donde hayas instalado el JDK, en mi caso C:\Archivos de programa\Java\jdk1.6.0_18 y hacer clic en Aceptar.


4. Buscar la varibla de sistema llamada Path y hacer clic en Modificar.
5. En el campo Valor de variable de la ventana de diálogo Modificar variable de sistema agregaremos nuestra nueva variable de entorno al final del valor existente separándolo por un punto y coma (;) de la siguiente forma: ;%JAVA_HOME%\bin;

De esta forma estamos haciendo referencia a la carpeta bin (donde están los comandos de ejecución) de la instalación de Java usando la variable JAVA_HOME que hemos creado en los pasos anteriores. También podríamos haber escrito directamente la ruta de la instalación del JDK en el Path, pero como lo he dicho antes, es preferible hacerlo de esta forma.

Después de estos pasos simplemente deberemos hacer clic en el botón Aceptar de cada ventana y tendremos agregada nuestra nueva variable de entorno.

Otra forma es haciéndolo directamente desde la ventana de linea de comandos:

1. Hacer la combinación de teclas Inicio + R para abrir la ventana Ejecutar, y escribir cmd y hacer clic en Aceptar. Esto abrirá una ventana de linea de comandos.


2. En la ventana de linea de comandos escribir: set JAVA_HOME=, nuevamente, en mi caso la ruta de instalación es "C:\Archivos de programa\Java\jdk1.6.0_18"

Nota
: Las comillas no son necesarias a menos que tengamos espacios en blanco en nuestra ruta, como en este caso.

3. Posteriormente, en la misma ventana, habrá que agregar esta variable al Path de esta forma: set Path=%Path%;%JAVA_HOME%\bin;


Con esto habremos agregado la nueva variable de entorno, pero solo estará disponible mientras permanezca abierta la sesión de la linea de comandos. Para hacer permanente nuestras variables de otra forma, podemos agragarlas al Autoexec.bat para que se carguen siempre que arranque el sistema.

Agregar las variables de entorno en el Autoexec.bat

1. Abrimos una ventana de Ejecutar como en el paso uno de la sección anterior y escribimos sysedit y hacemos clic en Aceptar.
2. En la ventana de AUTOEXEC.BAT agregamos las lineas
@echo off
JAVA_HOME="C:\Archivos de programa\Java\jdk1.6.0_18"
Path=%Path%;%JAVA_HOME%\bin;


Y después de guardar el archivo, preferentemente, reinicia el sistema.

Nota: Gracias a un comentario, debo remarcar que en versiones posteriores a Windows ME las variables de entorno se deben agregar por medio de la ventana de Propiedades del sistema y no por la modificación del archivo autoexec.bat, aunque aun es posible.

La prueba

Para comprobar que verdaderamente se ha agregado la nueva variable de entorno abre una ventana de línea de comandos y escribe java -version, y el resultado de ejecutar esta línea deberá ser algo similar a esto:


Para más inromación sobre comandos del DOS, el Autoexec.bat y en general sobre las variables de entorno, dejo estos enlaces:
Variables de entorno
Environment variables
Autoexec.bat (inglés)
Autoexec.bat (español)
Config.sys y Autoexec.bat
How do I set or change the PATH system variable?

Comenzando con Java (2) - El IDE

martes, 16 de marzo de 2010

En la sección anterior de esta serie de Comenzando con Java vimos cómo comenzar apoyándonos en tutoriales y les dejé algunos videotutoriales muy buenos que me he encontrado en la red. Ahora toca seleccionar nuestro editor de desarrollo.

La selección de nuestro primer IDE (Integrated Development Environment, Entorno Integrado de Desarrollo) es muy importante pues nos ayudará a resolver problemas comunes, acelerar nuestro aprendizaje y adaptarnos poco a poco a una forma particular de trabajo.

Debemos seleccionar el IDE de acuerdo a nuestras necesidades, por ejemplo, si lo necesitamos solo para el uso académico, aprendizaje de ciertas herramientas y/o tecnologías del mundo Java, si lo necesitamos para uso profesional, ya que en ciertas empresas dicen al desarrollador cuál IDE usar, etc.

Como este tutorial lo he escrito para quienes aun están aprendiendo a programar en Java, les recomiendo usar un IDE
Lo que yo recomiendo es verificar que el IDE:

  • sea intuitivo
  • tenga resaltador de código
  • tenga depurador
  • tenga autocompletado (no indispensable si estás aprendiendo)

Aunque llegarás a usar otras herramientas muy prácticas y otras muy complejas conforme avances en tu aprendizaje.

Por ejemplo, yo aprendí usando un editor muy simple: TextPad, y también vi a compañeros aprendiendo con JPadPro.

Uno muy utilizado en la academia para la enseñanza de la programación en Java es BlueJ, la cual también recomiendo mucho.

También puedes aprender con uno más profesional como Netbeans (comentarios a parte) que es un IDE muy completo y ampliamente usado en entornos profesionales. Es gratuito y puedes descargarlo en su versión más ligera para comenzar a programar. También puede usar la versión Classic de Eclipse. Consulta sus páginas respectivas o la Wikipedia para leer más al respecto y decidir por un IDE.

Pero existen muchos más en el mundo Java, para todos los gustos, solo he comentado los más comunes.


Enlaces:
Netbeans (Wikipedia| descarga)
Eclipse (Wikipedia| descarga)
BlueJ (Wikipedia| descarga)
TextPad (Wikipedia)
JPadPro

"An instance of the program seems to be already running" en Netbeans

lunes, 8 de marzo de 2010

Actualmente estoy usando Netbeans 6.7.1 para desarrollar una aplicación Swing ya que me gusta el Matisse que viene con este IDE. Pero ya han sido varias ocasiones en las que la computadora se ha apagado abruptamente, lo que ha causado que Netbeans no se cierre correctamente; y después de reiniciar e intentar abrir nuevamente el IDE me muestra una ventana de alerta con el siguiente mensaje:

"An instance of the program seems to be already running with your user directory. Either a previous session of the program did not exit correctly, or another instance of the program is running on a different computer and using the same user directory.

"If another session of the program is running with the same user directory, please click Cancel to prevent the corruption of the user directory. If you are sure that no other instances of the program are running with your user directory, click OK to continue."

Para solucionar este problema debemos tener presente que Netbeans guarda distintas carpetas de configuración, estas son el Directorio de instalación, Directorio de usuario y Directorio de proyectos. Pues bien, para solucionar este problema en particular lo único que he hecho ha sido borrar el archivo lock que se encuentra en el directorio de usuario; en mi caso C:\Documents and Settings\Jorge Ruiz\.netbeans\6.7\lock

Las carpetas comentadas se crean durante la instalación de Netbeans y el usuario puede modificarlas, por lo tanto, es importante leer bien los diálogos antes de hacer clic en el botón Next de la instalación. Para más información sobre estas carpetas puedes leer el blog de soporte de Netbeans. Espero que la solución de mi caso les sirva...

Invocar programas ASM desde Java paso a paso

miércoles, 27 de enero de 2010

Hace ya varios meses envié un tutorial al portal de JavaHispano donde explicaba cómo hacer para invocar funciones escritas en lenguaje ensamblador desde Java. Y como ya pasaron más de tres meses desde entonces, ya puedo usarlo en mi blog :D.
Aquí les dejo el Contenido y las dos primeras partes para que se den una idea; también les dejo el código fuente y el documento PDF del tutorial.

Contenido

  1. Introducción
  2. ¿Cuándo usar JNI?
  3. Requerimientos de software
  4. Configuración del ambiente de trabajo
  5. La programación
  6. La ejecución
  7. Conclusión
  8. Referencias y lecturas

1. Introducción
En el sitio de java.net existe un pequeño tutorial titulado Invoking Assembly Language Programs from Java1 pero está en inglés y no es muy sencillo para algunos nuevos programadores Java o ensamblador. En java.net explican cómo funciona la invocación de un programa ASM desde Java y qué hacer para lograrlo, pero no explican cómo hacer cada paso. Por lo tanto me he dado a la tarea de facilitar la comprensión de estas técnicas para los hispanohablantes que dan sus primeros pasos con JNI; ya que conocer un poco del funcionamiento de JNI y la invocación de aplicaciones en ensamblador es fundamental cuando se tienen aplicaciones que necesiten operaciones que consuman mucho proceso del servidor y se necesite implementar un pequeño programa a bajo nivel para ejecutar tales operaciones, y de esta manera disminuir el tiempo de espera que a veces suele ser crítico.
También con JNI tenemos la capacidad de invocar funciones y procedimientos escritos en otros lenguajes, como C/C++ o en nuestro caso ASM, por ejemplo, cuando se tienen sistemas legados y se necesite utilizar alguna función del código legado será necesario desarrollar aplicaciones que puedan ejecutar estas funciones. Para más información de JNI y sus capacidades se puede consultar el manual para programadores disponible en el sitio de Sun2.
Cabe señalar que este no es un tutorial introductorio a JNI o al API, por lo tanto se limitará a mencionar solo algunos conceptos necesarios. De forma rápida, comenzaremos con determinar el software que usaremos y de dónde obtenerlo, pero no nos detendremos a aprender el funcionamiento de ellos. Posteriormente agregaremos algunas variables de entorno y comenzaremos con la programación. Para esto, se presentan los programas y cómo compilarlos, sin embargo estará disponible el código fuente usado en el tutorial. Al finalizar el tutorial el lector deberá ser capaz de cargar una librería DLL en cualquier aplicación Java y usar los procedimientos de cualquier librería nativa.

2. ¿Cuándo usar JNI?
En algunas ocasiones, a algunos desarrolladores les tocará encontrarse en situaciones en las que una aplicación hecha completamente en Java no cubrirá todos los requerimientos para tal. Algunos ejemplos de estas situaciones pueden ser:

  • Cuando a pesar de querer escribir toda la aplicación en Java para permitir la compatibilidad entre plataformas, exiten características de la plataforma que son necesarias para la aplicación y no son soportadas por la librería estándar de Java. Esto es referido como dependencia de la plataforma.
  • Cuando ya se tiene una librería escrita en algún otro lenguaje y se desea hacerla accesible a nuestro código Java, por ejemplo, al tener que trabajar con código legacy. en estos casos las librerías se cargan dentro del mismo proceso de la apliación por medio de JNI, aunque existen otros mecanismos más eficientes que funcionan en procesos separados.
  • Si se quiere implementar porciones de código en un lenguaje de bajo nivel como ensamblador para disminuir el tiempo de procesamiento. Por ejemplo, en aplicaciones que necesiten renderizar gráficos 3D que requieren más tiempo de procesamiento, habrá que escribir una librería para gráficos en lenguaje ensamblador para tener un mejor rendimiento3.
  • En casos en los que quiera cargar una librería nativa en un proceso existente para evitar el costo de iniciar un nuevo proceso y cargar la librería en el mismo4.
  • También será oportuno usar JNI cuando se quiera utilizar algunas funcionalidades de un programa Java desde un código nativo.

Documento Invocar programas ASM dese Java paso a paso
Código fuente
El tutorial en Javahispano