martes, 6 de julio de 2010

Instalación de Liferay en un servidor GlassFish v3 para producción

En un anterior post mencioné los Portales en Java, y la facilidad que nos da el utilizar una plataforma con muchas funcionalidades, y nosotros simplemente deberíamos hacer los componentes que faltan. Estos componentes se llaman Portlets.

Ahora mencionaré uno de los gestores de Portlets en Java que, según mi opinión, es bastante útil. Su nombre LIFERAY. Pero no hablaré de sus cualidades, ni todo lo que puede hacer.. eso ya lo hizo Pedro Edison en su blog :), y como no hay que amontonar la red con lo mismo, esta vez mostraré cómo instalar el LIFERAY desde cero. No desde la instalación de un .exe, sino desde un archivo .war y sobre GlassFish v3 usando MySQL como gestor de base de datos.

Esto no lo he inventado, sino lo tomé del tutorial mismo de Liferay... pero como está en inglés, y el lector promedio de este blog busca más información en castellano, quiero hacer un aporte a la comunidad con este post.


Recursos


Para esta tarea necesitamos lo siguiente:
  1. Sistema operativo, cualquiera compatible con Java. Aunque estos pasos funcionan en todos los sistemas operativos con Java SE 6, en este post lo orientaré más a Windows... porque el lector promedio de este blog busca más información en Windows... etc etc etc.
  2. JDK 6. El cual lo puedes descargar desde aquí: http://java.sun.com/javase/downloads/widget/jdk6.jsp
  3. GlassFish v3. Si no lo has instalado, aquí lo mostraremos de la manera más fácil. Puedes descargar la versión .zip desde aquí: http://download.java.net/glassfish/3.0.1/release/glassfish-3.0.1-ml.zip. Esta es la versión multilingual, es decir, nos aparecerá en castellano los textos para entendernos mejor.
  4. El .war de Liferay: http://downloads.sourceforge.net/lportal/liferay-portal-5.2.3.war
  5. Archivos adicionales para preconfigurar el Contenedor Web: http://downloads.sourceforge.net/lportal/liferay-portal-dependencies-5.2.3.zip
  6. MySQL instalado ya sea localmente o en otro host, pero que tengamos acceso a ese computador. Pude haber hecho con PostgreSQL, pero tengo un par de inconvenientes: me han bloqueado todo tipo de instalación en el computador de donde trabajo, y... conozco casi nada sobre PostgreSQL.. así que mis disculpas a los amigos del elefantito. Pero si sois curiosos, sabréis como acomodar esto.
    OJO: que sea el MySQL puro, no uno de esos que vienen enlatados con Apache + PHP + PHPMyAdmin. Ya hablaré de este paquetito *AMP en otro post, que para unos es un alivio, pero puede ser un dolor de cabeza si no se usa con prudencia. El MySQL se puede descargar desde aquí: http://dev.mysql.com/downloads/mysql/
  7. El JDBC de la base de datos que vamos a utilizar. Cómo estamos en MySQL, este se puede descargar desde aquí: http://dev.mysql.com/downloads/connector/j/ Si decides usar otro motor de base de datos, pues no te olvides de conseguir el JDBC correspondiente.
Hasta aquí es lo necesario para una instalación básica. Pero quiero compartir mi experiencia de esta instalación:
  1. Usar el JDK de Sun. Toda esta instalación funciona bien con OpenJDK sobre un Ubuntu, CentOS, etc... pero el Captcha para autenticación no funciona correctamente sobre OpenJDK, por tanto usar el JDK de Sun.
  2. Descargar el Xerces-J. La instalación descrita aquí funciona correctamente, pero cuando se agregan nuevos portlets, el Contenedor Web no es capaz de interpretar los archivos de despliegue de ellos. Para este ejemplo usaremos la versión 2.9.0: http://archive.apache.org/dist/xml/xerces-j/Xerces-J-bin.2.9.0.zip

Instalación y preconfiguración de GlassFish v3 

