[Revisión Libro] Java EE 7 Essentials, O’Reilly

cat

Datos:

  • Paginas: 362
  • Editorial: O’Reilly Media
  • Publicación: Agosto 2013
  • Idioma: Ingles
  • ISBN-10: 978-1-4493-7016-9
  • ISBN-13: 1-4493-7016-0

Objetivo:

Recibi este libro como parte del programa de partners de O’Reilly, esta vez debo decir que de forma egoista ya que  al recibirlo estaba iniciando un proyecto importante de mi empresa de consultoría, lo que sin embargo me lleva a escribir la revisión del libro 5 meses después de haberlo recibido y de haberlo usado en el mundo real de desarrollo de software.

Sobre el libro:
En la biblioteca de la empresa contamos con alrededor de 5 libros de Java EE 7 ya que nuestro stack de desarrollo esta compuesto basicamente por Java 8+JavaEE 7 para el trabajo de backend (sobre WildFly AS) y JavaScript+AngularJS para front-end.

Entre los 5 libros, el libro de Arun se gano el status de ser «EL LIBRO» y practicamente es al que todos los programadores acuden cuando tienen cualquier duda. Diferente de otros libros y como su nombre lo indica, en Java EE 7 Essentials el autor sorprende al brindar un libro versátil para referencia, asi como un libro introductorio (en el punto justo) a todo los tópicos de Java EE 7, en ese periodo de tiempo he retornado con frecuencia a los siguientes tópicos:

  • Servlets
  • RESTFul Web Services
  • SOAP Web Services
  • JSON Processing
  • Enterprise Java Beans
  • Context and Dependency Injection
  • Bean Validation
  • Java Transactions
  • Java Persistence

A pesar de sugerir Glassfish como application server, el libro es bastante cauteloso en cubrir únicamente ejemplos de las APIs estandarizadas, lo que consecuentemente nos permite usarlo sin problema en nuestro dia a dia con WildFly. Debo destacar también que al no estar escrito como un tutorial, el libro cuenta con la suficiente independencia entre capítulos para consultar un tópico.

Un punto negativo que he encontrado en el libro es que la parte de WebSockets es bastante pequeña en comparación a todos los otros tópicos, lo que sin embargo no debe considerarse como algo significativo para descartar el libro.

Para los que buscan un buen libro de Java EE 7, sea para referencia o introductorio, deberían consultar el libro de Aurun antes de considerar cualquier otra opción, asi que en resumen:

 

Cosas resaltables:

  • El libro encuentra el balance perfecto y simplifica los tópicos del Java EE Tutorial
  • Cubre solo APIs standard lo que permite usarlo con cualquier servidor compatible con Java EE 7
  • TODOS los ejemplos fueron funcionales sobre Wildfly AS (aka JBoss upstream)

Cosas negativas:

 

Curso gratuito de Java 8 (Streams y Lambdas)

java-lambda-expression

Java 8 es sin duda uno de los mayores cambios en el lenguaje, tal vez solo comparable a la introducción de AOP via anotaciones en Java 5.

Considerando que la JDK 8 fue lanzada hace casi un año, mi opinión es que la programación funcional en Java llega a ser considerada esotérica tanto por viejos como nuevos programadores. Al parecer Oracle piensa lo mismo, y para desmitificar la programación funcional en Java han creado un MOOC gratuito.

El curso iniciara a partir del dia 14 de julio incluyendo contenidos como:

  1. Lambas en problemas del dia a dia
  2. Convertir clases anonimas en expresiones Lambda
  3. Aplicar la API de Streams para resolver problemas de ordenamiento, primero y ultimo, reducción de duplicados
  4. Determinar cuando conviene o no aplicar Lambdas
  5. Uso de collectors
  6. Mejoras de rendimiento con streams paralelos
  7. Debug de expresiones Lambda

Para participar basta con inscribirse en la Oracle Learning Library, y saber ingles :).

10 datos curiosos por los 20 años de Java | #Java20

Java_20yr

