Spring Android 和 Maven(第一部分)

工程 | Roy Clarkson | 2010年12月17日 | ...

我们最近宣布了Spring Android 的 M1 版本,该版本发布后,围绕如何构建使用 Spring Android Rest Template 和 Spring Android Commons Logging 库的 Android 应用程序出现了一些问题。Google 提供了几种编译 Android 应用程序的方法,包括 SDK 命令行工具和 Eclipse 的 ADT(Android 开发工具)插件。不幸的是,这些方法都不包含集成的依赖项管理支持。

概述

作为 Java 开发人员,我们已经开始欣赏诸如MavenGradle之类的工具来管理外部依赖项。虽然传统的 Java 应用程序在 JVM 中运行,但 Android 应用程序在 Dalvik 虚拟机上运行。Dalvik VM 执行 Dalvik 可执行文件 (.dex) 格式的文件。它运行由 Java 语言编译器编译并转换为 .dex 格式的类。如果构建工具能够编译具有依赖项的兼容 Android 应用程序,则需要支持此过程。

在 Android 应用程序中包含外部库基本上有两种方法。第一种方法是手动将 jar 文件复制到项目中的 libs 目录中,并在 Eclipse 中更新类路径。这是最简单的解决方案,也是 ADT 插件最支持的解决方案。缺点是您必须手动管理依赖项。或者,可以使用Maven Android Plugin之类的第三方插件来自动包含来自 Maven 存储库的依赖项。

在这篇文章中,我将逐步介绍如何使用 Android 命令行工具、Maven、Maven Android Plugin 和Android Maven 工件编译一个使用 Spring Android 库的示例应用程序,并将其部署到 Android 模拟器。配置 Maven 后,可以轻松创建构建、将其部署到模拟器、运行测试以及打包应用程序以部署到 Android Market。在运行示例代码之前,我们将首先重点介绍 pom.xml 中所需的配置设置。此示例中使用的组件列在下面。

Maven 配置

本节介绍使用 Spring Android 和 Maven Android Plugin 开发所需的 pom.xml 部分。

Maven Android Plugin

为了使用 Maven 构建 Android 应用程序,您需要在 pom.xml 文件中配置 Maven Android Plugin。Android 应用程序作为 apk 文件部署到设备,而不是 jar 文件。您必须在打包配置中指定这一点。


<packaging>apk</packaging>

要在构建任务中配置 Maven Android 和 Maven Compiler 插件,请将 sdk 平台设置为所需级别。在此示例中,它设置为 9,对应于 Android 版本 2.3.1。模拟器 avd 值是在 AVD 管理器中定义的 AVD(Android 虚拟设备)的名称。在本例中,AVD 的名称为“9”,但 AVD 可以命名为您喜欢的任何名称,只要它与创建 AVD 时指定的名称匹配即可。这是构建和运行 Android 应用程序所需的插件的基本配置。可以包含其他参数以获得更多功能。


<build>
	<sourceDirectory>src</sourceDirectory>
	<finalName>${project.artifactId}</finalName>
	<plugins>
		<plugin>
			<groupId>com.jayway.maven.plugins.android.generation2</groupId>
			<artifactId>maven-android-plugin</artifactId>
			<version>2.8.4</version>
			<configuration>
				<sdk>
					<platform>9</platform>
				</sdk>
				<emulator>
					<avd>9</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>

依赖项

Android 工件已通过Android for Maven 项目的努力构建并发布到 Maven 存储库。Google 阻止将官方 Android jar 文件上传到 Maven,因此启动了第三方 Android for Maven 项目以提供可以上传到 Maven 存储库的与 API 兼容的 Android 工件。现在 Maven 存储库中提供了每个主要 Android 版本的工件。但是,这些工件没有功能,只提供 API 的存根实现。所有类中的所有方法都会引发运行时异常。由于 Android 应用程序在设备上运行,因此它永远不会使用这些库进行执行,但 API 兼容性允许应用程序像使用真实库一样进行编译。更多信息可以在这里找到。

要使用依赖项编译 Android 应用程序,您需要包含您的应用程序的目标 Android 版本。如前所述,我们使用级别 9,对应于版本 2.3.1。请查看Maven 存储库以了解可用版本。您必须将 android 依赖项范围设置为**provided**,否则 Maven 将尝试将 Android jar 库包含到您的 apk 中。


<dependency>
	<groupId>com.google.android</groupId>
	<artifactId>android</artifactId>
	<version>2.3.1</version>
	<scope>provided</scope>
</dependency>

通过添加以下依赖项来编译针对 Spring Android Rest Template 的最新里程碑版本的代码。


<dependency>
	<groupId>org.springframework.android</groupId>
	<artifactId>spring-android-rest-template</artifactId>
	<version>1.0.0.M2</version>
</dependency>

包含快照和里程碑构建的存储库,以便在您的应用程序中使用最新构建或里程碑版本的 Spring Android 库。


<repositories>
	<!-- 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>

开发环境