La instalación de GlassFish v3 es bastante simple, más aún si es un .zip como el que sugerí para descargar: Solo hay que descomprimirlo. Por ejemplo, lo descomprimiremos en la raíz de C: Y tendrá una estructura como esta.

A partir de este momento, cada vez que mencione %GLASSFISH_HOME% se entenderá al directorio del GlassFish que se descomprimió. Es decir c:\glassfishv3

Importante: Mucho se acostumbra crear una carpeta con el mismo nombre del archivo comprimido, lo cual es una práctica no recomendada aquí, ya que el comprimido ya tiene una carpeta. Si se hace eso, se tendría una carpeta llamada glassfishv3, y dentro otra vez glassfishv3, y ocasionará confusión. Por tanto, no usar la opción "crear una carpeta con el nombre del archivo .zip". Simplemente descomprimirlo directamente a la raíz de "C:". Ojo que ya lo advertí :P.

Ahora, extraemos el contenido del archivo liferay-portal-dependencies-5.2.3.zip en cualquier carpeta, luego tomamos los archivos .jar que se obtuvieron y los pondremos dentro de %GLASSFISH%\glassfish\domains\domain1\lib. En esta misma carpeta ponemos el .jar del JDBC de MySQL, y los archivos xercesImpl.jar y xml-apis.jar de Xerces



Después de esto, iniciamos el GlassFish v3...
%GLASSFISH_HOME%\bin\asadmin start-domain



... para continuar con el siguiente paso.

Debemos modificar las propiedades de la máquina virtual donde se ejecutará el Liferay. Para ello seleccionamos del menú de la izquierda: Configuration > JVM Settings.
Y cambiamos los valores de MaxPermSize y Xmx a los siguientes:

  • -XX:MaxPermSize=256m
  • -Xmx1024m

Clic en "Save". Detenemos el GlassFish, y lo volvemos a iniciar.
%GLASSFISH_HOME%\bin\asadmin stop-domain%GLASSFISH_HOME%\bin\asadmin start-domain

Preparación de la base de datos

El Liferay utiliza una base de datos por omisión llamada HSQLDB, pero podemos configurarlo para que funcione con cualquier otra base de datos. En este caso veremos con MySQL. En sí, se necesita crear una base de datos en MySQL, configurar un Pool de Conexiones, y ajustar un poco el .war para que utilice este Pool.

Sugerencia: Antes de hacer esto, recomiendo siempre crear un usuario que acceda a esta base de datos, y no usar el root para tal fin. ¿Cómo crear ese usuario?.
Desde una ventana del símbolo del sistema, ejecutar
mysql -u root -p
Con esto se ejecutará el cliente de MySQL con el usuario root y pedirá la contraseña. Bueno, le ponemos y nos mostrará el prompt mysql>.


Escribimos lo siguiente para crear la base de datos lportal:

create database lportal;

y luego escribimos lo siguiente para el usuario lportal que accederá a esa base de datos:

grant all on lportal.* to lportal@localhost identified by "lportal";




Más sobre los permisos en MySQL, aquí: http://dev.mysql.com/doc/refman/5.1/en/grant.html
Ahora sí, seguimos...

Configuración del pool de conexiones en GFv3 para Liferay

