Feb

27

Posted by : hopcroft | On : 27/02/2011

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.

[sourcecode language="xml"]
apk
[/sourcecode]

  • 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.

[sourcecode language="xml"]
<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>

[/sourcecode]

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.

[sourcecode language="xml"]
<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>

[/sourcecode]

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.

[sourcecode lang="java"]
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);
[/sourcecode]

Y ahora sólo queda:
1. construir la aplicación:

[sourcecode lang="java"]$ mvn clean install[/sourcecode]

2. arrancar el emulador con el dispositivo AVD que hayamos incluido en nuestro pom.xml:

[sourcecode lang="java"]$ mvn android:emulator-start[/sourcecode]

3. desplegar la aplicación en el emulador:

[sourcecode lang="java"]$ mvn android:deploy[/sourcecode]

4. como en nuestro caso queremos ver el log, lo vamos a arrancar:

[sourcecode lang="java"]$ adb logcat[/sourcecode]

La salida que produce nuestra aplicación es la siguiente.

[sourcecode lang="xml"]
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?qu003dcache: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 u003cbu003e...u003c/bu003e Write-up Spring IO 2011 día 2 « hop2croftu0026#39;s Blog (u003cbu003ehop2croftu003c/bu003e.wordpress.com). from Spring I/O 2011, 17th-18th February 2011. Added 3 days ago u003cbu003e...u003c/bu003e"},{"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?qu003dcache: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 u003cbu003e...u003c/bu003e Write-up Spring IO 2011 día 2 « hop2croftu0026#39;s Blog (u003cbu003ehop2croftu003c/bu003e u003cbu003e...u003c/bu003e"},{"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?qu003dcache:yYWKrfxd5LAJ:sourceforge.net","title":"SourceForge.net: Clearcase plugin for Eclipse: Topics for Help","titleNoFormatting":"SourceForge.net: Clearcase plugin for Eclipse: Topics for Help","content":"whereu0026#39;s the cc api??? 2, u003cbu003ehop2croftu003c/bu003e, 2010-10-15 06:33:43 UTC. Monitor Subscribe u0026middot; Need a way to create and associate activity u003cbu003e...u003c/bu003e"},{"GsearchResultClass":"GwebSearch","unescapedUrl":"http://hop2croft.wordpress.com/2011/02/21/spring-io-2011-dia-2/","url":"http://hop2croft.wordpress.com/2011/02/21/spring-io-2011-dia-2/","visibleUrl":"hop2croft.wordpress.com","cacheUrl":"http://www.google.com/search?qu003dcache:gNiClj8frpsJ:hop2croft.wordpress.com","title":"Spring IO 2011 día 2 « hop2croftu0026#39;s Blog","titleNoFormatting":"Spring IO 2011 día 2 « hop2croftu0026#39;s Blog","content":"febrero 21, 2011 por u003cbu003ehop2croftu003c/bu003e … y ahora seguimos con el segundo día … que empezo con la keynote In search of the grail of developer productivity – A Grails u003cbu003e...u003c/bu003e"}],"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?oeu003dutf8u0026ieu003dutf8u0026sourceu003dudsu0026startu003d0u0026hlu003denu0026qu003dhop2croft"}}, "responseDetails": null, "responseStatus": 200}
[/sourcecode]

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.

Feb

27

Posted by : hopcroft | On : 27/02/2011

En este post voy a hablar sobre Spring Android ya que fue la opción más votada de la anterior entrada, gracias a la única persona que votó :) .
Dentro del grupo de proyectos en los que está involucrado Spring podemos ver que hay dos que están enfocados al desarrollo de aplicaciones sobre dispositivos móviles, Spring Mobile y Spring Android. Mientras que Spring Mobile extiende Spring MVC para desarrollar aplicaciones web en dispositivos móbiles, Spring Android se centra en el desarrollo de aplicaciones Android nativas.
Por el momento vamos a explicar un poco como funciona Spring Android y dar algunos ejemplos, Spring Mobile quedará para otro post. Para las pruebas voy a utilizar la versión Spring Android 1.0.0.M2. El componente principal de Spring Android es el cliente REST llamado RestTemplate. Al crear una nueva instancia de RestTemplate el constructor establece una serie de objetos que hacen posible la funcionalidad para dicho cliente REST. Los objetos son los siguientes:

  • HttpComponents HttpClient 4.x.  Es el cliente http nativo para Android.  El cliente está disponible a partir de la factoria establecida por defecto HttpComponentsClientHttpRequestFactory.
  • JSON Marshalling.  La funcionalidad requerida para realizar JSON marshalling viene dada por la clase MappingJacksonHttpMessageConverter de la librería externa Jackson JSON Proccesor. Hay que tener en cuenta que sólo tendremos acceso a la clase MappingJacksonHttpMessageConverter si previamente hemos añadido las dependencias a Jackson JSON Proccesor en nuestro classpath.
  • XML Marshalling. La funcionalidad de XML marshalling viene dada por otra librería externa que hay que añadir como dependencia en nuestro classpath. Utilizamos la librería Simple XML Serializer y la clase SimpleXmlHttpMessageConverter para ello.
  • RSS and Atom feed support. Al igual que los dos anteriores, necesitamos una librería externa. En este caso Android RomE Feed Reader junto a las clases SyndFeedHttpMessageConverter, RssChannelHttpMessageConverter y AtomFeedHttpMessageConverter.

Tras esta breve introducción tenemos que preparar nuestro entorno para desarrollar con Spring Android. Lo veremos en la siguiente entrada.