El mundo del Software esta de fiesta, este 23 de mayo sera el cumpleaños del (de acuerdo a varios rankings) lenguaje de programación número 1 del mundo.

Conocí Java hace 9 años durante mi segundo año de Universidad y para conmemorar este cumpleaños tan significativo, dejo aca 10 (de 20) datos curiosos para nuevos y no tan nuevos, haciendo mi mejor esfuerzo para relatar el estado actual de la plataforma.

1. ¿Que es Java?

100px-Java_logo_and_wordmark.svgJava es un nombre genérico que se suele utilizar equivalentemente para designar a (1) un lenguaje de programación y (2) una maquina virtual de ejecución de código que soporta varios lenguajes de programación.

Lanzado el 23 de mayo de 1995 podemos encontrarlo en servidores, estaciones de trabajo, reproductores BluRay, dispositivos embarcados y en menor medida en dumbphones.

2. Los que confían en Java

WIN-500XSPX-8_500

Algunos de los usuarios más famosos de Java:

3. El dia que Java se hizo libre

duke_evolution

Aunque ahora se da por sentado que cualquier programa debe ser multiplataforma, en sus inicios Java nadaba contra corriente teniendo como caballo de batalla la importancia de no ser presa de un único sistema operativo, lo que aumentó su popularidad.

No entanto, la plataforma por si sola no fue libre hasta el año 2006, habiéndose intentado sin mucho exito crear implementaciones libres para escapar de lo que se conocía como la trampa de Java.

4. JCP y la independencia de proveedor

java.gif

Adicional a la independencia de sistema operativo, Java ofrece independencia de proveedor. Para esto el JCP (conformado por empresas y grupos de usuarios) define el futuro de la plataforma, creando/adoptando estándares, y dando la libertad a que exista más de un proveedor, siendo los más famosos Oracle, IBM y Red hat.

5. Las maquinas virtuales

DukeVitru

Al ser independiente de proveedor, no existe una sino varias maquinas virtuales de Java, de las cuales se consideran como oficiales aquellas que cumplen con el TCK de Java. Entre estas puedo mencionar:

6. Las «plataformas Java»

java-2012-conference-keynote-java-strategy-roadmap-weblogic-glassfish-duko-vukmanovi-11-638

Al ser un lenguaje universal, Java se subdivide en varias plataformas básicas, ofreciendo bibliotecas y características del lenguaje dependiendo de la necesidad, siendo estas:

  • Java SE (escritorio, applets)
  • Java EE (aplicaciones Web, enterprise)
  • Java ME (dispositivos embarcados, blu ray players, dumbphones)

7. JDK, JRE y Server JRE

jvm-jre-jdk

Para utilizar Java, existen actualmente 3 «distribuciones básicas»:

  • Java Developer Kit (JDK), una distribución para programadores y despliegue de aplicaciones de servidor, incluye compiladores, documentación y ejemplos.
  • Java Runtime Environment (JRE), una distribución para usuarios finales que contiene lo minimo para ejecutar programas Java.
  • Server JRE, una distribución pensada para despliegues en servidor, incluye compiladores, documentación y elimina ejemplos y el plugin de applets Web.

8. Los otros lenguajes

1630108699-2

A pesar de tener fama de ser una plataforma lenta, lo cierto es que desde hace tiempo Java ofrece uno de los entornos de ejecución de aplicaciones más rápidos del planeta.

Por lo anterior, la JVM se ha popularizado por si sola habiendo distintos interesados en tener lenguajes de programación alternativos, funcionales, dinámicos y frescos. Entre algunos notables me gustaría mencionar:

9. Los frameworks/plataformas de todos los tiempos

1957730

Java lleva bastantes años en el mercado, por tal motivo el ecosistema de bibliotecas y frameworks ha crecido hasta el infinito, entre los más tradicionales y que probablemente se topa cualquier programador en producción están:

Frameworks/plataformas enterprise:

Frameworks/plataformas web

10. Los nuevos frameworks/plataformas

