En esta guía técnica, vamos a ver los pasos necesarios para poder desplegar proyectos en el servidor JBoss As 7. Esta guía indica una serie de modificaciones en FundeWeb 2.0.x y en el proyecto, que permite trabajar con los servidores Weblogic 12 y JBoss AS 7.
La base de estas modificaciones es FundeWeb 2.0.0, sino estas en esta versión es recomendable actualizarse.
Realizar previamente las siguientes guías técnicas
Para integrar JBoss AS en FundeWeb, tenemos que seguir los siguientes pasos:
Para navegadores Chromuin –> JBoss EAP 6.4
Ahora el servidor nos aparecerá en la pestaña Servers.
Tenemos que editar el fichero POM principal del proyecto y buscar la etiqueta XML <parent> (esta tiene que tener como <artifactId> el valor parent) modificando el valor de la etiqueta hija <version> con el valor 2.0.24.
Abrimos el fichero build.properties y añadimos al inicio de este lo siguiente:
# Configuracion de los perfiles de empaquetado #jdk=jdk7 #environment=local #target.server=weblogic12 #cliente=umu
Solo tenemos que realizar dos acciones:
Editamos el fichero pom.xml del módulo y vamos a las sección <configuration> del plugin maven-ear-plugin. Realizamos las siguientes modificaciones:
<profiles> <profile> <id>weblogic12</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <maven-ear-plugin.packagingExcludes> **/jboss-deployment-structure.xml </maven-ear-plugin.packagingExcludes> </properties> </profile> <profile> <id>jboss_as7</id> <properties> <maven-ear-plugin.packagingExcludes> **/weblogic-application.xml, </maven-ear-plugin.packagingExcludes> </properties> </profile> </profiles> </project>
Solo tenemos que realizar dos acciones:
Las modificaciones que tenemos que hacer en el fichero POM del módulo son:
<project> ... <build> ... <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <configuration> <archive> <addMavenDescriptor>false</addMavenDescriptor> </archive> <webResources> <resource> <directory>src/main/webapp</directory> <excludes> <exclude>WEB-INF/.pages.xml.spdia</exclude> <exclude>WEB-INF/.faces-config.xml.jsfdia</exclude> </excludes> <filtering>false</filtering> </resource> <resource> <directory>src/main/web_resources</directory> <filtering>false</filtering> </resource> <resource> <directory>src/main/webapp</directory> <includes> <include>WEB-INF/web.xml</include> <include>WEB-INF/pages.xml</include> <include>index.html</include> <include>login.page.xml</include> </includes> <filtering>true</filtering> </resource> </webResources> </configuration> </plugin> ... </plugins> ... </build> ... </project>
<project> ... <build> ... <filters> <filter>src/main/filters/filtro-${entorno}.properties</filter> </filters> <resources> <resource> <directory>src/main/resources</directory> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>components.properties</include> <include>log4j.xml</include> </includes> <filtering>true</filtering> </resource> </resources> </build> ... </project>
<resources> ... <resource> <directory>src/main/resources</directory> <includes> <include>META-INF/persistence.xml</include> <include>components.properties</include> <include>log4j.xml</include> </includes> <filtering>true</filtering> </resource> </resources>
<project> ... <build> ... <extensions> <extension> <groupId>es.um.atica.fundeweb.maven.extensions</groupId> <artifactId>maven-fundeweb-extension</artifactId> </extension> </extensions> </build> ... </project>
<profiles> <profile> <id>weblogic12</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <weblogic.profile.folder>src/main/perfiles/weblogic</weblogic.profile.folder> </properties> <build> <filters> <filter>${weblogic.profile.folder}/filters/filtro-weblogic.properties</filter> <!-- <filter>${weblogic.profile.folder}/filters/filtro-weblogic-${entorno}.properties</filter> --> </filters> <plugins> <plugin> <groupId>es.um.atica.fundeweb.maven.plugins</groupId> <artifactId>maven-fundeweb-build-helper-plugin</artifactId> <executions> <execution> <id>add-weblogic-webResources</id> <phase>generate-resources</phase> <goals> <goal>add-webResource</goal> </goals> <configuration> <webResources> <resource> <directory>${weblogic.profile.folder}/webapp</directory> <filtering>false</filtering> </resource> </webResources> </configuration> </execution> </executions> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>es.um.atica.fundeweb.weblogic</groupId> <artifactId>fundeweb-java-services-config</artifactId> </dependency> <dependency> <groupId>es.um.atica.fundeweb.weblogic</groupId> <artifactId>fundeweb-jersey</artifactId> </dependency> </dependencies> </profile> <profile> <id>jboss_as7</id> <properties> <jbossas.profile.folder>src/main/perfiles/jbossas7</jbossas.profile.folder> <maven-war-plugin.server.warSourceExcludes>**/log4j.xml</maven-war-plugin.server.warSourceExcludes> <maven-war-plugin.server.packagingExcludes>**/log4j.xml</maven-war-plugin.server.packagingExcludes> </properties> <build> <filters> <filter>${jbossas.profile.folder}/filters/filtro-jbossas7.properties</filter> <filter>${jbossas.profile.folder}/filters/filtro-jbossas7-${entorno}.properties</filter> </filters> </build> <dependencies> <dependency> <groupId>com.google.gwt</groupId> <artifactId>gwt-servlet</artifactId> <scope>compile</scope> </dependency> <dependency> <groupId>es.um.atica.fundeweb.jboss-as</groupId> <artifactId>fundeweb-java-services-config</artifactId> </dependency> <dependency> <groupId>es.um.atica.fundeweb.jboss-as</groupId> <artifactId>fundeweb-jersey</artifactId> </dependency> <dependency> <groupId>org.jboss.seam.integration</groupId> <artifactId>jboss-seam-int-jbossas</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>com.oracle.weblogic.clients</groupId> <artifactId>wlthint3client</artifactId> <scope>runtime</scope> </dependency> </dependencies> </profile> <!--profile> <id>weblogic12-cluster</id> <properties> <weblogic-cluster.profile.folder>src/main/perfiles/weblogic-cluster</weblogic-cluster.profile.folder> </properties> <build> <plugins> <plugin> <groupId>es.um.atica.fundeweb.maven.plugins</groupId> <artifactId>maven-fundeweb-build-helper-plugin</artifactId> <executions> <execution> <id>add-weblogic-cluster-webResources</id> <phase>generate-resources</phase> <goals> <goal>add-webResource</goal> </goals> <configuration> <webResources> <resource> <directory>${weblogic.profile.folder}/webapp</directory> <filtering>false</filtering> </resource> </webResources> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile--> </profiles>
De esta forma tenemos la configuración básica. Más información sobre filtros en Aclaraciones - Filtrado.
En el fichero persistence.xml tenemos que realizar dos modificaciones:
Veamos un ejemplo de como quedaría:
<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> <persistence-unit name="defaultPU" transaction-type="JTA"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <jta-data-source>jdbc/Clarasuma DataSource</jta-data-source> <properties> <property name="hibernate.hbm2ddl.auto" value="validate"/> <property name="hibernate.show_sql" value="false"/> <property name="hibernate.format_sql" value="true"/> <!-- Añadir el esquema por defecto de la Base de Datos --> <property name="hibernate.default_schema" value="Clarasuma"/> <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/> <!-- JTA Platform --> <property name="hibernate.transaction.jta.platform" value="${hibernate.transaction.jta.platform}"/> <!-- hqlLiteral=SQL_LITERAL or hqlFunction=SQLFUNC Map from tokens in Hibernate queries to SQL tokens, such as function or literal names. https://docs.jboss.org/hibernate/orm/4.2/manual/en-US/html/ch03.html#configuration-optional-querysubstitution <property name="hibernate.query.substitutions" value="true=1, false=0, toLowerCase=LOWERCASE"/> --> <!-- Acceder a los objetos de BBDD por los sininimos publicos <property name="hibernate.synonyms" value="true"/> --> </properties> </persistence-unit> </persistence>
Para poder desplegar en el servidor JBoss AS 7 de Eclipse, tenemos que tener actualizado el framework a la versión 2.0.13 para Win64 o 2.0.21 para Win32.
Una vez aplicado ese parche, tendremos disponible el servidor JBoss AS 7 dentro de Eclipse para poder desplegar la aplicación.
Como ya no tenemos las tareas ANT para desplegar, tenemos que indicar los perfiles que queremos activar a la hora de trabajar para JBoss AS. Tenemos que ir a cada módulo del proyecto (EAR, EJB, WEB) e indicar los perfiles.
Para seleccionar los perfiles para trabajar con JBoss AS, podemos hacerlo seleccionando varios módulos a las vez o módulos individualmente.
Para seleccionar los perfiles de varios módulos a la vez, tenemos que seleccionar los módulos y pulsar el botón derecho del ratón y seleccionar Maven –> Select Maven Profiles… (el shortcut es Ctrl + Alt + P). Con los botones Move Up y Move Down, podemos ordenar los perfiles, seleccionando uno o varios.
Veamos un ejemplo con el módulo EAR (para el resto de módulo, se utiliza el mismo procedimiento), tenemos que seleccionar un módulo, pulsar el botón derecho del ratón y seleccionar Maven –> Select Maven Profiles… (el shortcut es Ctrl + Alt + P).
En la ventana que aparece seleccionamos los perfiles jdk7, local y jboss-as7, el resto de perfiles se desmarca (a no ser que quieras especificar el perfil de un cliente). Con los botones Move Up y Move Down, podemos ordenar los perfiles, seleccionando uno o varios.
En la imagen se selecciona dos veces el perfil jboss-as7, uno que viene heredado por el parent y otro definido en el propio módulo que es el que hay que marcar.
En la parte superior de la ventana, aparece el orden en que se aplican en Maven los perfiles, si tenéis definidas una misma variable en varios ficheros de filtro (que se utiliza dependiendo del perfil utilizado), se aplicará el valor del fichero de filtro del último perfil de esta lista.
El orden general de los perfiles en FundeWeb es el siguiente: perfil del JDK, perfil del entorno, perfil del servidor, perfil del cliente y cluster (este ultimo no es necesario en entorno local y lo calcula directamente la tarea ANT).
Si tenéis definidas una misma variable en varios ficheros de filtro (que se utiliza dependiendo del perfil utilizado), se aplicará el valor del fichero de filtro del último perfil de esta lista.
Además de en la ventana de dialogo de selección de perfiles, podemos ordenar los perfiles desde otro punto, en la ventana de preferencias del proyecto. Para entrar, tenemos que seleccionar un módulo, pulsar el botón derecho del ratón y seleccionar Properties (la shortcut es Alt + Entrar (o Intro o Enter).
En la ventana que aparece, en el árbol de la parte derecha, seleccionamos Maven, y en la parte izquierda nos aparecen los perfiles, en un campo de entrada (Es una lista separada por comas), que podemos editar.
La duplicidad de perfiles, no es necesaria, con seleccionar una vez el perfil jboss-as7 es suficiente.
En el fichero build.properties especificaremos los perfiles a utilizar para realizar empaquetados para determinadas configuraciones. Estas propiedades las especificaremos al principio del fichero. Veamos un ejemplo:
# Configuracion de los perfiles de empaquetado jdk=jdk7 environment=preproduccion target.server=weblogic12 cliente=umu ...
La propiedades son:
Para asegurarnos que esta configuración va a funcionar correctament, tenemos que abrir el fichero common.build.xml y buscar la tarea maven.profile que debe tener la siguiente configuración:
<?xml version="1.0" encoding="UTF-8"?> <project name="project-common" default="" basedir="." xmlns="antlib:org.apache.tools.ant" xmlns:antelope="antlib:ise.antelope.tasks" xmlns:artifact="antlib:org.apache.maven.artifact.ant"> ... <target name="maven.profile"> <antelope:if name="jdk" exists="false"> <property name="jdk" value="jdk7"/> </antelope:if> <antelope:if name="environment" exists="false"> <property name="environment" value="local"/> </antelope:if> <antelope:if name="target.server" exists="false"> <property name="target.server" value="weblogic12"/> </antelope:if> <antelope:if name="cliente" exists="false"> <property name="cliente" value="umu"/> </antelope:if> <!-- Calculando el perfil para el cluster --> <property name="cluster" value=""/> <antelope:if> <bool> <and> <equals arg1="${cliente}" arg2="umu"/> <equals arg1="${target.server}" arg2="weblogic12"/> <or> <equals arg1="${environment}" arg2="preproduccion"/> <equals arg1="${environment}" arg2="produccion"/> </or> </and> </bool> <antelope:unset name="cluster"/> <property name="cluster" value=",${target.server}-cluster"/> </antelope:if> <property name="profile" value="-P ${jdk},${environment},${target.server},${cliente}${cluster}"/> <echo message="Establecidos los perfiles de empaquetado: ${profile}" /> </target> ... </project>
Por ahora, el perfil de cluster solo se obtiene cuando el servidor es weblogic12 y el cliente es umu. Si se necesita para otra configuración, tiene que añadirse en esta tarea.
Antes de desplegar el archivo EAR, tenemos que configurar la fuente de datos, y podemos crear fuentes de datos NO-XA y fuentes XA.
Para crear una fuente NO-XA, editamos el fichero standalone.xml de la carpeta standalone/configuration y buscamos el elemento <datasources>. Dentro crearemos la fuente de datos con los siguientes datos:
<datasource jta="true" jndi-name="JNDI_NAME" pool-name="DATASOURCE_NAME" enabled="true" use-java-context="false"> <connection-url>CONNECTION_URL</connection-url> <driver>oracle</driver> <security> <user-name>USUARIO_BBDD</user-name> <password>PWD_USUARIO_BBDD</password> </security> <validation> <validate-on-match>true</validate-on-match> <background-validation>false</background-validation> <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker"></valid-connection-checker> <stale-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleStaleConnectionChecker"></stale-connection-checker> <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleExceptionSorter"></exception-sorter> </validation> </datasource>
donde:
Para crear una fuente XA, editamos el fichero standalone.xml de la carpeta standalone/configuration y buscamos el elemento <datasources>. Dentro crearemos la fuente de datos con los siguientes datos:
<xa-datasource jndi-name="JNDI_NAME" pool-name="DATASOURCE_NAME" enabled="true" use-java-context="false"> <xa-datasource-property name="URL">CONNECTION_URL</xa-datasource-property> <driver>oracleXA</driver> <security> <user-name>USUARIO_BBDD</user-name> <password>PWD_USUARIO_BBDD</password> </security> <recovery> <recover-credential> <user-name>USUARIO_BBDD</user-name> <password>PWD_USUARIO_BBDD</password> </recover-credential> </recovery> <xa-pool> <is-same-rm-override>false</is-same-rm-override> <no-tx-separate-pools /> </xa-pool> <validation> <validate-on-match>true</validate-on-match> <background-validation>false</background-validation> <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker"></valid-connection-checker> <stale-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleStaleConnectionChecker"></stale-connection-checker> <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleExceptionSorter"></exception-sorter> </validation> </xa-datasource>
donde:
También es recomendable para que la recuperación XA funcione correctamente, realizar las siguientes operaciones:
GRANT SELECT ON sys.dba_pending_transactions TO USER; GRANT SELECT ON sys.pending_trans$ TO USER; GRANT SELECT ON sys.dba_2pc_pending TO USER; GRANT EXECUTE ON sys.dbms_xa TO USER; (IF USING Oracle 10g R2 (patched) OR Oracle 11g) OR GRANT EXECUTE ON sys.dbms_system TO USER; (IF USING an unpatched Oracle version prior TO 11g)
Para poder desplegar el proyecto en el servidor JBoss AS, utilizamos el mismo proceso que para desplegar en el servidor Weblogic, seleccionamos el módulo EAR, pulsamos el botón derecho del ratón y seleccionamos Run as –> Run on Server.
Para poder desplegar en modo depuración el proyecto en el servidor JBoss AS, utilizamos el mismo proceso que para desplegar en el servidor Weblogic, seleccionamos el módulo EAR, pulsamos el botón derecho del ratón y seleccionamos Debug as –> Debug on Server.
Los valores definidos en los ficheros de filtrado, se aplican a todos los ficheros de los <resource>'s que indican que se filtran (<filtering> con valor a true), no solo los especificados en un <profile>. El <profile>, solo añade nuevos ficheros a los ya definidos.
Los ficheros de filtrado se aplican en el siguiente orden:
Como ejemplo, en los perfiles de weblogic y jbossas7 tenemos definido un fichero de propiedades general del servidor (filtro-<nombre_servidor>.properties). Además, podemos definir ficheros de propiedades específicos para el entorno (que en principio están comentados: filtro-<nombre_servidor>-${entorno}.properties), en la configuración siempre tiene que ir detrás del fichero de propiedades general del servidor.
Si descomentamos algún filtro-<nombre_servidor>-${entorno}.properties, como trabajamos con 4 entornos, tenemos que tener un fichero por entorno, veamos un ejemplo para weblogic: filtro-weblogic-local.properties, filtro-weblogic-desarrollo.properties, filtro-weblogic-preproduccion.properties y filtro-weblogic-produccion.properties.
Los ficheros tienen que existir, aunque estén vacíos. Si falta alguno de estos ficheros, entonces la tarea Maven fallara para dicho entorno.
El orden de aplicación de los ficheros de filtrado (los definidos en etiquetas <filter>, se establece según el orden de definición, y permiten sobrescribir el valor de propiedades, tomando como valor, la última definición encontrada para dicha propiedad, según el orden de defunción de los filtros.