开发 Android 应用程序需要 Android SDK。如前所述,Google 提供命令行工具和一个 Eclipse 插件来构建 Android 应用程序,但是您并不局限于这些选项。其他 IDE 也提供对构建 Android 应用程序的支持。Maven Android Plugin 利用 Android SDK 命令行工具来编译并将应用程序部署到模拟器,因此无需单独设置或配置 IDE。

可以在 Android 网站上找到有关下载和安装 Android SDK的说明。请注意,Android SDK 版本 8更改了一些工具的位置。除了**tools**目录外,还必须将**platform-tools**目录添加到您的路径中。

例如,Mac 上的 .bash_profile 可能如下所示。

export ANDROID_HOME=~/android-sdk-mac_x86
export PATH=${PATH}:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools

配置 Android 虚拟设备

要运行 Android 应用程序,必须配置Android 虚拟设备(AVD)。AVD 是模拟器选项的配置。换句话说,您正在定义运行模拟器时要使用的设置。您可以使用名称保存配置并在以后使用它。您还可以定义多个 AVD 以针对不同的 Android 版本或硬件配置进行测试。

示例 Android 客户端应用程序附带的 pom.xml 文件指定了一个名为“9”的 AVD。为了使 Maven 能够部署 Android 应用程序,您必须配置一个具有相同名称的 AVD。这一点特别重要,因为所有开发人员机器都需要配置相同的 AVD,因为 pom.xml 通常会提交到源代码管理。

  1. 在命令行中,键入**android**并按回车键。这将打开**Android SDK 和 AVD 管理器**窗口。
  2. 选择左侧栏中的**虚拟设备**,然后单击**新建...**按钮
  3. 在**名称**字段中输入**9**
  4. 在**目标**选择器中选择**Android 2.3.1- API 级别 9**
  5. 单击**创建 AVD**完成操作

示例应用程序

我们已经为 Spring Mobile 项目设置了一个示例存储库。从命令提示符下,使用以下命令将存储库克隆到本地机器。

$ git clone git://git.springsource.org/spring-mobile/samples.git spring-mobile-samples

启动服务器

如果您想运行示例应用程序的服务器组件以查看 Android 客户端和 Spring MVC 网站之间的交互,最简单的方法是从 STS IDE 中进行。导航到**spring-android-showcase**目录。有两个目录,“client”用于客户端 Android 应用程序,“server”用于 Spring MVC 服务器应用程序。客户端应用程序向服务器发出网络请求以说明 RestTemplate 功能,因此服务器必须运行才能使客户端正常工作。

  1. 在 STS 中,选择**文件 -> 导入...**
  2. 在**常规**文件夹中,选择**将现有项目导入工作区**,然后单击**下一步**
  3. 单击**浏览**并导航到**spring-android-showcase**目录的**服务器**目录
  4. 单击**打开**将项目添加到您的工作区
  5. 突出显示**包资源管理器**视图中的**spring-android-showcase-server**项目,并将其拖动到**服务器**视图中的**SpringSource tc Server Developer Edition**以部署 Web 应用程序
  6. 最后,单击**运行**按钮启动服务器

运行 Android 客户端

要构建客户端应用程序,请从命令行输入以下命令

$ mvn clean install

输入以下命令启动 Android 模拟器。Maven 尝试启动 pom.xml 中配置的名称的 AVD,这就是为什么名称需要与您创建的实际 AVD 的名称匹配的原因。

$ mvn android:emulator-start

最后,使用以下命令将应用程序部署到模拟器。

$ mvn android:deploy

应用程序部署到模拟器为 S2Android Showcase。在运行应用程序之前,启动 Android 日志查看器以查看应用程序的活动。在进行开发时,您将花费大量时间使用 Android 日志。要查看日志,请在命令提示符下执行以下命令。

$ adb logcat

恭喜!您现在已经使用 Maven 管理的依赖项构建并部署了 Android 应用程序。

结论

在 Android 开发过程中添加 Maven 会增加额外的复杂性,但它能够编译包含来自 Maven 仓库外部依赖项的 Android 应用。如果没有它,您将不得不手动下载编译和运行应用程序所需的依赖项。我们已经展示了使用它进行依赖项管理以使用 Spring Android 库进行构建的好处。在第二部分文章中,我将介绍在 Eclipse 中使用Android 开发工具的 Maven 集成插件和ADT(Android 开发工具)插件进行 Android 开发。m2eclipse 和 ADT 插件都不支持使用 Maven 依赖项构建 Android 应用程序。Android 开发工具的 Maven 集成插件为 Maven Android 插件提供了一个桥梁,从而能够在 Eclipse 中为 Android 项目启用 Maven 依赖项管理。如果您更喜欢使用 Eclipse 进行开发,我将在下一篇文章中讨论如何使用这些插件。

其他资源

Maven:完整参考手册的 Android 章节包含许多关于 Maven Android 插件的良好信息。

获取 Spring 简讯

通过 Spring 简讯保持联系

订阅

领先一步

VMware 提供培训和认证,以快速提升您的进步。

了解更多

获取支持

Tanzu Spring 通过一个简单的订阅提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部