miércoles, 19 de mayo de 2010

WSTX-SERVICE-5002: A JTA Transaction MUST NOT exist entering WS-TX Service Pipe procesing for binding... SOLUCIONADO

JAX-WS representó una revolución en la implementación de SOAP Web Services en JEE. Su aparición en JEE 5 nos permitió publicar como Web Service un Stateless Session EJB automáticamente, de forma declarativa, añadiendo simplemente la anotación @WebService. Sin embargo, bajo determinadas condiciones, nuestro cliente se puede encontrar con un error que, a priori, nos puede resultar desconcertante:

WSTX-SERVICE-5002: A JTA Transaction MUST NOT exist entering WS-TX Service Pipe procesing for binding '{http://jdialer.sgi.gesif/}dataproviderPortBinding' and operation 'getContacts'. JTA Transaction is  J2EETransaction: txId=51 nonXAResource=null jtsTx=com.sun.jts.jta.TransactionImpl@d419b987 localTxStatus=0 syncs=[]....


Tras este error suelen producirse otros dos igualmente desconcertantes: "HTTP transport error: java.net.UnknownHostException: host_cliente" o el clásico SSL Handshake "HTTP transport error: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target". Es decir, es como si nuestro servidor estuviese intentando contactar con nuestro cliente por HTTPS. ¿Por qué lo hace?

Una pista: las condiciones en las que se da este error es si el cliente es un EJB. Sólamente en ese caso. Si es un servlet, o una aplicación standalone, funciona perfectamente. ¿Esto te da una idea o aún te confunde más?

La explicación es, en realidad, muy sencilla: los EJB's tienen el atributo de transacción establecido por defecto a REQUIRED (@TransactionAttribute(TransactionAttributeType.REQUIRED)). El código cliente del Web Service lo tiene en cuenta y añade un contexto transaccional al mensaje SOAP. Si EJB "servidor" ha declarado que no necesita transacciones (@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)), ya tenemos el problema servido. La solución en estos casos es también sencilla, debemos indicar a nuestro cliente que no use un contexto transaccional en la petición, anotándolo con @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED), y así el servidor no usará el coordinador WSTX (Web Service Transactions).

miércoles, 14 de abril de 2010

La galaxia en un campo de fútbol

Cuando veas un gigante, examina antes la posición del sol; no vaya a ser la sombra de un pigmeo.

- Novalis (1772-1801) Friedrich von Hardenberg. Poeta y filósofo alemán.


En el artículo Magnitudes astronómicas describía mi fascinación por los enormes tamaños de algunos cuerpos astronómicos. La mejor forma de "entender" realmente cómo eran de grandes era, obviamente, ubicándolos en nuestro mundo cotidiano, es decir, comparándolos con objetos conocidos.
Como prometí en dicho artículo, hoy voy a comentar el libro "La Galaxia en un campo de fútbol".

En mi artículo me limité al tamaño de algunos cuerpos de forma singular. "La Galaxia en un campo de fútbol", en cambio, es una exposición sistemática, pero al mismo tiempo muy amena, en la que se nos plantea un método que nos permite imaginar las distancias astronómicas para comprender (e imaginar también, en definitiva) el universo. Desde nuestro "entorno" más cercano, la tierra y sus satélites (artificiales y naturales), donde las distancias se miden en miles de Km, hasta abarcar la visión global del Universo conocido, donde las distancias se miden en millones de años luz, la obra desarrolla el método de forma muy ilustrativa y con ejemplos, de forma que nos permite por primera vez "imaginar" realmente dichas distancias. Así, los que nos hemos leído el texto, podemos entender realmente noticias como las del pasado 8 de Abril sobre un asteroide que pasó rozando la tierra, comprendiendo realmente las distancias que se indican y realizando cada uno nuestra propia valoración sobre lo "cerca" o "lejos" que está algo según el sistema de referencia y dependiendo con qué distancias comparemos (desde luego, un objeto como el 2009 VA del pasado Noviembre sí que pasó "cerca"... cualquier día de éstos se llevan un satélite geoestacionario por delante).