imperative-reactive

Y como todo evoluciona, estos probablemente sean junto a Spring y Java EE los frameworks/plataformas que veremos en el horizonte Java de aca a 5 años, nótese la tendencia hacia aplicaciones reactivas :).

10.1. El dia que Hitler se entero que Oracle compró Sun Microsystems

Para cerrar la primer parte, coloco el video del evento que más ha marcado a Java en los ultimos años, la compra de Sun Microsystems.

En esto ultimo puedo decir que sorprendentemente Oracle lo ha hecho mejor de lo que se esperaba, y me hubiera gustado el mismo rumbo para OpenOffice y OpenSolaris

[QuickTip] Generar un parche individual a partir de dos commits de Git

git

Recientemente tuve la necesidad de crear un parche a partir de algunos cambios realizados a una aplicación. El «reto» era que únicamente tenia la ultima versión y no tenia voluntad de descargar la versión anterior para usar diff . . . con lo cual conoci git-diff.

Como su nombre lo indica git-diff es una integración entre el clasico diff para git, con lo que podemos hacer un diff (y consecuentemente un parche) a partir de dos commits, pudiendo generar un diff total (un diff para todo el commit) o un diff parcial (para uno o varios archivos).

Identificar las revisiones

Lo primero que debemos de hacer es identificar las revisiones,  y para esto podemos utilizar git-log, recordando que cada commit puede ser identificado por los primeros 7 caracteres de la suma SHA-1

Por ejemplo con el comando:

1
git log --reverse

Obtendríamos una salida similar a la siguiente (en orden reverso para ver los ultimos commits):

log

De aca se logra identificar que las revisiones que nos interesan son  908f798 y 0c39bec.

Crear el parche para un archivo

Una vez identificadas las revisiones basta ejecutar git diff sobre nuestro archivo y llevar la salida hacia un archivo nuevo. Para esto la sintaxis a usar con git-diff es:

git diff  [revision1] [revision2] — [archivo] > [parche]

Por ejemplo,  para generar un parche para el archivo app.nabconfig.js a partir de las dos revisiones mostradas, ejecutamos:

1
git diff 908f798 0c39bec -- Folder/app.nabconfig.js > branding.patch

La salida debiera ser similar a la siguiente:

patch

 

Java vs .NET en 2015 y mi adiós a la JVM

dukeTuxJavaOne2003TShirtEl titulo que ilustra esta entrada estaba pensado para una publicación del 1ero. de Abril, sin embargo . . . no es una broma :).

Recientemente me he involucrado en un proyecto utilizando Microsoft .NET, plataforma que hasta hace poco he driblado con maestría ya que Microsoft siempre ha sido enemigo explicito del Software Libre (o del Open Source, nuevo termino favorito de este blog).

Como bien dijera Mercedes Sosa «cambia, todo cambia» y a finales del 2014 Microsoft abrió el código de .NET, con lo cual por fin (desde mi punto de vista) vale la pena dedicarle alguna linea en este blog.

Diferente de Java y los lenguajes de la JVM, mis experiencias previas con .NET han sido mayoritariamente en el ámbito académico (como estudiante y profesor) además de trabajos a nivel comercial con .NET Micro Framework (aka .NET para ARM/Windows CE), por lo que este post fue escrito como «JVM Developer experimentando .NET para desarrollo web luego de 3 años». Así, condenso en este post algunas de mis impresiones, sorpresas y decepciones con la plataforma luego de varias semanas de usarla a nivel comercial.

NuGet (sorpresa agradable)

Con la creación de CodePlex y a pesar de los malos augurios, Microsoft ha logrado construir un ecosistema alrededor de su plataforma, cosa que Delphi no logro ni en sus sueños más salvajes.

Para muchos programadores de otras plataformas no suena muy coherente crear cosas para una plataforma cerrada (yo incluido), sin embargo NuGet se ha nutrido de bastante código libre incluso antes de la liberación de .NET y hoy por hoy es un administrador de dependencias interesante.

La sintaxis de dependencias para NuGet es bastante más simple que los POM de Maven y se asemeja más a los archivos usados por NPM (conceptualmente pero no sintacticamente), además de esto Visual Studio incluye «Package Manager» para un abordaje totalmente imperativo al descargar dependencias.

Hay que tomar en cuenta que Maven ademas de ser un gestor de dependencias es un Task Runner y que Graddle ha ganado popularidad en los ultimos años. Uno de sus puntos negativos es que (y a diferencia de Maven) no se pueden mantener dependencias de un paquete en diferentes versiones y  diferentes ramas (por ejemplo tener en una rama de desarrollo Entity Framework 5 y en otra Entity Framework 6), intentarlo solo lleva a problemas de compilación por dependencias nativas y proyectos que van quedando sucios..

Como anecdota de NuGet uno de nuestros programadores más jóvenes no creía que antes la gente pagaba (y pagaba caro) por los discos de la documentación de .NET y bibliotecas auxiliares.

Licencia verdaderamente libre (lo más brutal de .NET)

Cuando liberaron .NET sentí literalmente que el infierno se congelo, y fue un orgasmo darme cuenta que la licencia utilizada para esto no es otra sino la altamente liberal MIT. Esto contrasta con la menos liberal GPL utilizada por Java. La verdad hay que decirla y en este ámbito (y a pesar de liberar solo una parte) la liberación de .NET ha sido su «característica más brutal«.

Visual Studio 2013 (Meh. . .)

Diferente de los Java IDEs, por excelencia en .NET solo hay dos IDE: MonoDevelop y Visual Studio, siendo que el primero  esta a bastantes años del segundo.

Junto con la liberación de .NET Microsoft ofrece Visual Studio Community que basicamente es la version Enterprise pero que solo puede ser usado por equipos de 5 desarrolladores. Parecería una comparación injusta pero viniendo de Eclipse y Netbeans, Visual Studio es bastante insípido y afirmo sin pena que le faltan las siguientes cosas:

  • Un buen administrador Git, el administrador actual parece un aborto entre Git y TFS. . . como resultado conocí Source Tree.
  • Un mejor editor de código, ReSharper cubre esta característica muy bien y en el peor de los casos las Productivity Power Tools cubren algunas de sus falencias.
  • Lo que más odio de Visual Studio. En la configuración padrón de Visual Studio hay que detener el servidor IIS para escribir de nuevo código!!! y al usar un navegador externo, el mismo abrirá una pestaña nueva por cada ejecución, toda una pesadilla. Afortunadamente esto si se puede deshabilitar..

Lastimosamente Visual Studio no es libre, por tanto sus problemas no deberían ser abordados por la comunidad.

Programación funcional y LINQ (sorpresa agradable)

La programación funcional es ciudadano de primera clase en .NET ya que C# lo soporta desde antes que Java. Esto se nota especialmente en LINQ, cuando las consultas son pequeñas y directas es más coherente escribir una consulta de datos utilizando expresiones lambda y se siente más Orientado a Objetos (recordando que la Programación Funcional es ortogonal a la Orientada a Objetos).

jOOq también ya se dio cuenta de esto y disponibiliza una versión con soporte para expresiones Lambda, sin embargo aun es muy joven como para hacer una comparación justa.

Frameworks/Bibliotecas (Meh. . .)

.NET se monto en estos últimos años al tren de clientes ricos en html 5, y al igual que los WebJars, en NuGet se pueden encontrar varios proyectos como jquery, angular, react, requirejs con lo cual cubren considerablemente bien esta parte (aunque generan dependencia donde no necesariamente tiene que haberla).

En la parte backend, en NuGet se encuentran cosas interesantes, y entre las bibliotecas que utilizo actualmente tengo las siguientes opiniones:

AutoMapper

Por limitantes del proyecto, algunas partes se cubren con un patrón DTO (sucio pero funcional a mi parecer) Automapper cubre muy bien su objetivo y los mapeos de DTO a entidad son bastante rápidos (de escribir y ejecutar) utilizando expresiones Lambda, es por mucho mi dependencia favorita.

Unity

Diferente de Java, en la oficina creemos que «.NET asume que eres tonto» y la inyección de dependencias es opcional en comparación a Java Enterprise Edition o al mismo Spring.

Sin embargo, para generar proyectos «testeables» y código con cohesión baja, Unity es obligatorio y funciona bien. Solo que requiere una etapa de configuración adicional que no existe en frameworks de tipo «convention over configuration».

Entity Framework

Este ha sido tal vez mi mayor disgusto, Entity Framework se vuelve difícil a menos que se tenga claro el abordaje que puede ser «Code First» o «Database First». JPA es más simple en este sentido o al menos más liberal.

Sin embargo una frase que hará sentido a desarrolladores Java y que resume mi disgusto es que:

«Entity Framework no tiene merge de grafos»

De nuevo (y más correcto)

«Entity Framework no tiene merge de grafos conformados por entidades desconectadas»

Hay un WorkItem en CodePlex acerca de esto planeado junto con la implantación del capitalismo en Corea del Norte. Sin embargo es un atributo imprescindible al crear aplicaciones HTML 5, es inaudito que no se pueda enviar un POST con un grafo padre->hijo completo a una aplicación Stateless (esencial para microservicios), en su modo de funcionamiento normal el desarrollador debe verificar manualmente los cambios en los hijos, es demasiado código.

De acuerdo al mismo item NHibernate cubre bien esta parte, y utilizar Entity Framework en este contexto fue un disparo en el pie que me llevo de vuelta a los inicios de los 2000 (8) If you wanna be my lover (8). Eventualmente solucioné parcialmente esta falencia con GraphDiff.

Mi recomendación es simplemente NO utilizar Entity Framework si la aplicación es un cliente HTML 5 que enviara grafos con padres e hijos (tan común en clientes HTML 5) y si no me creen basta verificar el WorkItem en CodePlex.

Conclusiones

En general el utilizar .NET ha sido una experiencia si no agradable, al menos enriquecedora que me da más elementos/argumentos a la hora de ofrecer soluciones. Espero que Java no tarde demasiado en adoptar Lambdas en JPA, y claro dificilmente dejare la JVM esto si era parte del titulo del 1 de Abril :).

Un efecto secundario de usar .NET es que hay que usar Windows (mi sistema operativo #1 para juegos . . . que considero funcional solo para eso). Siendo asi estas semanas he extrañado:

Cosas que me han gustado de estas semanas

  • El ecualizador de AIMP;
  • SourceTree;
  • Que en el 2015 casi todas las apps que uso sean multiplataforma -e.g. Firefox, Atom, Hexchat, Java-.

Charla AngularJS y JavaEE en Guatejug

El codigo fuente de la presentación se encuentra disponible en: https://github.com/tuxtor/cfp-angujarjs-demo

Y la presentación directo en Slideshare:

Este jueves 05 de marzo en las Instalaciones del Centro Tics INTECAP estare colaborando en las reuniones mensuales de GuateJUG con una charla sobre el uso de AngularJS junto con Java EE 7. En resumen la charla incluira las generalidades de JAX-RS y creación de APIs REST para su uso con AngularJS, ademas de algunas experiencias buenas y malas que he tenido utilizando ambas herramientas desde el punto de vista de un Java Developer tradicional.

Espero verlos por ahi :).

afiche

Acerca del Software Libre, evoluciones y el sindrome de Stallman

GNU__s_Not_Usable_by_antignu

Durante mi lectura dominical encontré en PSL un articulo bastante interesante que describe mi actual apatía por las dimensiones políticas y sociales del Software Libre: «el sindrome de Stallman» (original en portugués).

Ya que me considero un alumno de la escuela cínica, listo abajo los síntomas del síndrome en libre traducción:

  • Repúdio visceral al nombre de Stallman;
  • Asociación de los nombres GNU, FSF, Stallman o GPL al xiitismo como sinónimo de radicalismo inconsecuente;
  • Convicción de que el Software Libre debe dar dinero de alguna forma, pues no hay almuerzo gratis (joder una cita de Mises en mi blog);
  • Sentir, que entender y practicar los principios filosóficos del Software Libre tiene connotaciones religiosas;
  • Certeza de que la libertad también es «libertad de escoger», inclusive usar Software Privativo;
  • Incredulidad ante la idea de cambiar el mundo, al final de cuentas el mundo es capitalista y nada lo va a cambiar;
  • Escalofríos siempre que alguien cita que Open Source y Software Libre son cosas distintas;
  • Convicción de que esa idea de GNU y Software Libre es cosa de comunistas;
  • Discordar con vehemencia que el Software Libre es un movimiento social y político.

Aunque estoy lo bastante cuerdo como para considerar el repudio a RMS como algo tonto, me pareció un buen ejercicio intelectual preguntarme ¿como es que nace esta apatía?, y encontré algunas de las siguientes razones:

  • La humanidad: Las dimensiones sociales y políticas a diferencia de la tecnológica involucran humanos no deterministas, con alta probabilidad de incoherencia. Una de las razones para desencantarse de un movimiento es ver el «haz lo que yo digo, no lo que yo hago«, te da la sensación que estas apoyando una fantasía colectiva, especialmente cuando luchas codo a codo con un GNUista/purista y descubres que tiene una consola con juegos propietarios en su sala.
  • Dimensiones de la libertad: Una vez lees la argumentación de BSD acerca de porque deberías usar licencias BSD en lugar de GPL realmente tienes otra óptica de como funciona el mundo de las licencias. Y es muy probable que las prefieras si te interesa más la salud del código en lugar de preocuparte por bombas de tiempo legales y «restricciones para proteger la libertad».
  • Usabilidad: Como ilustra la imagen de esta entrada, a veces el camino más rápido para desilusionarte es no fijarte bien al comprar una PC y que tengas que prescindir de distribuciones realmente libres. Esto claro es más culpa de los fabricantes y en todos estos años solo he conocido en vivo a dos usuarios de este tipo de distros: RMS y un amigo que luego convencí de migrar a una distro usable porque el pobre hombre no podía ni abrir sus .mp3.
  • Juegos de Video: Tener una afición que no se de bien con el movimiento GNU, por ejemplo jugar en Steam.

Y es acá donde nace mi mayor admiración por RMS, la coherencia. El hombre no da pie a la relativización eliminando cualquier posibilidad de ambigüedad e indefinición, porque relativizando BP tiró relativamente poca cantidad de petroleo en el golfo de México y nuestro ex-presidente más famoso robó relativamente poco dinero y por tanto hay que hacerle una estatua (no, no es broma, en mi país la gente le hace estatuas a los que «roban poco»).

Por ultimo el articulo también menciona la cura:

  • Asumase, mírese a si mismo y realmente tenga certeza que quiere un mundo mejor;
  • Separe a Stallman como persona del contenido de sus ideas;
  • Entienda de una vez por todas que no hay concesiones plausibles con el Software Libre. Quien cede coadyuva y se mezcla con Software Privativo y OSI;
  • Tenga bien claro que Software Libre y Código Abierto son cosas diferentes. Mezclar solo refuerza el síndrome en usted y los demás;
  • Reconocer que usted fue quien cambio es fundamental;
  • Finalmente decida si va a volver a defender el Software Libre como el siempre ha sido o si va a asumir su cambio y pasar a defender otro concepto.

Con lo anterior creo que hace tiempo defiendo al Open Source y como menciona el autor, una vez hecho el tratamiento la vida es más placentera y honesta. Aun conservo mi admiración por gente que realmente lleva al pie de la letra el manifesto GNU, pero para mi tiene más sentido declararse defensor del Open Source a tener una consola de Iwata y juegos de Miyamoto en la sala, un repo propietario, flash player, firmware en el kernel y golpearse el pecho porque otros promueven el FLOSS de forma menos purista.

Java One Latinoamerica 2015

DukeSaltimbanqueSmall.png

¡JavaOne Latino América estara de regreso en São Paulo, Brasil!

La conferencia premium de Java se llevara a cabo los dias 23, 24 y 25 de Junio junto con Oracle World Latinoamerica y la llamada de trabajos ya se encuentra abierta. Como en anteriores ocasiones es la intención de la organización estructurar el contenido alrededor de contribuciones de la comunidad Java mundial.

Para los interesados en participar como asistentes o ponentes puedo garantizarles que São Paulo y Brasil en general son una experiencia única. Pueden ver más detalles el evento en los siguientes enlaces:

JavaOne Blog: https://blogs.oracle.com/javaone

JavaOne Web Site en Ingles:

JavaOne Web Site en Portugués:

 

Habilitar soporte SSL en WildFly AS 8

wildfly-logo

WildFly Application Server es el heredero del ya conocido JBoss AS Community, que entre otras cosas ha aprovechado el vació que dejó Glassfish luego de quedarse sin soporte comercial, siendo actualmente el #1 en servidores de aplicaciones Java.

Creando el certificado

Actualmente WildFly ofrece tres opciones para dar soporte a cifrado SSL, siendo estas:

  1. Certificados auto-firmados dentro de un Java Key Store (JKS).
  2. Un certificado auto-firmado común (OpenSSL, CAcert).
  3. Un certificado SSL firmado por una autoridad de emisión de certificados (certificados SSL reales).

Para propósitos de desarrollo suele ser conveniente alguna de las primeras dos opciones. Siendo así el primer paso es crear un Java Key Store utilizando keytool que esta incluido en los JDK. Es también recomendable (pero no obligatorio)  crearlo dentro del directorio de configuración de JBoss ($JBOSS_HOME/standalone/configuration):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ keytool -genkey -alias demo -keyalg RSA -sigalg MD5withRSA -keystore my.jks -storepass mypass -keypass mypass -validity 9999
 
What is your first and last name?
[Unknown]:  localhost
What is the name of your organizational unit?
[Unknown]:  nab
What is the name of your organization?
[Unknown]:  nab
What is the name of your City or Locality?
[Unknown]:  Guatemala
What is the name of your State or Province?
[Unknown]:  Guatemala
What is the two-letter country code for this unit?
[Unknown]:  GT
Is CN=localhost, OU=nabenik, O=nabenik, L=Guatemala, ST=Guatemala, C=GT correct?
[no]yes

Es importante conservar localhost en el campo «first and last name», de otra forma suelen darse inconvenientes con algunos navegadores web.

Creando un área de seguridad

Luego de crear el certificado es necesario crear un área de seguridad para Undertow (el servidor Web incluido en WildFly). Para esto, hay que localizar el archivo de configuración de WildFly ($JBOSS_HOME/standalone/configuration/standalone.xml), y agregar la siguiente configuración:

1
2
3
4
5
6
7
<security-realm name="UndertowRealm">
    <server-identities>
        <ssl>
            <keystore path="my.jks" relative-to="jboss.server.config.dir" keystore-password="mypass" alias="demo" key-password="mypass"/>
        </ssl>
    </server-identities>
</security-realm>

En el ejemplo la ruta del keystore es relativa a jboss.server.config.dir, debe notarse que keystore-password, key-password, y alias deben coincidir con la información usada al momento de usar el certificado. Luego de agregar la información, la sección security-realms debe verse así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<security-realms>
    <security-realm name="ManagementRealm">
        <authentication>
            <local default-user="$local" skip-group-loading="true"/>
            <properties path="mgmt-users.properties" relative-to="jboss.server.config.dir"/>
        </authentication>
        <authorization map-groups-to-roles="false">
            <properties path="mgmt-groups.properties" relative-to="jboss.server.config.dir"/>
        </authorization>
    </security-realm>
    <security-realm name="ApplicationRealm">
        <authentication>
            <local default-user="$local" allowed-users="*" skip-group-loading="true"/>
            <properties path="application-users.properties" relative-to="jboss.server.config.dir"/>
        </authentication>
        <authorization>
            <properties path="application-roles.properties" relative-to="jboss.server.config.dir"/>
        </authorization>
    </security-realm>
    <security-realm name="UndertowRealm">
        <server-identities>
            <ssl>
                <keystore path="my.jks" relative-to="jboss.server.config.dir" keystore-password="mypass" alias="demo" key-password="mypass"/>
            </ssl>
        </server-identities>
    </security-realm>
</security-realms>

Agregando un listener https

Por ultimo, debe crearse un listener https dentro de la declaración del subsistema Untertow, el cual debe verse de la siguiente forma:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<subsystem xmlns="urn:jboss:domain:undertow:1.2">
    <buffer-cache name="default"/>
    <server name="default-server">
        <http-listener name="default" socket-binding="http"/>
        <https-listener name="https" socket-binding="https" security-realm="UndertowRealm"/>
        <host name="default-host" alias="localhost">
            <location name="/" handler="welcome-content"/>
            <filter-ref name="server-header"/>
            <filter-ref name="x-powered-by-header"/>
        </host>
    </server>
    <servlet-container name="default">
        <jsp-config/>
        <websockets/>
    </servlet-container>
    <handlers>
        <file name="welcome-content" path="${jboss.home.dir}/welcome-content"/>
    </handlers>
    <filters>
        <response-header name="server-header" header-name="Server" header-value="WildFly/8"/>
        <response-header name="x-powered-by-header" header-name="X-Powered-By" header-value="Undertow/1"/>
    </filters>
</subsystem>

De nuevo, debe notarse que el security-realm coincide con el creado inicialmente.

Zulu JVM – Una distribución OpenJDK alternativa

Zulu-Duke

Luego de redactar el post anterior respecto al fin del camino para Java 7, noté que no había comentado ninguna alternativa libre/freetard/open source (el que más les guste), y también noté que el JDK libre que utilizo actualmente en mi sistema -IcedTea- aun no tiene disponible un JDK de nivel 8.

Fue así que decidí darle una ojeada a Zulu JVM, una JVM que había estado evitando básicamente por falta de tiempo y que ya tiene alrededor de un año en el mercado. Zulu es una compilación de OpenJDK proveida por Azul Systems, y que entre otras cosas ha tenido cierta notoriedad por ser la JVM elegida por Microsoft para despliegues en Azure.

Al igual que IcedTea, Zulu es una «distribución JVM» lo que significa que basa su código en el árbol de OpenJDK y agrega sus propias particularidades, entre estas puedo mencionar:

  • De momento solo es compatible con Windows y Linux
  • Se enfoca en despliegues de servidor (similar a la Server JRE)
  • Actualmente no incluye plugin para webstart -i.e. no sirve para ejecutar applets-
  • Es posible descargar JDKs nivel 6, 7 y 8
  • Cuenta con contratos comerciales de soporte si fueran necesarios y conserva el status 100% GPL de OpenJDK.

A diferencia de IcedTea que tiene objetivos más ambiciosos como soporte a ZeroVM+Shark, JamVM, CACAO y un plugin Web, Zulu provee una compilación relativamente limpia con un objetivo bastante definido que al basarse en la OpenJDK ofrece compatibilidad total con el Java TCK.

En mi pruebas fui capaz de programar durante 1 semana utilizando Eclipse y Wildfly sin mayores inconvenientes, además de esto en el terreno de escritorio Zulu es capaz de ejecutar un programa tan personalizado como Vuze.

Vuze Bittorrent Client _001

Puede ser una opción interesante para aquellos que requieran seguir con Java 7, especialmente en Windows ya que IcedTea esta bastante enfocado en Linux. Y por ultimo nunca esta de más comentar que estas son las ventajas de un ecosistema abierto de desarrollo, la independencia de proveedor :).