Actualizando de Spring 2.5 a 3.0

Recientemente actualicé una aplicación que utiliza Spring 2.5, para que utilice Spring 3.0 y quiero compartir algunos detalles de esta experiencia. No quiero decir que esta es la manera de actualizar pero pues espero le sirva a alguien y si hay mejores maneras también las puedan poner aquí como comentarios.

Primero que nada, quiero mencionar que los proyectos que actualicé no utilizan Maven ni Ivy ni nada por el estilo; de ahí la complejidad y la mención en mi blog; si fuera con Maven sería más sencillo y no habría tanto problema.

El primer cambio que noté con Spring 3.0 es que ya no existe un JAR grande (como era spring-2.5.6.jar por ejemplo) sino que ahora hay varios JARs, uno por módulo, y la nomenclatura se complicó un poco, por ejemplo  .

La aplicación que actualicé consiste en varias decenas de proyectos de Eclipse, la mayoría módulos de un proyecto central, el cual contiene el  . Así que lo que hice fue quitar el JAR y dar Refresh al proyecto, lo cual causó que salieran un montón de errores de compilación en todos los proyectos por el JAR faltante y que ya no se encontraban varias clases.

Lo que siguió fue empezar a agregar, uno por uno, los módulos que vayan siendo necesarios. En el caso de esta aplicación, utilizamos ApplicationContext para conectar y configurar todos los componentes, además de los módulos de JDBC para interacción con base de datos, algo de transaccionalidad (con anotación   además de usar directamente un PlatformTransactionManager en algunos casos), el JavaMailSender y algunos post-procesadores propios de la aplicación para simplificar un poco la configuración via XML. No se usa un ORM como Hibernate y se trata de una aplicación JavaSE así que son todos los módulos, de modo que incluí los módulos  ,  ,  ,  ,   y  .

Tuve que modificar el classpath de cada proyecto, eliminando la referencia a spring-2.5.6.jar y agregando referencias a los 6 jars de Spring 3 que necesito. Con eso fueron desapareciendo todos los errores de referencias faltantes, clases faltantes, etc y finalmente todos los proyectos compilaron bien.

Esto resultó en un montón de warnings, principalmente de métodos marcados como deprecated y algunas clases o interfaces también. Algunos que me saltaron fue ParameterizedRowMapper, que ahora se sustituye por RowMapper (que ya es genérico). PreparedStatementCallback ya también es genérico.

Así que de inmediato decidí correr la aplicación para ver si faltaba algo. Lo primero que me salió fue un error de un método faltante en SimpleJdbcTemplate, cosa muy rara dado que el método existe en la clase y de hecho mi código que hace referencia a dicho método compiló bien. Resulta que todavía tenía una referencia a Spring 2.5 en otra librería (jAlarms, nada menos) y por eso fue el problema.

Quité la referencia a Spring 2.5 y dejé solamente las de Spring 3.0; con eso ya pasó de ese error pero salieron otros, de cosas faltantes. Esperaba que iban a necesitarse algunos módulos adicionales en tiempo de ejecución aunque no fueran necesarios para compilar. Haciendo pruebas encontré que necesitaba los módulos   y  ; ya con eso levantó la aplicación.

Cabe mencionar que algunas librerías externas que hacían referencia a Spring 2.5 funcionaron bien con Spring 3.0, sin necesidad de recompilar nada. Por último y ya solamente por limpieza, modifiqué mis XML de los ApplicationContext para que hagan referencia a los XSD de Spring 3.0 en vez de 2.5 (por ejemplo   en vez de  ).

Esta aplicación empezó con Spring 1.0, luego fue actualizada a 1.2 (algo bastante sencillo), de ahí el cambio a 2.0 fue un poco rudo porque vino acompañado también de cambio a Java 5 (estaba en 1.4). El cambio a Spring 2.5 fue también algo tranquilo, solamente se aprovechó para utilizar algunas cosas nuevas que venían en la 2.0, y ahora el cambio a Spring 3.0 creo que fue también el cambio más sencillo, al menos tomando los cambios de versión mayor (1 a 2, 2 a 3). En mi opinión esto significa que el framework ha madurado bastante, ya no es necesario modificar lo que ya existe sino solamente le están agregando nueva funcionalidad.

Seguramente el cambio debe ser un poco más complejo en aplicaciones web, pero todavía no he hecho pruebas (mi conejillo de indias será JavaMexico 2.0, ya escribiré aquí como comentarios lo que encuentre al migrar a Spring 3.0 ese proyecto). Se aceptan aquí otras anécdotas, sugerencias, etc.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de 1a1iux

No leí bien o..

no comentas porqué decidiste moverte a la versión 3.0.

¿Algo en particular en esa versión te llamó la atención, o simplemente querías tener actualizado el Spring?

Sale y vale
Byte

Imagen de ezamudio

Motivo

OK buena pregunta. El motivo principal es mantenernos al día y pues coincidió que tuvimos una ventana de tiempo con baja actividad en el desarrollo que nos permitió hacer la actualización (con las medidas necesarias para hacer rollback en caso de que saliera un bomberazo o que el upgrade fuera muy tortuoso y se nos acabara el tiempo).

Sobre los nombres de los jars

Lo que comentas de los nombres de los jars (org.springframework.core-3.0.0.RELEASE.jar) es porque los bajaste directo de la página de spring (como zip) o desde el enterprise repository de spring source. En estos repositorios los jars están renombrados porque los jars están preparados para montarse en un ambiente OSGi (como el dmServer). En ibiblio (Maven Central) están los jars con el nombre como en las versiones anteriores (spring-core-3.0.0.RELEASE.jar).

Saludos

Imagen de willyxoft

Actualización

Buena reseña y gracias por compartir tu experiencia.

Por lo que entiendo la actualización que realizaste si limitó a que la aplicación actual funcione con la nueva versión de Spring, mas no leí nada de actualizar el código para aprovechar las nuevas características de Spring 3.0.

Por lo que la pregunta obligada es ¿Tiene(n) pensado hacerlo? De ser así espero que puedas compartirnos tu experiencia al respecto. Y si no es abuso espero que tambien puedas contarnos que mejoras (respecto a Spring) implementaste desde las versiones anteriores ;)

Saludos,
Willy Mejía.

Imagen de ezamudio

Cambios en código

Por el momento solamente hice los cambios mencionados en el blog, que fueron para evitar warnings en el compilador por clases o métodos marcados deprecated. Seguimos en proceso de revisar las cosas nuevas que trae Spring 3 con respecto a 2.5 para ver qué podemos aprovechar.

De la versión 1 a la 2 y 2.5 de Spring sí hicimos varios cambios porque fue de la mano con cambio de JDK 1.4 a 5; unos importantes que recuerdo fue utilizar los ParameterizedRowMappers (ahora simplemente RowMappers), con el SimpleJdbcTemplate en vez de JdbcTemplate; empezar a usar las anotaciones @Autowired, @Resource, @Required en las propiedades de los beans que queremos configurar con Spring, al igual que algunas de @Transactional, y en la configuración por XML, los esquemas en vez de DTD, para poder extender y simplificar la configuración de algunos componentes con nuestros propios procesadores de beans.

Imagen de pacovr

Migracion spring 2.5 a 3

Un problema que me dio a mi al realizar esa migración fue que para spring 3 se quito el soporte para JTOM (JtaTransactionManager), en la web me encontre muchos comentarios de solo agregar la clase. Al final tuve que modificar código para no depender de JTOM.

Otro problema es que al separar el jar de spring en jars de acuerdo a funcionalidad: core, context, beans, etc. Salio a relucir lo que pienso es un bug de spring:
No resuelve los META-INF/spring.schemas de manera correcta cuando estas en un entorno sin internet. Esto hasta la version 3.0.2.RELEASE, esperemos que lo arreglen en siguientes versiones.

Si tienen este problema aqui les dejo una solución temporal que realice:

Saludos
pacovr.