El libro está escrito pensando en lectores interesados por el tema, pero no presupone conocimiento alguno sobre astronomía, de forma que un lector curioso y lego en la materia podrá disfrutar tanto o más que un aficionado. De hecho, el autor, en un esfuerzo (supongo) por mantener un lenguaje cercano y ameno, dota el libro de un estilo de redacción en la que entabla un diálogo con el lector, consiguiendo un resultado entretenido y accesible aunque quizá de forma desmedida, resultando al final (en mi modesta opinión y por poner alguna pega) un poco pueril e ingenuo (eso de pedir al lector que haga algo y luego felicitarlo por hacerlo me parece un poco excesivo).

Por lo demás, el ejemplar está editado en un tamaño muy cómodo e impreso en un papel excelente, permitiéndonos disfrutar de las maravillosas fotografías astronómicas que incluye.

En definitiva, una obra muy atractiva que volveré a releer y disfrutar para asimilar bien "el método" y continuar "imaginando" el universo. Os la recomiendo.


Referencias:

jueves, 25 de marzo de 2010

Generación de código JAXB con Maven

Si tu intención es describir la verdad, hazlo con sencillez y la elegancia déjasela al sastre.
- Albert Einstein.

Al hilo de lo que comentaba en el artículo "Desarrollo en equipo con SVN, Maven y Nexus", una de las maravillas de usar Maven es que te facilita la reproducibilidad, por ejemplo, de la gestión de la configuración de un proyecto. El caso que voy a exponer es un estupendo ejemplo: la generación de código JAXB a partir de esquemas XML (XSD).

La generación de código JAXB se ha venido haciendo típicamente de dos formas: a través de una herramienta o utilidad (wizard, plugin, etc...) de nuestro IDE, o "manualmente" usando la tarea xjc de ant, o el compilador xjc por línea de comando directamente. Personalmente, nunca me ha gustado usar las herramientas automáticas de los IDE, porque ocultan la configuración del proyecto: los settings que se configuran en un wizard del IDE se acaban perdiendo porque no se suben al repositorio de código o si se hace, atas el proyecto a una herramienta que puede que no uses (tú u otro compañero a quien le toque modificarlo) varios meses después cuando te encuentras con el mantenimiento de un proyecto cuya configuración no es reproducible. Además, esa tarea suele ser repetitiva y necesita ser ejecutada a menudo, especialmente en las fases iniciales donde se va ajustando nuestro esquema XML a los tipos de dato que vamos necesitando, de modo que acabo haciendo "a mano" una tarea ant que realice la generación o un shell script que realice la llamada al compilador xjc con los parámetros que quiero.

Afortunadamente, podemos hacer que Maven realice esta tarea automáticamente como parte de sus labores de construcción, y como tenemos nuestro pom.xml subido a svn, todas nuestras preferencias de generación permanecen autocontenidas en el proyecto: simple, sencillo y sin ataduras a ningún IDE.

Iba a poner aquí los trozos necesarios a incluir en el pom.xml extraído de uno de los módulos del proyecto en el que estoy trabajando pero, la verdad, sería redundante porque está perfectamente explicado en el sitio del plugin JAXB XJC de Maven.

En mi caso, que uso Eclipse con m2eclipse (plugin de maven para eclipse), la integración con Maven es tal, que basta con realizar una modificación el XSD y salvarlo para que se regenere y recompile la clase automáticamente y tenga disponibles los nuevos métodos en mis clases "cliente" de forma instantánea (m2eclipse ejecuta el "generate" de Maven integrado con el propio build de Eclipse).

Otra razón más para continuar recomendando usar Maven.

Referencias:

domingo, 7 de marzo de 2010

Balteus cumple un año

