Uno de los cambios derivados de nuestra migración a Play! como framework MVC para aplicaciones web Java, es el uso de Ant como gestor de builds. En Trabe utilizamos Maven habitualmente, ya que nuestros proyectos se adaptan bien a la estructura y ciclo de vida que marca esta herramienta, sin embargo, las aplicaciones Play! y sus módulos definen su propia estructura de directorios y utilizan Ant. Maven está muy bien cuando te ciñes a su estructura de proyecto, pero si haces algo distinto se hace necesario escribir descriptores gigantes y, francamente, el soporte Ant de Play está suficientemente bien como para aceptar el cambio.
Usar Ant en este contexto sólo tiene un problema: Ant no gestiona dependencias. Para solventarlo, como no tenía mucho tiempo para pensármelo, opté inicialmente por combinar Ant y Maven. Esta solución es aplicable a cualquier proyecto que utilice Ant como gestor de builds, no sólo a los proyectos Play!
Para gestionar las dependencias con Maven, lo primero es crear un POM con lo mínimo:
<?xml version="1.0" encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.4trabes</groupId><artifactId>awesome</artifactId><packaging>jar</packaging><version>1.0-SNAPSHOT</version><name>4Trabes awesome Play library</name><dependencies><dependency><groupId>org.op4j</groupId><artifactId>op4j</artifactId><version>1.0</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><configuration><outputDirectory>lib/</outputDirectory></configuration></plugin></plugins></build></project>
Mínima información acerca del proyecto, nuestra lista de dependencias (sin preocuparse de los scopes) y, muy importante, la configuración del plugin de dependencias para que copie las librerías en el directorio lib (o en otro lado, a gusto del consumidor).
Ahora es cuestión de añadir a nuestro build.xml una tarea que invoque el goal copy-dependencies del plugin dependency de Maven:
Pan comido. Cada vez que ejecutemos ant deps se descargarán las librerías que no tengamos.
Si se trata de un proyecto Play!, es buena idea configurar el plugin de dependencias para que excluya las librerías que vienen de serie con el framework para evitar conflictos. Aquí os dejo las exclusiones para la versión 1.0.2.1 (creo que están todas).
Aunque esta solución es válida decidí investigar un poco más y finalmente decidí cambiar Maven2 por Ivy, que me parece más “natural”. Pero eso lo dejo para otro post.
Desde hace unos meses estoy “viviendo en edge”. Para ello estoy usando rvm , que nos permite tener varias versiones de ruby con sus correspondientes gemas.
Tras actualizar a la beta de rails e intentar ejecutar la consola (con el nuevo comando rails console ) me topé con el siguiente error:
123456789
$ rails console
/home/andion/.rvm/rubies/ruby-1.9.1-p378/lib/ruby/1.9.1/irb/completion.rb:9:in `require': no such file to load -- readline (LoadError)
from /home/andion/.rvm/rubies/ruby-1.9.1-p378/lib/ruby/1.9.1/irb/completion.rb:9:in `<top (required)>'
from /home/andion/.rvm/gems/ruby-1.9.1-p378/gems/railties-3.0.0.beta/lib/rails/commands/console.rb:3:in `require'
from /home/andion/.rvm/gems/ruby-1.9.1-p378/gems/railties-3.0.0.beta/lib/rails/commands/console.rb:3:in `<top (required)>'
from /home/andion/.rvm/gems/ruby-1.9.1-p378/gems/railties-3.0.0.beta/lib/rails/commands.rb:32:in `require'
from /home/andion/.rvm/gems/ruby-1.9.1-p378/gems/railties-3.0.0.beta/lib/rails/commands.rb:32:in `<top (required)>'
from /home/andion/git/efimera-eopages/script/rails:10:in `require'
from /home/andion/git/efimera-eopages/script/rails:10:in `<main>'
Cuando me encontré con el problema estaba usando rvm0.1.23, rails3.0.0.beta y ruby1.9.1 pero supongo que la solución será extensible a las siguientes betas de rails (ahora mismo uso rails3 beta 3 y ruby 1.9.2 y todo sigue bien tras el fix)
Revisé algunas soluciones, pero todas estaban orientadas al uso de un ruby de sistema y no a través de rvm, además, la solución que ofrece la web de rvm aunque parecía lógica, tampoco me funcionaba:
Googleando un poco más si que he visto alguna gente con el mismo problema por aquí y por allá
La solución para mí: una mezcla de las solución que da rvm y la sabiduría popular: reinstalar ruby 1.9.1 con el flag: readline-dir a un directorio válido para rvm: