Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

la metaweb


Ensayos no destructivos en el ecosistema Java-Web, y algún off topic para desconectar ;-)

Montar el entorno de trabajo adecuado (1/2)

Comienza aquí este blog sobre desarrollo Web en Java. La idea es que se convierta en un lugar para explorar las últimas tecnologías y herramientas del ecosistema de desarrollo web alrededor de Java EE, y donde desmitificar el desarrollo sobre Java EE usando para ello los ejemplos adecuados.

Introducción

Pienso que los que estamos ahora dedicados al desarrollo web tenemos suerte. Si volvemos la vista sólo diez años atrás el escenario era bien distinto. Ahora disponemos de herramientas y estándares maduros que nos permiten centrarnos en el problema y librarnos de las pesadas tareas improductivas. Java EE ha tomado una buena velocidad de crucero y promete grandes cosas a medio y largo plazo. Ahora Java EE 7 está ya siendo usado en todos los nuevos proyectos. Por capas, JavaServer Faces 2.2.x ofrece estabilidad y consolida la versión 2 del estándar, complementado por PrimeFaces, y con compatibilidad con HTML5. La implementación de referencia de JSF es Mojarra. CDI aporta beans avanzados con inyección de dependencias normalizada y programación orientada a aspectos. Su estándar es Weld. EJB 3 ahora simplifica más aún la capa de negocio y permite por ejemplo empaquetar componentes en un WAR. JPA, escindida de EJB en Java EE 5, se consolida con la versión 2.1, con la implementación de referencia EclipseLink y la conocida Hibernate. Los servicios web se simplifican aún más con JAX-RS 2.0 y el nuevo soporte al formato de datos JSON. Y no puedo dejar de citar la nueva API para Websokets que nos abre el camino a la implementación en nuestras aplicaciones de pantallas que muestran información en tiempo real dentro del navegador.

Un panorama muy prometedor al que además hay que sumar por un lado la velocidad a la que aparecen y se mejoran las herramientas de desarrollo, con ejemplos como JRebel que evita los redeploys, XRebel para afinar el rendimiento del site, JBoss Tools con ayudas como el editor de HQL, Gradle como alternativa a Maven que evita el XML a favor del más flexible Groovy, etc, y por otro lado la gran actividad que actualmente existe en el JCP en la definición y mejora de las JRS para el futuro estándar Java EE 8, que estará listo probablemente para finales del año que viene, incluyendo por ejemplo MVC 1.0, una nueva tecnología de interfaz de usuario que complementa a JSF, estandarización de la seguridad con Java EE Security API 1.0 o procesamiento directo del contenido JSON con JSON Binding 1.0.

Para arrancar, en primer lugar, vamos a definir e instalar en nuestra máquina un entorno de trabajo adecuado, lo más parecido posible a lo que nos podamos encontrar hoy en una software factory sobre Java EE. Y a continuación montaremos una mini aplicación con capa de presentación, negocio y datos. Lo vamos a hacer partiendo de cero y sin ningún tipo de asistente, de modo que consigamos desmitificar la creación de una aplicación Java EE por capas y ganar así la confianza necesaria para seguir, en sucesivos Posts, experimentando con el amplio abanico de tecnologías y herramientas disponibles.

En el blog se utiliza una máquina con el sistema operativo Windows 8.1 para la realización de las tareas. La manera de hacer las cosas en otros sistemas operativos como OS X o Linux puede diferir, en estos casos una simple búsqueda en Google nos mostrará la manera de proceder.

Bueno manos a la obra. Como IDE elegimos el más habitual, Eclipse, que ya trae de serie Maven como gestor del ciclo de desarrollo. Como servidor JBoss y como base de datos de momento algo ligerito, Java DB, también conocido como Derby, que nos evitará la instalación de un servidor de base de datos para la primera versión de la aplicación.

Instalación de Java para desarrolladores

Lo primero será instalar el kit de desarrollo de Java, más conocido por JDK, que consiste básicamente por un lado en una máquina virtual, que ejecutará las aplicaciones, y por otro en un compilador que pasará nuestro código fuente a bytecode ejecutable para la maquina virtual.

Hay que saber que existen dos kits de desarrollo. El JDK, de la SE (Standard Edition) que es el que nos interesa, y el SDK de la EE (Enterprise Edition) que no nos interesa de momento ya que nos instala el servidor de referencia, Glassfish, junto con ejemplos.

Lo primero que hacemos, por precaución, es comprobar si tenemos ya instalado un JDK antiguo ejecutando lo siguiente desde una ventana de comandos:

forfiles /P c:\ /S /M javac.exe /C "cmd /c echo @path" 2>null

Al ejecutar el comando obtendremos una línea con un formato similar a C:...\Java\jdk1.8.0_31\bin\javac.exe por cada carpeta en la que exista un compilador de java. Si obtenemos más de una línea puede ser debido a que existan aplicaciones de terceros que instalaron su propio JDK. No debemos tocar esos JDK. Lo ideal es tener un único JDK de usuario (propio, no de terceros) instalado, que tendrá su propio JRE privado, junto a un único JRE pública (fuera del JDK). En Windows no existe un mecanismo de actualización automática para el JDK así que tendremos que gestionar nosotros mismos las actualizaciones, desinstalando previamente a través de Panel de Control > Programas y características el o los JDKs antiguos. En los sistemas operativos Linux y OS X sí existen procedimientos de actualización automáticos, consultar en Internet para obtener más información.

En la lista de aplicaciones instaladas no aparecen de forma explícita los JDKs de terceros. Un JDK de tercero se identifica porque se encuentra en la carpeta de la aplicación que lo instaló y no debemos manipularlo en ningún caso.

En la siguiente figura podemos ver un ejemplo de una máquina en la que existen tres JDKs y un JRE instalados siendo lo ideal dejar un único JDK, desistalando el resto.

prac001 fig004.png

Para instalar la última versión de JDK nos vamos a la página de descarga de Oracle y pulsamos el botón con la leyenda Java.

prac001 fig002.png

El botón que aparece a la derecha del indicado, con la leyenda NetBeans baja también la última versión del JDK pero además se trae NetBeans. NetBeans es un IDE, una alternativa a Eclipse. Nosotros usaremos Eclipse de modo que no optamos por esta opción. Más adelante podéis instalar Netbeans desde aquí, yo os invito a que lo hagáis porque proporciona un entorno de desarrollo con muchas ayudas y está soportado por Oracle, que también ofrece otro IDE, JDeveloper, éste más orientado a grandes proyectos donde se elijan las directrices de Oracle ADF para el desarrollo de aplicaciones.

Aceptamos la licencia para que se habiliten los links de bajada y si queremos bajar los ejemplos de java, muy aconsejable, hacemos lo mismo más abajo donde aparecen el paquete con las demos.

prac001 fig003.png
Siempre que sea posible instalad el sistema operativo (menos el teclado para no perder la eñe, acentos, etc) y vuestras herrmientas de desarrollo en el idioma Inglés. Vuestras consultas en Google devolverán muchos más resultados cuando busquemos por un mensaje de error o por alguna opción de menú en Inglés. Y creedme, cuando se está desarrollando un proyecto se tira mucho de Google.

Para instalar nuestro JDK hacemos doble click sobre el ejecutable descargado. En la pantalla inicial del wizard pulsamos Next, en la siguiente pantalla aceptamos los valores por defecto. La instalación del JDK comienza. A continuación aparece una ventana y se nos pregunta de nuevo por otra carpeta de instalación, se trata de la instalación del JRE público. Aceptamos el valor por defecto. Finalmente pulsamos Close.

¿Qué hemos instalado? Por un lado el JDK, necesario para desarrollar aplicaciones en Java, y que además contiene un JRE para uso privado de éste, y por otro lado un JRE público del que tirarán las aplicaciones que necesiten ejecutar una aplicación Java como por ejemplo nuestro navegador. El JRE público sí se actualiza de forma automática, y es gestionable desde Panel de Control > Java como vemos en la siguiente figura:

prac001 fig004.png

Si entramos en Panel de Control > Programas y características podremos ver tanto el JRE público como el JDK.

prac001 fig005.png