“Yo…he visto cosas que vosotros no creeríais. Naves de guerra ardiendo más allá de Orión. He visto rayos-c resplandecer en la oscuridad, cerca de la puerta de Tanhäuser. Todos esos…momentos se perderán…en el tiempo. Como…lágrimas…en la lluvia. Es hora…de morir”.

--Roy Batty, Blade Runner.

Ya ha pasado un año desde mi primer artículo. Una primera entrada impetuosa que escribí sin presentación, casi por rabia, tras perder demasiado tiempo en un error absurdo, de ésos que te vuelven loco, y de los que sólo te sirven para aprender que debes cuestionarlo todo y no dar nada por sentado. Fue en ese estado de rabia contenida y aliviada, tras solucionar el error, cuando decidí que debía compartir estas experiencias con otros desarrolladores, tal y como hacen miles de compañeros alrededor del mundo, de cuyos trabajos y generosidad me he ido aprovechando durante años, ahorrándome muchas horas y disgustos. Tras ése primer post, escribí realmente la presentación del blog con mis motivos y objetivos.

He querido comenzar este post con la que es, probablemente, la cita más conocida de todos los locos entusiastas del cine de ciencia ficción... Parece una entrada melancólica, pero nada de eso en absoluto: simplemente es un homenaje a Ridley Scott y a la película. Yo creo que no hay desarrollador que no haya dicho o pensado algo así tras una puesta en producción... ¿eh? ;-)

1 año. 25 Entradas. 2 entradas al mes, de media. Menos de lo que me gustaría... pero no encuentro tiempo para mucho más. "La falacia de la Ingeniería del Software" y los artículos de la serie "Banco de experiencias" son probablemente las entradas de las que me siento más satisfecho (aunque, curiosamente, no son las que más interés despiertan). De los datos y números que aporta Google Analytics, destacaría dos cosas:
  • La gente busca soluciones. Las entradas más consultadas son aquellas en las que comento cómo he solucionado un error o problema. Lo cual es lógico. En mi caso también ha sido así. Muchos de los blogs en los que he aterrizado ha sido vía google, buscando una determinada solución. En definitiva, cuando tenemos un problema, buscamos si a otra persona le ha pasado lo mismo antes de perder más tiempo. Como digo, constato una evidencia que ya suponía.
  • Realmente el blog tiene visibilidad en todas partes del mundo. Internet hace que todo el mundo sean un montón de ordenadores conectados sin importar localización, idioma o frontera. Parece evidente. Es evidente. Sin embargo, cuando lo confirmas con datos concretos da cierto vértigo. Asumes las lógicas visitas de España y países de habla hispana (al fin y al cabo escribo en español)... pero llaman la atención visitas de Estados Unidos, Alemania, Suiza, Rusia, Brasil, Polonia, India, Finlandia, Corea... ¿Hispanohablantes por el mundo? ¿O simplemente hay gente que busca su respuesta esté en el idioma que esté? (yo lo hago... quizá los angloparlantes, germanoparlantes, etc... también).
En fin, son un par de obviedades con las que todo el mundo cuenta... pero que nunca dejan de sorprender. Al fin y al cabo tenemos una dimensión local y finita... Que lo que escribes pueda ser de interés para alguien tan lejano, impresiona, la verdad.

En todo caso tendré en cuenta estas reflexiones para mis próximas entradas. Es posible que los localismos comentados en "Magnitudes astronómicas" no sean tan claros para gente que no conoce Madrid. Por otro lado, es difícil no hacer referencias al mundo que te rodea. Con respecto a la temática, mi trabajo diario suele darme material de sobra para seguir compartiendo "soluciones" y "experiencias". Así que seguiré en ello.

Gracias a los que visitáis el blog, seáis de donde seáis. Un afectuoso saludo.

lunes, 22 de febrero de 2010

Desarrollo en equipo con SVN, Maven y Nexus (parte II)

Banco de experiencias (V)

