Como hemos visto en la anterior entrada, para instalar Spring Android necesitamos gestionar una serie de dependencias externas. Desgraciadamente Android no tiene ningún mecanismo para compilar dependencias externas dentro de un proyecto.
Podríamos añadir las dependencias externas manualmente como ficheros jar e incluirlos en el classpath en Eclipse. Pero manejar dependencias manualmente, como ya sabemos, no es una buena idea (una discusión al respecto). Por lo tanto vamos a desarrollar nuestros proyectos Spring Android incluyendo Maven Android Plugin. Para ello incluiremos un fichero pom.xml que se encargue de gestionar estas dependencias externas. Así vamos a poder arrancar nuestras aplicaciones Android desde línea de comando con Maven ó si lo preferimos tenemos un plugin para Eclipse, STS u otro IDE que nos permite trabajar con Maven en nuestros proyectos Spring Android desde nuestro IDE favorito.
El fichero pom.xml que vamos a incluir en nuestros proyectos tiene un par de cosas que merecen ser explicadas para configurar el Maven Android Plugin.
- Los proyectos Android son desplegados en el dispositivo como ficheros apk en lugar de jar. Esto se hace indicando apk como packaging en el pom.xml.
apk
- Además para incluir el plugin Maven Android a nuestros proyecto tendremos que incluir en el elemento build de nuestro pom.xml la siguiente entrada. Podemos ver que añadimos los plugin para Maven Android y Maven Compiler. El SDK de mi proyecto como podemos ver corresponde a la versión 2.1.
<build> <finalName>${project.artifactId}</finalName> <sourceDirectory>src</sourceDirectory> <plugins> <plugin> <groupId>com.jayway.maven.plugins.android.generation2</groupId> <artifactId>maven-android-plugin</artifactId> <version>2.8.4</version> <configuration> <sdk> <platform>7</platform> </sdk> <emulator> <avd>avd_2.1</avd> </emulator> <deleteConflictingFiles>true</deleteConflictingFiles> <undeployBeforeDeploy>true</undeployBeforeDeploy> </configuration> <extensions>true</extensions> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> </plugin> </plugins> </build>
Una vez añadidos los plugins, necesitamos incluir las dependencias externas que añaden la funcionalidad a nuestro RestTemplate para hacer JSON marshalling, XML marshalling ó RSS y Atom feed.
<dependencies> <dependency> <groupId>com.google.android</groupId> <artifactId>android</artifactId> <version>2.1.2</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework.android</groupId> <artifactId>spring-android-rest-template</artifactId> <version>1.0.0.BUILD-SNAPSHOT</version> </dependency> <dependency> <!-- Using Jackson for JSON marshaling --> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.7.1</version> </dependency> <dependency> <!-- Using Simple for XML marshaling --> <groupId>org.simpleframework</groupId> <artifactId>simple-xml</artifactId> <version>2.4.1</version> <exclusions> <exclusion> <artifactId>stax</artifactId> <groupId>stax</groupId> </exclusion> <exclusion> <artifactId>stax-api</artifactId> <groupId>stax</groupId> </exclusion> </exclusions> </dependency> <dependency> <!-- Using Android ROME for RSS and ATOM feeds --> <groupId>com.google.code.android-rome-feed-reader</groupId> <artifactId>android-rome-feed-reader</artifactId> <version>1.0.0-r2</version> </dependency> </dependencies> <repositories> <!-- For developing with Android ROME Feed Reader --> <repository> <id>android-rome-feed-reader-repository</id> <name>Android ROME Feed Reader Repository</name> <url>https://android-rome-feed-reader.googlecode.com/svn/maven2/releases</url> </repository> <!-- For testing against latest Spring snapshots --> <repository> <id>org.springframework.maven.snapshot</id> <name>Spring Maven Snapshot Repository</name> <url>http://maven.springframework.org/snapshot</url> <releases><enabled>false</enabled></releases> <snapshots><enabled>true</enabled></snapshots> </repository> <!-- For developing against latest Spring milestones --> <repository> <id>org.springframework.maven.milestone</id> <name>Spring Maven Milestone Repository</name> <url>http://maven.springframework.org/milestone</url> <snapshots><enabled>false</enabled></snapshots> </repository> </repositories>
Finalmente para desplegar aplicaciones con el plugin de Maven Android necesitamos añadir a nuestro PATH la ruta a nuestra carpeta tools y platform-tools que tengamos en nuestra versión del SDK. Hecho esto tenemos todo listo para ejecutar por primera vez nuestra aplicación de Android desde Maven. Hay varios ejemplos colgados del repositorio de Spring Source para Spring Android. En mi caso he utilizado un pequeño trozo de código que viene como ejemplo básico y que permite buscar un término en Google. Como no me quería complicar mucho la vida de momento he mandado al log el resultado de la búsqueda.
RestTemplate restTemplate = new RestTemplate(); String url = "https://ajax.googleapis.com/ajax/services/search/web?v=1.0&q={query}"; String result = restTemplate.getForObject(url, String.class, "hop2croft"); Log.d(TAG,result);
Y ahora sólo queda:
1. construir la aplicación:
$ mvn clean install
2. arrancar el emulador con el dispositivo AVD que hayamos incluido en nuestro pom.xml:
$ mvn android:emulator-start
3. desplegar la aplicación en el emulador:
$ mvn android:deploy
4. como en nuestro caso queremos ver el log, lo vamos a arrancar:
$ adb logcat
La salida que produce nuestra aplicación es la siguiente.
02-27 11:14:43.084: DEBUG/MyActivity(215): {"responseData": {"results":[{"GsearchResultClass":"GwebSearch","unescapedUrl":"http://lanyrd.com/2011/spring-io/writeups/","url":"http://lanyrd.com/2011/spring-io/writeups/","visibleUrl":"lanyrd.com","cacheUrl":"http://www.google.com/search?q\u003dcache:1xfPou-ZIakJ:lanyrd.com","title":"Write-ups from Spring I/O 2011, 17th-18th February 2011 | Lanyrd","titleNoFormatting":"Write-ups from Spring I/O 2011, 17th-18th February 2011 | Lanyrd","content":"18 Feb 2011 \u003cb\u003e...\u003c/b\u003e Write-up Spring IO 2011 día 2 « hop2croft\u0026#39;s Blog (\u003cb\u003ehop2croft\u003c/b\u003e.wordpress.com). from Spring I/O 2011, 17th-18th February 2011. Added 3 days ago \u003cb\u003e...\u003c/b\u003e"},{"GsearchResultClass":"GwebSearch","unescapedUrl":"http://lanyrd.com/2011/spring-io/coverage/","url":"http://lanyrd.com/2011/spring-io/coverage/","visibleUrl":"lanyrd.com","cacheUrl":"http://www.google.com/search?q\u003dcache:Fg3pLG-Gc-YJ:lanyrd.com","title":"Coverage of Spring I/O 2011, 17th-18th February 2011 | Lanyrd","titleNoFormatting":"Coverage of Spring I/O 2011, 17th-18th February 2011 | Lanyrd","content":"18 Feb 2011 \u003cb\u003e...\u003c/b\u003e Write-up Spring IO 2011 día 2 « hop2croft\u0026#39;s Blog (\u003cb\u003ehop2croft\u003c/b\u003e \u003cb\u003e...\u003c/b\u003e"},{"GsearchResultClass":"GwebSearch","unescapedUrl":"http://sourceforge.net/projects/eclipse-ccase/forums/forum/167189","url":"http://sourceforge.net/projects/eclipse-ccase/forums/forum/167189","visibleUrl":"sourceforge.net","cacheUrl":"http://www.google.com/search?q\u003dcache:yYWKrfxd5LAJ:sourceforge.net","title":"SourceForge.net: Clearcase plugin for Eclipse: Topics for Help","titleNoFormatting":"SourceForge.net: Clearcase plugin for Eclipse: Topics for Help","content":"where\u0026#39;s the cc api??? 2, \u003cb\u003ehop2croft\u003c/b\u003e, 2010-10-15 06:33:43 UTC. Monitor Subscribe \u0026middot; Need a way to create and associate activity \u003cb\u003e...\u003c/b\u003e"},{"GsearchResultClass":"GwebSearch","unescapedUrl":"https://hop2croft.wordpress.com/2011/02/21/spring-io-2011-dia-2/","url":"https://hop2croft.wordpress.com/2011/02/21/spring-io-2011-dia-2/","visibleUrl":"hop2croft.wordpress.com","cacheUrl":"http://www.google.com/search?q\u003dcache:gNiClj8frpsJ:hop2croft.wordpress.com","title":"Spring IO 2011 día 2 « hop2croft\u0026#39;s Blog","titleNoFormatting":"Spring IO 2011 día 2 « hop2croft\u0026#39;s Blog","content":"febrero 21, 2011 por \u003cb\u003ehop2croft\u003c/b\u003e … y ahora seguimos con el segundo día … que empezo con la keynote In search of the grail of developer productivity – A Grails \u003cb\u003e...\u003c/b\u003e"}],"cursor":{"pages":[{"start":"0","label":1},{"start":"4","label":2},{"start":"8","label":3},{"start":"12","label":4}],"estimatedResultCount":"16","currentPageIndex":0,"moreResultsUrl":"http://www.google.com/search?oe\u003dutf8\u0026ie\u003dutf8\u0026source\u003duds\u0026start\u003d0\u0026hl\u003den\u0026q\u003dhop2croft"}}, "responseDetails": null, "responseStatus": 200}
Si lo que queremos es lanzar nuestra app Android desde un IDE tipo Eclipse necesitamos instalar el Maven Integration for Android Development Tools que integra Maven Android Plugin, ADT y m2eclipse. Para su instalación recomiendo echarle un ojo a la siguiente dirección. Sólo tienes que instalar los plugins como te dice la guía, activar las dependencias de nuestro proyecto para Maven y lanzar nuestra aplicación.
Si hace tiempo que te has perdido o quieres ver de forma más precisa todo el proceso para añadir Maven a Spring Android te recomiento que leas esta entrada. En ella me he basado para escribir este post.
Espero que os haya servido para acercaros a Spring Android.
NOTAS:
– De momento estoy editando con el editor Web de WordPress. La verdad es que es un poco engorroso y hay cosas que me gustaría corregir, como por ejemplo la identación en los trozos de código que se pegan. Buscaré algún editor que haga todo más fácil pero si hay alguien que me recomiende alguno soy todo oídos.
– Antes de instalar el plugin de Maven Android en un IDE estuve dándole vueltas a cual elegir. Normalmente desarrollo en Android con Eclipse 3.6, pero últimamente he estado haciendo otras cosas con STS. Sin embargo en la página de Eclipse observé que había un IDE especial para desarrollo móvil llamado Eclipse Pulsar. Me decidí a instalarlo y cual fue mi sorpresa al ver qué sólo viene por defecto los frameworks para Blackberry, Motorola y Nokia. ¿Cuál es el sentido de tener un IDE específico para desarrollo móvil si el OS más utilizado actualmente, iOS aparte, no está presente?. Finalmente lo instalé en Eclipse 3.6.