Entramos a la consola web de GFv3 (http://localhost:4848) y seleccionamos del árbol de la izquierda Resources > JDBC > Connections Pool



 Hacemos clic en el botón "New..." para crear una nuevo Pool de Conexiones. Escribimos:
  • Name: LiferayPool
  • Resource Type: javax.sql.ConnectionPoolDataSource
  • Database vendor: MySQL

 Clic en Next.
Ahora, se mostrarán todas las propiedades de la conexión a la base de datos. Activamos el primer check llamado Ping: Enabled. Esto nos permitirá verificar si la conexión fue correcta después de crear el pool de conexiones. Luego buscamos las siguientes propiedades, y ponemos los valores que se muestran a continuación:
  • URL:jdbc:mysql://localhost/lportal
  • User: lportal
  • Password: lportal
  • UseUnicode: true
  • CharacterEncoding:UTF-8
  • EmulateLocators: true

Hacemos clic en el botón "Save", y si todo está correcto, se creará sin problema.

Con esto solo hemos creado un Pool de Conexión, ahora necesitamos registrarlo en el JNDI del Servidor. Para ello, seleccionamos la opción Resources > JDBC > JDBC Resources


Hacemos clic en "New..." y escribimos los siguientes valores en los campos:
JNDI Name: jdbc/LiferayPool
Pool Name: LiferayPool


¡¡El nombre del recurso es importante!! Debe estar en mayúsculas y minúsculas.

Clic en OK y listo. Seguimos con el siguiente paso.


Despliegue del .war

Como comenté hace un momento, el .war de liferay está preparado para funcionar con una base de datos incrustada llamada HSQLDB. Lo que necesitamos es que se conecte a nuestro MySQL. Por algo hemos preparado el Pool de conexiones. Así que necesitamos editar un archivo llamado portal-ext.properties, adjuntarle el atributo:

jdbc.default.jndi.name=jdbc/LiferayPool 

... y luego ponerlo dentro del .war (en el directorio WEB-INF/classes dentro del .war) antes de desplegarlo.

Notar que el nombre del JNDI (jdbc/LiferayPool)  debe ser exacto cómo se configuró en GlassFish en el paso anterior.

Si te es complicado crear el archivo, aquí puedes descargarlo: http://java.net/downloads/apuntes/resources/liferay/portal-ext.properties

Y si te es complicado poner el .properties dentro del .war, aquí ya tengo un .war preparado (que es el que uso en las instalaciones de Liferay)
http://java.net/downloads/apuntes/resources/liferay/liferay-portal-5.2.3.war

Ahora sí, tomar mucho cuidado con lo siguiente que se va a explicar respecto al despliegue del .war

En la consola del GlassFish, ir a la opción "Applications" del menú izquierdo, y hacemos clic en el botón "Deploy...". En la opción "Location", seleccionamos el archivo .war que de liferay. Al hacer esto, se mostrarán más opciones que corresponden a la configuración del despliegue del .war.

En la casilla llamada "Context Root:" aparecerá el nombre del archivo .war. Borrar este nombre y poner el signo "/".


Ahora, clic en "OK".

Esto tomará un tiempo procesar. Aún cuando ya se haya mostrado el mensaje en GlassFish que fue desplegado correctamente, no necesariamente habrá terminado, porque estará configurando archivos, bibliotecas, creando las tablas de la base de datos, preparando otros recurso, etc etc etc. Así que en esta parte tener paciencia. Se puede revisar el log para ver en qué está. %GLASSFISH_HOME%\glassfish\domains\domain1\logs\server.log.

La Ruta del contexto (Context Root) es importante porque la aplicación se mostrará en la raiz del host, y varios componentes de la aplicación se ubicarán en la misma ubicación, como "/c" y "/widgets".

Ejecutando el Liferay

Después del despliegue, ya podemos verlo en funcionamiento abriendo la siguiente dirección: http://localhost:8080 Sin ruta de contexto, ya que (como acabo de mencionar) está en la raíz del host.


El usuario creado por omisión para administrar este Portal es test@liferay.com y su contraseña es test.

Conclusión

Y esto sería todo para tener en producción un Contenedor de Portlets sobre GlassFish v3. De por sí el GFv3 es pesado para manejar en desarrollo, más aún si se utiliza con Liferay, así que hay que considerarlo si se utiliza en un computador de desarrollo con pocos recursos (entiéndase, no usar Pentium D.. sino algo muy superior, ni menos con 2GB de RAM).

En un siguiente Post veremos (ahora sí) cómo configurar NetBeans 6.9 con un servidor liferay y haremos nuestro primer portlet.


Hasta el siguiente post!


25 comentarios:

  1. Hola, muy bueno el post tal como el anterior, te felicito por el trabajo. una duda que me surje es si yo puedo desarrollar mis portlets usando JSF por ejemplo en la parte de la vista del portlet...me explico?? Saludos!!!

    ResponderEliminar
  2. Hola Sebastian
    gracias.. sí, se puede usar JSF, Struts, SpringMVC, ICEfaces y cualquier framework como si fuera una aplicación web.. pero considerando que no es web entera, sino una parte de la web.

    Aquí hay unos portlets de ejemplo usando JSF http://tinyurl.com/24nokjx

    Veremos un ejemplo de esto en el siguiente post.
    saludos.

    ResponderEliminar
  3. Hola, es facinante toda la informacion que otorgas, y veo que eres todo un experto en Java, yo apenas comienzo a conocer Java, pero de otros lenguajes ya he trabajado Bases de Datos en Visual y algunos otros mas pero todo en estacion de trabajo unica, ahora me interesa crear una base de datos que se maneje desde internet. Java me puede ayudar en esto?
    Tienes algun manual que me guie como hacerlo o que me aconsejas para resolver mi necesidad?

    ResponderEliminar
  4. Excelente tutorial y te felicito por lo bien explicado que esta talve una ayuda para integrar portal-ext.properties a un war gracias

    ResponderEliminar
  5. @Anomino: Te doy un tip: un .war es un .zip con otra extensión :) (O sea, renombra el .war a .zip, abrelo con un manejador de archivos .zip, comprime el archivo .properties dentro de WEB-INF/classes y luego lo renombras el .zip a .war y listo.. eso fue lo que hice) Saludos!
    ------------------
    Para @Intel CUCSUR, aqui está la documentación de NetBeans para hacer aplicaciónes web con Java EE. http://netbeans.org/kb/trails/java-ee.html

    ResponderEliminar
  6. Muchas gracias por tu respuesta Diego.

    Me sirvio mucho

    ResponderEliminar
  7. Hola, una duda, porque solamente lo pude implementar con la version del glassfish que diste, descargue de la pagina oficial varios instaladores de la misma versión 3.0.1 y con ninguno me funciono, y cuando probe con el que inviaste, no hubieron inconvenientes

    ResponderEliminar
  8. Hola chicos!

    Una consultilla a un problema que tengo al intentar levantar el Glassfish ya que cuando hago el star-domain me sale el siguiente mensaje:

    Remote server does not listen for requests on [localhost:4848].
    Is the server up?
    Unables to get remote commands.

    Si alguien tiene idea de que sucede se lo agradeceria!!!

    ResponderEliminar
  9. Hola Chari

    veamos.. con qué versión de Glassfish te sucede esto, v2 o v3? y.. es después de haber instalado el Liferay ahí o antes?

    ResponderEliminar
  10. Excelentisimo tutorial, lo probe todo pero al final al darle localhost:8080 se queda cargando :(

    Otra cosiiita puedo implementar todo esto utilizando el servidor Tomcat?

    ResponderEliminar
  11. Corrijo: Si me corrio :)

    Igual espero la ayudita de como configurar esto con el Tomcat!

    ResponderEliminar
    Respuestas
    1. hola una pregunta a mi me queda en blanco el portal como hiciste para que te funcione

      Gracias

      Eliminar
  12. Esa version del War de Liferay es oficial o modificada

    ResponderEliminar
  13. Cordial saludo,

    Al momento de desplegar el .war me sale el seguiente error:

    Exception while loading the app : java.lang.Exception: java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: java.lang.IllegalArgumentException: java.lang.IllegalArgumentException: PWC1430: Unable to add listener of type: com.liferay.portal.kernel.servlet.PortletSessionListenerManager, because it does not implement any of the required ServletContextListener, ServletContextAttributeListener, ServletRequestListener, ServletRequestAttributeListener,...

    Me gustaría que me ayudaras

    ResponderEliminar
  14. Me ha parecido un gran tutorial, sin embargo cuando lo he terminado y he marcado para ver el portal no me sale nada...me sale en blanco...creo que no me he equivocado en nada. Si alguien me puede resolver el problema estaré agradecido. Saludos.

    ResponderEliminar
  15. Hola
    soy nuevo en esto del desarrollo de portlets ,me hacer el favor de ayudar con un ejemplo de portlets con icefaces para liferay algo sencillo que sirva para empezar

    muchas graceas

    ResponderEliminar
  16. Hola, Excelente tutotial.

    Realice la instalación de Liferay 5.2.3 sobre Glassfish 3.1, todo parace bien. Al levantar el portal aparece la página de inicio, pero el Portlet de Login se muestra en blanco o vacío.
    Al revizar el server.log me encuentro con el siguiente error:
    [#|2011-04-19T13:40:12.165-0430|SEVERE|glassfish3.1|org.apache.jasper.compiler.Compiler|_ThreadID=17;_ThreadName=Thread-1;|Error compiling file: /usr/developer/servidores/glassfish3/glassfish/domains/domain1/generated/jsp/liferay-portal-5.2.3/org/apache/jsp/html/portlet/login/login_jsp.java|#]

    [#|2011-04-19T13:40:12.195-0430|WARNING|glassfish3.1|javax.enterprise.system.container.web.com.sun.enterprise.web|_ThreadID=79;_ThreadName=Thread-1;|ApplicationDispatcher[] PWC1231: Servlet.service() for servlet jsp threw exception
    org.apache.jasper.JasperException: PWC6033: Error in Javac compilation for JSP

    PWC6197: An error occurred at line: 54 in the jsp file: /html/portlet/login/login.jsp
    PWC6199: Generated servlet error:
    string:///login_jsp.java:948: setSecure(java.lang.String) in com.sun.portal.portletcontainer.taglib.BaseURLTag cannot be applied to (boolean)

    PWC6199: Generated servlet error:
    Note: string:///login_jsp.java from uses unchecked or unsafe operations.

    PWC6199: Generated servlet error:
    Note: Recompile with -Xlint:unchecked for details.


    at org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:129)
    at org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:299)
    at org.apache.jasper.compiler.Compiler.generateClass(Compiler.java:392)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:453)
    at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:625)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:492)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:378)...

    ¿Alguna pista sobre este error?
    Apreciaría mucho cualquier ayuda.

    Gracias de ante mano.

    ResponderEliminar
  17. ola sho quiero poner una aplicacion javafx en glassfish alguien me podria dar los pasos que tengo que hacer les recuerdo que soy nuevo en esto para que sean lomas simples o especificos posibles mi correo es sigmund_bollas@hotmail.com de antemano gracias

    ResponderEliminar
  18. Muy interesante el tutorial.

    Quería compartir con vosotros otro website de interes con guías de Liferay en castellano:

    http://www.coretec.es

    ResponderEliminar
  19. Gracias Diego, muchas gracias. Algunos inconvenientes pero, ya está funcionando el portal.

    ResponderEliminar
  20. Tengo el mismo error:
    Exception while loading the app : java.lang.Exception: java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: java.lang.IllegalArgumentException: java.lang.IllegalArgumentException: PWC1430: Unable to add listener of type: com.liferay.portal.kernel.servlet.PortletSessionListenerManager, because it does not implement any of the required ServletContextListener, ServletContextAttributeListener, ServletRequestListener, ServletRequestAttributeListener,...

    alquien sabe como resolverslo

    ResponderEliminar
  21. les afirmo para instalar liferay-portal-5.2.3 no lo intenten con glassfish-3.1.2.2 no se instala bien

    pero si es compatible con el liferay-portal-6.0 y funciona en glassfish-3.1.2.2

    para eso hagan los mismos pasos y sigan con el post http://www.apuntesdejava.com/2010/09/instalando-liferay-6-en-glassfish-v3.html

    lo hice con 2 SO

    Ubuntu 12 y Scientific Linux 5.5 y funciona Perfectamente cualquier duda pueden contactarme Gracias

    ResponderEliminar

Si quieres hacer una pregunta más específica, hazla en los foros que tenemos habilitados en Google Groups


Ah! solo se permiten comentarios de usuarios registrados. Si tienes OpenID, bienvenido! Puedes obtener su OpenID, aquí: http://openid.net/