En la primera parte de este artículo, enumeraba los problemas de coordinación a los que se enfrenta un equipo de desarrollo diariamente y cómo la utilización de Maven los soluciona de un plumazo por el simple hecho de utilizarlo. Hay un problema sin embargo, inherente al desarrollo en equipo, para el cual se necesita una herramienta más: un gestor de repositorios.

Imaginemos el siguiente escenario de proyecto: un equipo está desarrollando una aplicación empresarial (ear) formada por un par de módulos web, otro par de módulos ejb (ejb-jar), un conector JCA (rar) y tres módulos de librerías comunes (jar).

En un proyecto de éstas características (proyecto con varios módulos) cada desarrollador trabaja en uno o varios módulos (en función de la funcionalidad, de su perfil, habilidades o experiencia...), pero no suele participar en todos... Al menos, eso es lo habitual. Sin embargo necesita tener las actualizaciones y los progresos de todos (o la mayoría) de los módulos, debido a las dependencias entre ellos. Estas dependencias inter-proyecto o inter-módulo son las que denominé como dependencias internas en la primera parte de este artículo. Pero ¿ćomo estar actualizados y poder tener las nuevas funcionalidades y servicios que han desarrollado nuestros compañeros para poderlos usar en los módulos que estamos desarrollando? Típicamente esto se hace de dos formas:
  1. Todos los desarrolladores tienen todos los proyectos creados en su IDE y vinculados con SVN o, al menos, los proyectos en los que está trabajando, los proyectos dependientes, y los dependientes de los dependientes (dependencias transitivas), y así sucesivamente... es decir, típicamente todos. Esto es lógicamente un engorro, porque cada vez que alguien realice una refactorización que suponga la creación de un nuevo proyecto, afectará a todo el equipo de desarrollo. Todos los cambios impactan a todos (cambios en la configuración, dependencias, nuevos proyectos, etc...), favoreciendo, además, la incidencia de errores dada la exposición de todos los fuentes a todo el equipo.
  2. Los desarrolladores que trabajan en proyectos que son requeridos por el resto "publican" sus artefactos en SVN o un repositorio común en red. Esta segunda opción introduce complejidad de configuración y coordinación en el equipo y scripts adicionales que realicen esas tareas, ya que hay que "avisar" de cuando hay que actualizar las dependencias... en todo caso: la gestión de las dependencias (en este caso internas) se manejan manualmente vía scripts (típicamente de ant).

Software de gestión de repositorios Maven

El software para de gestión de repositorios Maven sirve precísamente para eso: para crear y gestionar nuestros propios repositorios de Maven. De esta forma tendremos la gestión de dependencias solucionada:
  • las dependencias externas, a través del mismo Maven, usando el repositorio Central. También podemos crear nuestros propios repositorios proxies de otros, reduciendo el tráfico de red.
  • las dependencias internas (o inter-proyecto) con nuestro repositorio.
Veamos el siguiente ejemplo: tenemos un equipo de tres desarrolladores que está desarrollando una aplicación que tiene un módulo JAR, que a su vez es usado por un módulo EJB y otro módulo WAR que usa (necesita) los dos anteriores.
  • El desarrollador A participa en el desarrollo del módulo EJB, y es el único que desarrolla el módulo JAR. Este desarrollador no tiene que resolver dependencias internas, digamos que es un "productor" y debe "publicar" su trabajo para los demás.
  • El desarrollador B sólo trabaja en el módulo WAR: por tanto debe disponer de los otros proyectos. Sería el caso del "consumidor" exclusivo.
  • El desarrollador C trabaja en los módulos WAR y EJB: es decir, es consumidor y productor a la vez. Debe publicar su trabajo, pero también requiere del trabajo del desarrollador A.



En el caso anterior, usando un repositorio remoto con un software de gestión de repositorios, Maven realizará todos los trabajos de sincronización de forma transparente, realizando la publicación de artefactos al repositorio (mvn deploy) para los desarrolladores A y C, y la actualización automática para todos. Lo único que hay que hacer es especificarle la URL del repositorio en los pom.xml de los proyectos, simplificando enormemente la coordinación en proyectos reales típicos (más grandes, complejos y con más desarrolladores).