Para terminar con la instalación del JDK añadimos la variable de sistema JAVA_HOME con el valor de la ruta donde hemos instalado el JDK y a la variable PATH le añadimos al principio la cadena %JAVA_HOME%\bin;:

Nombre Valor

JAVA_HOME

C:\Program Files\Java\jdk1.8.0_40

PATH

%JAVA_HOME%\bin;…​

Para ir a una carpeta en la consola de comandos puedo usar el carácter comodín asterisco * y así ahorrarme pulsaciones y tiempo. Por ejemplo, si quiero ir a la carpeta esta-carpeta-001, escribo cd est*, y si existiera otra carpeta con el nombre estados entonces tendría que escribir cd esta-*. Del mismo modo puedo escribir sólo las terminaciones de las carpetas, por ejemplo con cd *001 también entraríamos en esta-carpeta-001.

Instalación de Maven

Seguimos! Vamos ahora con la instalación de Maven. En resumen Maven es un gestor del desarrollo de un proyecto. Hace muchas cosas, entre ellas: Interviene cada vez que realizo una modificación en mi programa: Compila tirando de las dependencias necesarias, empaqueta y despliega el proyecto en el entorno que le indiquemos, también pasa automáticamente las pruebas unitarias y las de integración que yo haya definido. Por otro lado gestiona las distintas distribuciones de mi proyecto. Y hace muchas cosas más y otras que están por venir ya que es extensible. Maven es tanto más útil cuanto mayor es el tamaño del proyecto ya que es en proyectos grandes y multimódulo cuando las dependencias y demás aspectos empiezan a complicarse.

Antes de nada para no liarnos tenemos que distinguir bien estos tres elementos:

  • La aplicación Maven en sí, el ejecutable, que no es más que un fichero .zip que se instala descomprimiéndolo en el disco duro.

  • El repositorio local, localizado en nuestra propia máquina, que es donde se guardan los snapshots o versiones de desarrollo de mi aplicación en forma de fichero, por ejemplo un .war si se trata de una aplicación web, y además donde se copian las librerías de terceros de las que mi webapp depende, actuando como caché de los repositorios remotos.

  • El plugin de Maven para Eclipse, que me permite usar Maven desde Eclipse, que será en general lo que hagamos en el día a día. Lo veremos en la próxima entrada del Blog.

Realmente no es necesario instalar Maven para el desarrollo desde Eclipse ya que éste ya lo trae de serie (Embedded Maven), sin embargo lo instalaremos ahora aparte (Local Maven) para poder usarlo fuera de Eclipse cuando lo necesitemos. Puede ser también que necesitemos en nuestro proyecto la versión más reciente de Maven en Eclipse, que en general no es la embebida, y que por tanto tengamos que instalarla y decirle a Eclipse que use mi Maven local y no el embebido, aunque esto es poco común.

Si ya teníamos una instalación de Maven en nuestra máquina no hay problema, podemos instalarlo ahora en otra carpeta. Aunque como en el caso del JDK es mejor siempre tener una única instalación salvo que necesitemos más de una versión porque estemos trabajando con un proyecto antiguo y otro más reciente por ejemplo. En este caso para desinstalar sólo tendremos que borrar la carpeta de instalación y editar varias variables de sistema. Vamos entonces a la URL de descarga y nos bajamos el archivo Maven 3.3.1 (Binary tar.gz) si usamos Linux o el Maven 3.3.1 (Binary zip) si usamos Windows (la versión puede diferir). Ok, descomprimimos el zip en una carpeta, por ejemplo en la ruta C:\Program Files\Apache Software Foundation\.

Para descomprimir puedes usar la aplicación gratuita 7zip en este enlace. Y para linux tenemos esta otra.

Completamos la instalación añadiendo tres variables de sistema y editando la variable PATH para poder llamar a Maven desde cualquier carpeta de proyecto:

Nombre Valor

M2_HOME

C:\Program Files\Apache Software Foundation\apache-maven-3.3.1

M2

%M2_HOME%\bin

PATH

%M2%;%JAVA_HOME%\bin;…​

Comprobamos que la instalación es correcta. Abrimos una ventana de comando (botón de Inicio y escribir cmd en la caja de búsqueda). Verifico primero que las variables de sistema se han creado con el comando SET:

prac001 fig001.png

Y luego la instalación escribiendo mvn -version. Si obtenemos una salida por pantalla similar a la que se muestra es que todo ha ido bien.

prac001 fig006.png

Veamos un sencillo ejemplo de uso de Maven siguiendo el "ejercicio de cinco minutos" propuesto en su página oficial.

Es importante emplear un poco de nuestro tiempo ahora en entender los conceptos básicos de esta herramienta pues si bien al principio puede parecer confusa, después de una lectura de los recursos que os comento más adelante y siguiendo el ejemplo propuesto, nos damos cuenta de su gran potencial para simplificar nuestro trabajo.

Una vez en la dirección anterior nos vamos directamente al tercer apartado Creating a Project. Lo que vamos a hacer es crear un proyecto Hola mundo! sin escribir ni una sola línea de código. Es otra de las capacidades de Maven, nos permite, a partir de los llamados arquetipos, comenzar un nuevo proyecto a partir de una plantilla. Hay muchos arquetipos, creados por el equipo de Maven o por otras empresas. Nosotros mismos podemos también crear uno, de hecho las empresas crean arquetipos para disponer de puntos de partida óptimos para sus nuevos proyectos. Los arquetipos están en los repositorios, que son almacenes gestionados por Maven, donde también existen elementos de otra naturaleza como librerías, nuestros propios wars, etc. A todos estos elementos Maven los denomina artefactos. Un arquetipo es por tanto un artefacto. Bien, vamos con el ejercicio, abrimos una ventana de comandos, creamos una carpeta, por ejemplo c:\prueba-maven, y nos situamos dentro de ella. A continuación escribimos lo siguiente:

mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Si es la primera vez que ejecutamos Maven en nuestro ordenador el comando puede tardar un rato en terminar, es debido a que Maven necesita bajar desde un repositorio remoto los elementos necesarios para su ejecución. Analicemos rápidamente el comando:

mvn: Es el comando que invoca a Maven.

archetype:generate: Indica lo que queremos que haga Maven. En este caso le estamos diciendo que ejecute el goal generate del plugin archetype. Los plugins (de Maven, no confundir con los de Eclipse) son las unidades que contienen los goals, que representan lo que podemos pedir a Maven que haga por nosotros, en este caso generar un proyecto a partir de un arquetipo.

Maven puede ejecutar además de un goal, como en el caso del ejemplo, una phase. El ciclo de vida estándar de Maven se compone de varias fases ordenadas, cada fase tiene asociada la ejecución de varios goals de varios plugins. Existen valores por defecto pero todo es configurable como iremos viendo. El formato del comando sería diferente, sin el carácter :, por ejemplo mvn package ejecuta la fase de creación del fichero desplegable de un proyecto, y todas las fases anteriores. No es necesario entender todo esto ahora, los conceptos se afianzarán con las lecturas propuestas y el uso.
  • -DgroupId=com.mycompany.app -DartifactId=my-app: El resto del comando son parámetros que pasamos al goal. Los dos primeros parámetros son parte de las coordenadas del proyecto que vamos a crear. Todo proyecto Maven, tiene unas coordenadas, que lo identifican de forma unívoca y lo sitúan dentro de cualquier repositorio, como artefacto. Estas coordenadas son tres: Id de grupo, Id de artefacto y versión. En este caso como estamos creando el proyecto la versión es de forma implícita la 1.0. Añadir que estos valores son utilizados por Maven para, en el caso del Id de grupo, establecer la estructura de paquetes de las clases Java del proyecto y en el caso del Id de artefacto para establecer el nombre del artefacto.

  • -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false: El último parámetro simplemente hace que el comando se ejecute sin nuestra intervención. El primer parámetro es el más interesante ya que hace referencia al arquetipo o plantilla que queremos usar para generar nuestro nuevo proyecto. Recordemos que un arquetipo es un artefacto más y que todos los artefactos están en un repositorio.