El software repositorio que yo conozco es Nexus, de la compañía que creó Maven (Sonatype), y la verdad, estoy muy satisfecho con su funcionamiento. No obstante, hay otros también bastante usados como Apache Archiva, o Artifactory. En general, todos parecen cumplir correctamente su misión principal y tienen una instalación sencilla. Al final del artículo puedes encontrar algunas referencias útiles con datos y opiniones sobre Archiva y Nexus. Con independencia de la elección, el objetivo del artículo es dejar claro para qué sirve y por qué nos es tan útil un software de gestión de repositorios. En nuestro caso particular, nos decidimos por Nexus porque usamos eclipse y pensábamos que tendríamos menos problemas si todas las herramientas estaban bien integradas por ser de la misma compañía: Maven, Nexus y m2eclipse.

La verdad, he de decir, que m2eclipse nos ha dado algún problema que otro, especialmente alguno  bastante gordo que nos retrasó en el conocimiento del plugin y cómo funcionaba (p.e.: la opción "Enable Workspace resolution" ha dado problemas en sucesivas versiones del plugin), pero nada que decir sobre Nexus: hasta el momento, perfecto.

Finalmente, SVN, Maven y Nexus conforman una tríada perfecta para empezar cualquier proyecto pequeño adoptando buenas prácticas y un mínimo de coordinación automatizada, permitiéndonos poder escalar a proyectos y grupos más grandes afinando más hacia la integración continua con una buena base.

Referencias:




martes, 9 de febrero de 2010

Desarrollo en equipo con SVN, Maven y Nexus (parte I)

Banco de experiencias (V)


El orden es el placer de la razón pero el desorden es la delicia de la imaginación.
-Paul Claudel.

El desarrollo de software aúna una fascinante mezcla de pensamiento divergente (o creativo) con conceptos técnicos y prácticas metódicas. Para que un desarrollador (y especialmente un equipo de desarrollo) alcance los mayores niveles de eficiencia y productividad, las herramientas utilizadas deben garantizar la seguridad del proceso, pero siempre de forma proporcional a la envergadura del proyecto y manteniendo compatibilidad con el proceso creativo sin ahogarlo. Hay herramientas libres que nos ayudan a mantener este este delicado equilibrio entre orden y libertad para todo tipo de proyectos de forma sencilla e impecable.

Éste, como el resto de los artículos de la serie "banco de experiencias", no pretende ser un artículo más de documentación sobre las herramientas aquí comentadas ni encontrarás tampoco el enésimo tutorial sobre el asunto. Hay mucha documentación en la red y a lo largo del artículo suelo ofrecer información y referencias suficientes para que puedas profundizar en el tema. La idea de estos artículos es exponer buenas prácticas y comentar mi punto de vista, basado en mi propia experiencia profesional, sobre la utilidad real y pragmática de los temas abordados. Sin demagogia rimbombante ni publicidad interesada. Simplemente la síntesis de mi experiencia subjetiva.

Subversion

Subversion (también conocido simplemente como svn) es probablemente el mejor sistema de control de versiones centralizado que existe. Sin entrar en la discusión Centralizado vs Distribuido (DVCS), lo que si está claro es que el control de versionado es un aspecto crítico de cualquier proyecto de software.

En todo caso, si has llegado hasta aquí y no has usado nunca un software de control de versionado (VCS) la recomendación es clara: úsalo. Debes usarlo. Aunque tu proyecto sea muy pequeño. Aunque sólo exista un desarrollador. Has de asumir que, de la misma forma y con la misma naturalidad que usas un IDE o un compilador, deberás usar un VCS. Es absolutamente esencial. Si ya tienes claro que hay que usar uno y has decidido usar uno centralizado (o simplemente sueles usar otro, como CVS, por ejemplo), la recomendación también es clara: usa svn. En la wikipedia puedes consultar por qué SourceForge.net, Apache o Google Code lo eligieron, así como la documentación y herramientas disponibles.

Como decía, un software de control de versiones es necesario aunque el proyecto sea pequeño ya que te garantiza un seguimiento de cambios que te puede ahorrar muchas horas de trabajo. Si tienes clara la diferencia entre un editor de texto y un procesador de texto, entenderás enseguida la diferencia de usar backups de tu directorio de código y usar un VCS. No obstante, hay otro aspecto importante de los VCS que no suele ser tan comentado (quizá por obvio) y es su dimensión como herramienta colaborativa. Si de forma individual es extremadamente importante, para un equipo es absolutamente imprescindible. Un equipo no puede trabajar de forma "decente" sin Subversion. La idea de no usar un VCS o de usar uno bloqueante (tipo Visual SourceSafe) es una pesadilla para no dormir: "¡eh, cuidado!, no toquéis que voy a tocar yo" "¡Oh, mierda!, ya ha tocado alguien. ¡A ver ahora cómo lo arreglamos!"... o "¡fulanito, desbloquea el fichero que necesito añadir un método de la clase!" "¡No, espera que termine!"... Qué pesadilla. Me recuerda a aquellas herencias arcaicas de los programas COBOL de no pasarte de la columna 73 y poner los asteriscos en la columna nº 7... Bufff.

Trabajar con svn en equipo es lo más parecido a hacerlo como si estuvieses tú sólo. Si las tareas están repartidas, los conflictos son muy poco frecuentes (para que existan, dos desarrolladores deben haber modificado la misma línea simultáneamente antes del último commit) y cuando los hay, se suelen solucionar en pocos segundos. Es muy gratificante comprobar cómo un equipo numeroso puede trabajar en una aplicacion Web (un tipo de proyecto con un alto grado de colisión y concentración de trabajo) de forma cómoda y fluida sin problemas.

Maven

Aunque llevamos oyendo hablar de Maven desde hace varios años (Maven tiene ya 8 años), la adopción hasta hace cuatro o cinco años ha sido puntual y conceptual. Es desde la aparición de Maven2 (con su nueva arquitectura revisada) cuando realmente empieza a incorporarse (aunque también de forma muy lenta) a los distintos proyectos open source y esto ha hecho que en la comunidad de desarrollo comencemos a interesarnos y a integrarlo en nuestros proyectos. A mucha gente le ocurre que, tras leer sobre Maven y Ant, entiende las diferencias entre ellas, pero no alcanza a concretar por qué es tan importante y para qué le sirve realmente (qué le aporta que no tenga ya). Para aclarar definitivamente este punto simplemente hay que preguntarse cómo realizamos el proceso de construcción (generación de empaquetados y otros artefactos) en nuestros proyectos, y esto nos dará la respuesta. Veamos las opciones:
  1. Construimos con nuestra herramienta de desarrollo (Eclipse, Netbeans, etc...).
  2. Construimos con un fichero (build.xml) ant que nos hemos hecho nosotros.
Si se trata de un pequeño proyecto de un sólo módulo (un war, un jar, etc...) y/o el ciclo de vida de la aplicación es muy reducido (es una pruebecilla nuestra, una pequeña aplicación de las que se hacen en casa en zapatillas, etc) no importa, claro. ¿Qué más da? La he hecho yo y podré volverla a construir con mi IDE favorito o con mi Ant dentro de un año cuando tenga que hacer un cambio. Incluso aunque cambie el IDE o cambie mi entorno, podré adaptarme a la situación sin más problemas, hacer las correcciones y volver a generar el empaquetado.

Ahora bien, si nos situamos ahora un escenario profesional, el tema cambia mucho. A continuación expondré los problemas que nos encontramos con esas formas de construir aplicaciones. Seguramente ya te habrás encontrado con ellos, y si no, es porque el proyecto no era lo suficientemente grande o, simplemente, es una cuestión de tiempo que te los encuentres.
  • Homogeneidad. Cada desarrollador tiene sus costumbres y sus ubicaciones (paths) para sus proyectos, librerías, ubicación del JDK, etc. Es difícil e incómodo homologar a todo un equipo de desarrollo en una única estructura de ficheros. Aunque Sun hiciese su propuesta de convenciones para proyectos (estructura y nombrado) hace mucho tiempo, casi ningún IDE lo respeta al 100%. Además, la heterogeneidad de los distintos Sistemas Operativos no hacen más que complicar la posibilidad de tener una estructura y ubicación homogénea para todo el mundo. Eso hace que los ficheros de proyecto (.nbproject, .project, etc) no puedan ser portados de unos desarrolladores a otros ni compartidos entre distintas máquinas. Esta estructura acaba teniendose que modificar manualmente en los distintos IDE's o en el fichero build.xml de ant. En el caso de los IDE's es particularmente grave, ya que la información de librerías, por ejemplo, descansa en la configuración local del IDE de cada desarrollador, que suele ser distinta para cada uno, con lo cual la construcción se torna algo tremendamente frágil y poco transparente.
  • Reproducibilidad. Necesitamos realizar tareas forma constante y estable nuestro proyecto: construccion, pruebas unitarias, informes, etc... Repetibles en el tiempo (hoy y dentro de un año) y en el espacio (en mi máquina de desarrollo, en integración, en preproducción...). Necesitamos fijar parámetros que no están implícitos en el proyecto en si y que acaban también fijados en los IDE's o en el script ant: versión de Java, versiones de librerías, destino de cada librería (sólo para compilar, sólo para desplegar con la aplicación, para compilar y desplegar...), ficheros de configuración, etc... Esto dificulta el mantenimiento y oculta información esencial del proyecto. Si el proyecto se sube a SVN y no lo volvemos a tocar en un año, a menudo nos encontramos con que las partes esenciales del proyecto han quedado ocultas en IDE's (o lo que es peor, se han perdido porque eran parte de la configuración local de un miembro del equipo) o permanecen en un script de ant poco amigable para modificar.
  • Gestión del cambio. Algo tan común como añadir una nueva librería al proyecto o realizar una actualización de una existente tiene demasiado impacto en el equipo hasta resultar ligeramente traumático: todos deben realizar las tareas de la descarga y localización de las librerías, la configuración de su IDE y de su proyecto y/o la adaptación de sus ficheros ant. Incluso un equipo de desarrollo con normas rígidas y paths homologados, además de sufrir esta falta de libertad, sigue estando expuesto a este tipo de problemas.
  • Gestión de dependencias (externas). Este es sin duda el aspecto más importante, por delicado, y por el impacto de sus consecuencias. Imagina el siguiente proyecto: un EAR compuesto por dos módulos WAR, tres módulos EJB y un par de módulos de de librerías comunes (jar). Uno de los desarrolladores añade al EAR una librería "A" que necesita uno de los módulos EJB y otro desarrollador añade otra librería "B" que necesita uno de los módulos JAR. Ambas librerías tienen sus propias dependencias: la librería "A" requiere de xxx-commons-2.3 y de asm-2.1, la librería "B" de yyy-commons (que a su vez depende de xxx-commons-1.5) y asm-3.0. Ya tenemos el problema servido. Como ya comenté en el artículo "Errores comunes de despliegue JEE", este tipo de problemas algunas veces sólo se presentan aleatoriamente, ya que el problema puede presentarse o no en función de la secuencia de carga del ClassLoader de la máquina de turno. Esto ocurre muchas más veces de lo que nos pueda parecer a simple vista, si bien en la mayoría de los casos los conflictos no plantean problemas porque muchas librerías mantienen una compatibilidad perfecta hacia atrás. En mi experiencia, es habitual que ocurra sin embargo con grandes frameworks tipo Hibernate, Spring, Struts, etc, con consecuencias muy desagradables. Sin Maven, la gestión de dependencias no la hace nadie, o lo que es lo mismo, se hace manualmente si el equipo de desarrollo es muy cuidadoso y está muy bien coordinado.
  • Gestión de dependencias (internas). Otro aspecto de los proyectos medianos con varios módulos interdependientes entre si es que, además de tener que realizar gestión de dependencias de librerías de terceros tenemos que gestionar nuestras propias dependencias. Por ejemplo, para el caso anterior, si ambos WAR necesitan de los proyectos JAR de librerías comunes, todos los desarrolladores de los WAR deberán tener también que tener los proyectos (código fuente incluído) de dichos JAR, para estar debidamente actualizados... O bien buscar otra forma de distribución manual de empaquetados que también exigirá un esfuerzo adicional de coordinación.

Como puedes suponer a estas alturas, Maven es una solución perfecta a todos los problemas comentados anteriormente (salvo para el último punto, para el que se requiere un colaborador, pero eso lo comentaré en la segunda parte). Maven es y sirve para muchas cosas (compilación, paso de pruebas unitarias, control de calidad, etc) pero, fundamentalmente, es la mejor herramienta de construcción posible. Hasta ahora, para una construcción lo más homogénea y reproducible posible necesitábamos unas normas (o convenciones) y ant. Pero ant es un lenguaje específico de dominio para la construcción de proyectos: te tienes que crear tus propios scripts basado en tus convenciones y el esfuerzo de mantenimiento es exponencial a la envergadura del proyecto. Maven ya te aporta ambas cosas: convenciones (sobre disposición de directorios de proyecto, por ejemplo) y todo el trabajo listo para usar sin tener que configurar nada. Con Maven puedes realmente bajarte unos fuentes y ejecutar un "mvn build" sobre el directorio que contiene el "pom.xml". Y tener en poco tiempo todos los empaquetados, un informe de construcción, pruebas unitarias realizadas, etc, etc.. con configuración cero.

No obstante, el punto fuerte (e incluso espectacular) de Maven es la gestión de dependencias: sólo por la gestión de dependencias transitivas que realiza de forma automática, ya merece la pena con creces. En este tema me recuerda a los repositorios de Ubuntu. Cuando quieres una librería, añades la dependencia y la versión que quieres de las disponibles y él se encargará de aprovisionarse de todas las dependencias transitivas adicionales.

Incluso aún respetando las convenciones de Maven (te las puedes saltar si especificas en el pom.xml cuáles son tus directorios) Maven te ofrece toda la libertad posible: permite que un equipo trabaje con IDE's heterogéneos: cada desarrollador con su IDE favorito. Lo único que debes subir a SVN son los fuentes y el pom.xml. Podrás construir el proyecto de forma repetible, independiente del IDE, ejecutar las pruebas unitarias y olvidarte de problemas de librerías.

Obviamente no te vas a olvidar de tu IDE o de ant. Toda esta maravilla de Maven tiene un precio: el rendimiento. Un build con Maven te lleva más segundos de los que estás dispuesto a considerar como aceptables para tu trabajo de desarrollo habitual. No es aceptable desarrollar realizando builds con Maven. Por lo menos para mi. Por eso yo continúo realizando los ciclos de iteración compilación-despliegue-pruebas con mi IDE. Maven lo dejo para realizar las construcciones, para subir a svn proyectos autónomos y autogenerables y para poder realizar las integraciones y las puestas a preproducción de una forma segura y repetible.


En esta primera parte he expuesto 2 de 3 de las herramientas más esenciales para el desarrollo en equipo de proyectos Java (especialmente JEE). En el siguiente artículo cerraré el círculo con la herramienta que falta: un gestor de repositorios de Maven. Y explicaré cómo, con tan sólo esas tres herramientas, tenemos un entorno de trabajo potente y seguro para equipos de tamaño mediano sin rígidas normativas ni procedimiento burocráticos.

Referencias:

(continuación: Parte II)
Related Posts Plugin for WordPress, Blogger...
cookieassistant.com