Existen dos tipos de repositorio: Local y remoto. El local está en nuestro ordenador en general en la subcarpeta .m2\ de la carpeta de usuario. Es una caché de los diferentes repositorios remotos y también donde se guardarán las snapshots (versiones de desarrollo) de nuestros proyectos. El repositorio remoto es donde residen las releases (versiones de producción) de nuestros proyectos y todos los demás artefactos: plugins, dependencias, arquetipos, etc. Un repositorio remoto a su vez puede ser público o privado. El público permite a cualquier usuario acceder a su contenido, el más conocido es el repositorio central de Maven. El repositorio privado es el que probablemente tendrá nuestra empresa para almacenar las diferentes releases de los proyectos, las librerías estándar propias, etc. Se montan usando herramientas como Artifactory u otra equivalente.

Ejecutemos el comando y veamos qué ocurre. Se ha creado una carpeta con el nombre de nuestro nuevo proyecto, que contiene una estructura de carpetas según el estándar de Maven, la clase Java que genera la salida Hello world! y el fichero de proyecto de Maven pom.xml. Si lo abrimos con un editor de texto vemos que contiene las coordenadas del artefacto, el tipo de empaquetado, referencias a información adicional sobre el proyecto, y una sección para definir de qué artefactos depende. Tenemos un proyecto completo con la simple ejecución de un comando, no está mal. Es cierto que se trata de un proyecto sencillo pero sin mucho esfuerzo podremos montar un arquetipo tan complejo como queramos, que luego usaremos como punto de partida para nuestros proyectos.

Ahora toca generar la aplicación. Ejecutamos el comando mvn install, desde la carpeta del proyecto (donde está nuestro pom.xml) y como sabemos se ejecutarán entonces las fases install del ciclo de vida de construcción por defecto y todas las anteriores, lo que se traduce en la ejecución de una serie de goals de distintos plugins, que dan como resultado la distribución de nuestra aplicación en la carpeta target\ y en nuestro repositorio local, en la ruta C:\Users\Usuario\.m2\repository\com\mycompany\app\my-app\1.0-SNAPSHOT.

El último paso, ejecutar la aplicación para comprobar que nuestro primer proyecto Maven se ha generado como es debido. Nos vamos a la carpeta target\ y en la ventana de comandos escribimos el comando java -cp my-app-1.0-SNAPSHOT.jar com.mycompany.app.App para que la máquina virtual de nuestro JDK ejecute la aplicación Java. El resultado es el esperado Hello World!

prac001 fig008.png

Maven es una herramienta potente y con muchas posibilidades. Para sacar provecho de ella es importante tener claros los conceptos básicos y por suerte tenemos buena información en la página web oficial. Merece la pena echar un rato de lectura porque Maven está presente en la gran mayoría de proyectos con los que nos vamos a encontrar en la vida real.

Para tener una idea general y conocer dónde acudir cuando tengamos alguna duda en su uso será suficiente con leer el minitutorial, y dentro de éste mirar estos enlaces:

  1. Configuración de Maven: Ficheros de configuración, perfiles, repositorio propio.

  2. Arquetipos.

  3. Fichero POM: Super POM, POM mínimo, herencia, agregación y variables

  4. Estructura de directorios de proyecto.

  5. Introducción al concepto de repositorio.

  6. Ciclo de vida: Nociones sobre el ciclo de vida de construcción de un proyecto Maven. Añadir a una phase un goal y configurarlo.

El mayor valor de Maven a mi parecer es haber sabido reunir un conjunto completo de estándares de gestión del desarrollo de un proyecto, desde las pruebas unitarias hasta el despliegue en producción pasando por los tests de integración en una única herramienta de código abierto y extensible. Es el motivo de que haya sustituido a Ant+Ivy y de que conviva con un único competidor, más joven, Gradle, una opción muy válida en proyectos nuevos y que ofrece un muy buen compromiso entre flexibilidad y simplicidad al sustituir el XML por el lenguaje Groovy.

Y hasta aquí la primera entrada del Blog! En la siguiente terminaremos de montar y configurar nuestro banco de trabajo Java EE y lo dejaremos listo para crear la miniaplicación sobre la que recorrer las distintas tecnologías de la Web.


About the author

La metaweb


Discussions

comments powered by Disqus