Spring Android 和 Maven(第二部分)

工程 | Roy Clarkson | 2011 年 2 月 9 日 | ...

Spring Android 和 Maven(第一部分) 中,我描述了如何使用 Maven 从命令行构建 Android 应用程序。在这篇文章中,我将向您展示如何在 Eclipse IDE 中使用 Maven 依赖项管理构建 Android 应用程序。该应用程序还将展示 Spring Android 1.0.0.M2 中的最新功能,该功能本周发布。

概述

Maven Android 插件允许您使用 Maven 构建 Android 应用程序并受益于依赖项管理。Google 的 Android 开发工具 (ADT) 插件允许您在 Eclipse IDE 中开发和构建 Android 应用程序。为了在 Eclipse 中获得 Maven 依赖项管理,需要 Android 开发工具的 Maven 集成 插件,该插件集成了 m2eclipse、ADT 插件和 Maven Android 插件。这篇文章将向您展示如何安装此插件并使用它在 Eclipse IDE 中实现基于 Maven 的依赖项管理。

本文中使用的每个组件的具体版本列在下面

配置 Eclipse

在构建或编译任何代码之前,我们需要安装和配置所需的 Eclipse 插件。在 <a href="第一部分 中,我讨论了安装 Android SDK,因此我假设您已经这样做了。但是,如果您还没有,则需要在继续之前安装它。此外,您还需要已经安装了 Eclipse 3.5 或更高版本。在本例中,我使用的是基于 Eclipse 3.6.1 的 SpringSource Tool Suite 2.5.2。

需要安装三个 Eclipse 插件,即 Eclipse 的 ADT 插件、Eclipse 的 Maven 集成和 Android 开发工具的 Maven 集成。您可以使用两种方法安装这些插件,要么使用 Eclipse Marketplace 客户端,要么手动安装每个插件。

使用 Eclipse Marketplace 客户端安装插件

根据您的 Eclipse 版本,您可能已经安装了 Eclipse Marketplace 客户端。Marketplace 客户端将简化插件安装,因为它将传递包含任何必需的插件。

  1. 通过选择 **帮助 -> Eclipse Marketplace...** 打开 Eclipse Marketplace 客户端。
  2. 在 **查找:** 字段中输入 m2eclipse-android,然后单击 **转到** 按钮。
  3. 单击 Android 开发工具的 Maven 集成 旁边的 **安装** 按钮。
    eclipse-marketplace-search
  4. 单击 **下一步** 按钮以确认所选功能。请注意,Android 开发工具和 Eclipse 的 Maven 集成是依赖项。
    eclipse-marketplace-confirm
  5. 接受许可协议,然后单击 **完成** 按钮以完成安装。
  6. 重新启动 Eclipse 后,您需要设置 Android SDK 位置,如下一节中 ADT 插件安装中所述。

手动插件安装

使用 Marketplace 客户端的替代方法是手动安装每个插件。如果您从 Marketplace 安装了插件,则可以跳到示例 Android 应用程序部分。对于每个插件,从 Eclipse **帮助** 菜单中,选择 **安装新软件...** 并单击 **添加...** 按钮。

Eclipse Install New Software

Eclipse 的 ADT 插件

第一步是安装 Eclipse 的 ADT(Android 开发工具)插件。这是 Google 提供的用于开发 Android 应用程序的官方插件。如果您已经安装了 ADT 插件,则通过从 Eclipse **帮助** 菜单运行 **检查更新** 来验证您是否拥有最新版本。

  1. 为 **名称** 输入 ADT 插件,为 **位置** 输入以下 URL。单击 **确定** 继续。
    ```sourcecode https://dl-ssl.google.com/android/eclipse ```
  2. 在“可用软件”对话框中,选中“开发工具”旁边的复选框,然后单击“下一步”。
    adt-plugin-available-software
  3. 在下一个窗口中,您将看到要下载的工具列表。单击 **下一步**。
  4. 阅读并接受许可协议,然后单击 **完成**。
  5. 安装完成后,重新启动 Eclipse。
  6. Eclipse 重新启动后,通过从 Eclipse 菜单中选择 **首选项** 并选择左侧列中的 **Android** 来设置 Android SDK 位置。在我的机器上,SDK 文件夹位于我的配置文件文件夹中。配置位置后,您应该会看到一个 SDK 目标列表。
    eclipse-android-sdk-location
  7. 注意:如果您在 ADT 安装方面遇到任何问题,Android 网站 可以提供其他信息。

    Eclipse 的 Maven 集成

    下一步是安装 m2eclipse 插件。STS 2.5.2 附带此插件。但是,如果您有以前的版本,或者如果您已经安装了插件,则需要验证您是否拥有最新版本。Android 开发工具的 Maven 集成需要 0.12.0 或更高版本。

    1. 为 **名称** 输入 m2eclipse Core 更新站点,为 **位置** 输入以下 URL。单击 **确定** 继续。
      ```sourcecode http://m2eclipse.sonatype.org/sites/m2e ```
    2. 在“可用软件”对话框中,选中 Eclipse 的 Maven 集成 旁边的复选框,然后单击 **下一步**。
      m2eclipse-plugin-available-software
    3. 在下一个窗口中,您将看到要下载的组件列表。单击 **下一步**。
    4. 阅读并同意 Eclipse Public License v1.0 的条款,然后单击 **完成**。
    5. 安装完成后,重新启动 Eclipse。
    6. Android 开发工具的 Maven 集成

      我们还有一个插件需要安装,这就是将所有这些功能整合在一起的插件。在您设置了 Android SDK 并配置了 Eclipse 中的 ADT 插件后,安装 Android 开发工具的 Maven 集成 插件。

      1. 从 Eclipse **帮助** 菜单中,选择 **安装新软件...** 并单击 **添加...** 按钮
      2. 为 **名称** 输入 Android 开发工具的 Maven 集成更新站点,为 **位置** 输入以下 URL。单击 **确定** 继续。
        ```sourcecode https://svn.codespot.com/a/eclipselabs.org/m2eclipse-android-integration/updates/m2eclipse-android-integration/ ```
      3. 在“可用软件”对话框中,选中 Android 开发工具的 Maven 集成 旁边的复选框,然后单击 **下一步**。
        m2eclipse-android-plugin-available-software
      4. 在下一个窗口中,您将看到要下载的组件列表。单击 **下一步**。
      5. 阅读并接受许可协议,然后单击 **完成**。
      6. 安装完成后,重新启动 Eclipse。

      示例 Android 应用程序

      现在我们已经安装并配置了所有必要的插件,我们准备使用示例 Android 应用程序来试用我们的设置。我们将使用为第一部分博文创建的相同示例应用程序,但是示例应用程序已更新为在最新的 Android 平台 SDK 2.3.1 API 级别 9 上运行。如果您没有安装此 SDK 平台,则需要在构建示例代码之前安装它。

      获取示例项目

      运行以下命令以克隆 Spring Mobile 示例存储库。

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

      如果 git:// URL 无法访问,您可能需要尝试示例存储库的备用 URL。

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

      在 Eclipse 中打开源代码之前,导航到 spring-android-showcase/client 项目目录并验证项目是否使用 Android Maven 插件构建。

      $ mvn clean install
      

      在 Eclipse 中打开项目

      假设项目已从命令行成功构建,我们准备在 Eclipse 中打开该项目。

      1. 从 Eclipse **文件** 菜单中,选择选择 **新建** 和 **项目...**
      2. 从 **Android** 文件夹中选择 Android 项目向导,然后单击 **下一步**。如果 Android 向导不可用,则表示尚未安装 ADT 插件。
        eclipse-new-android-project
      3. 在 **新建 Android 项目** 窗口中,为 **项目名称** 输入 spring-android-showcase-client。选择 **从现有源创建项目**,然后浏览到示例客户端的 **位置**。单击 **完成** 将项目添加到 Eclipse。
        eclipse-new-android-project-settings

      启用 Maven 依赖项管理

      现在,示例项目已加载到 Eclipse 中。您会注意到的第一件事是包资源管理器中项目上方的红色大“X”,这表示它当前无法构建。由于我们尚未为此项目配置 Maven,因此这是预期的行为。

      eclipse-package-explorer-errors

      要启用 Maven 依赖项管理,请右键单击 **包资源管理器** 中的 spring-android-showcase-client,然后从上下文菜单中选择 **Maven -> 启用依赖项管理**。

      eclipse-enable-dependency-management

      示例项目已包含以下 Maven POM 文件。如果您项目中没有现有的 POM,Eclipse 会提示您创建一个。请注意 **build** 部分中 maven-android-pluginmaven-compiler plugin 的使用。

      
      <project xmlns="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/xsd/maven-4.0.0.xsd">
      	<modelVersion>4.0.0</modelVersion>
      	
      	<groupId>org.springframework.android</groupId>
      	<artifactId>spring-android-showcase-client</artifactId>
      	<version>1.0.0.BUILD-SNAPSHOT</version>
      	<packaging>apk</packaging>
      	<name>spring-android-showcase-client</name>
      	<url>http://www.springsource.org</url> 
      	<organization>
      		<name>SpringSource</name>
      		<url>http://www.springsource.org</url>
      	</organization>
      
      	<properties> 
      		<android-platform>9</android-platform>
      		<android-emulator>9</android-emulator>
      		<maven-android-plugin-version>2.8.4</maven-android-plugin-version>
      		<maven-compiler-plugin-version>2.3.2</maven-compiler-plugin-version>
      		<android-version>2.3.1</android-version>
      		<spring-android-version>1.0.0.M2</spring-android-version>
      		<jackson-version>1.7.2</jackson-version>
      		<simple-version>2.4.1</simple-version>
      		<android-rome-version>1.0.0-r2</android-rome-version>
      	</properties>
      
      	<build>
      		<sourceDirectory>src</sourceDirectory>
      		<finalName>${project.artifactId}</finalName>
      		<plugins>
      			<plugin>
      				<groupId>com.jayway.maven.plugins.android.generation2</groupId>
      				<artifactId>maven-android-plugin</artifactId>
      				<version>${maven-android-plugin-version}</version>
      				<configuration>
      					<sdk>
      						<platform>${android-platform}</platform>
      					</sdk>
      					<emulator>
      						<avd>${android-emulator}</avd>
      					</emulator>
      					<deleteConflictingFiles>true</deleteConflictingFiles>
      					<undeployBeforeDeploy>true</undeployBeforeDeploy>
      				</configuration>
      				<extensions>true</extensions>
      			</plugin>
      			<plugin>
      				<artifactId>maven-compiler-plugin</artifactId>
      				<version>${maven-compiler-plugin-version}</version>
      			</plugin>
      		</plugins>
      	</build>
      
      	<dependencies>
      		<dependency>
      			<groupId>com.google.android</groupId>
      			<artifactId>android</artifactId>
      			<version>${android-version}</version>
      			<scope>provided</scope>
      		</dependency>
      		<dependency>
      			<groupId>org.springframework.android</groupId>
      			<artifactId>spring-android-rest-template</artifactId>
      			<version>${spring-android-version}</version>
      		</dependency>
      		<dependency>
      			<!-- Using Jackson for JSON marshaling -->
      			<groupId>org.codehaus.jackson</groupId>
      			<artifactId>jackson-mapper-asl</artifactId>
      			<version>${jackson-version}</version>
      		</dependency>
      		<dependency>
      			<!-- Using Simple for XML marshaling -->
      			<groupId>org.simpleframework</groupId>
      			<artifactId>simple-xml</artifactId>
      			<version>${simple-version}</version>
      			<exclusions>
      				<exclusion>
      					<artifactId>stax</artifactId>
      					<groupId>stax</groupId>
      				</exclusion>
      				<exclusion>
      					<artifactId>stax-api</artifactId>
      					<groupId>stax</groupId>
      				</exclusion>
      			</exclusions>
      		</dependency>
      		<dependency>
      			<!-- Using ROME for RSS and ATOM feeds -->
      			<groupId>com.google.code.android-rome-feed-reader</groupId>
      			<artifactId>android-rome-feed-reader</artifactId>
      			<version>${android-rome-version}</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>
      	
      </project>
      

      Maven 现在将更新所需的依赖项,Eclipse 应该会成功构建项目。Eclipse 完成项目构建后,您现在应该会在 **包资源管理器** 窗口中看到 Maven 依赖项 类路径容器。

      eclipse-package-explorer-maven-enabled

      需要注意两点。首先,您可能会看到项目中有一个 bin 文件夹。您可以从 **Java 构建路径** 属性(如下)中看到,默认输出文件夹是 Target 文件夹。因此,可以安全地删除 bin 文件夹。

      eclipse-java-build-path-sources

      其次,您可能还会注意到添加了一个 JRE 系统库 类路径容器到项目中。由于我们正在构建一个使用 Android JVM 的 Android 应用程序,因此您不需要引用 JRE。如果您在 Eclipse 中使用 ADT 创建了一个新的 Android 应用程序,您就会知道它不会为 JRE 添加类路径容器。我已经与 Android 开发工具的 Maven 集成开发人员 Ricardo Gladwell 讨论了这个问题,他创建了一个 工单 来研究这个问题。我已经从示例项目中删除了 JRE,没有任何明显的负面影响。但是您可能需要关注该问题以获取更多信息。

      启动 Spring Android Showcase 示例应用程序

      要运行示例应用程序,只需在 **包资源管理器** 中选择 spring-android-showcase-client,然后单击 **运行** 按钮。示例客户端中的 Maven POM 文件配置为查找名为“9”的 Android 虚拟设备 (AVD)。如前所述,示例项目已更新为在 Android 平台 SDK 2.3.1 上运行。您需要为此平台配置一个 AVD 才能运行示例。

      eclipse-run

      第一次运行应用程序时,您应该在 Eclipse 控制台中看到类似以下内容

      [2011-02-08 14:00:49 - spring-android-showcase-client] ------------------------------
      [2011-02-08 14:00:49 - spring-android-showcase-client] Android Launch!
      [2011-02-08 14:00:49 - spring-android-showcase-client] adb is running normally.
      [2011-02-08 14:00:49 - spring-android-showcase-client] Performing org.springframework.android.showcase.MainActivity activity launch
      [2011-02-08 14:00:49 - spring-android-showcase-client] Automatic Target Mode: launching new emulator with compatible AVD '9'
      [2011-02-08 14:00:49 - spring-android-showcase-client] Launching a new emulator with Virtual Device '9'
      [2011-02-08 14:00:50 - Emulator] 2011-02-08 14:00:50.936 emulator[5951:903] Warning once: This application, or a library it uses, is using NSQuickDrawView, which has been deprecated. Apps should cease use of QuickDraw and move to Quartz.
      [2011-02-08 14:00:50 - spring-android-showcase-client] New emulator found: emulator-5554
      [2011-02-08 14:00:50 - spring-android-showcase-client] Waiting for HOME ('android.process.acore') to be launched...
      [2011-02-08 14:01:21 - spring-android-showcase-client] HOME is up on device 'emulator-5554'
      [2011-02-08 14:01:21 - spring-android-showcase-client] Uploading spring-android-showcase-client.apk onto device 'emulator-5554'
      [2011-02-08 14:01:23 - spring-android-showcase-client] Installing spring-android-showcase-client.apk...
      [2011-02-08 14:01:50 - spring-android-showcase-client] Success!
      [2011-02-08 14:01:50 - spring-android-showcase-client] Starting activity org.springframework.android.showcase.MainActivity on device emulator-5554
      [2011-02-08 14:01:52 - spring-android-showcase-client] ActivityManager: Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=org.springframework.android.showcase/.MainActivity }
      

      AVD 将启动并显示锁定屏幕。将绿色锁从左向右滑动以“打开”Android 设备。打开后,应用程序现在应该显示

      avd-showcase-home

      结论

      在本篇文章中,我们回顾了如何在 Eclipse 中构建一个利用 Maven 依赖管理的 Android 示例应用程序。为此,我们使用了 Eclipse、Eclipse 的 Android 开发工具 (ADT) 插件、Maven Android 插件、Android 开发工具的 Maven 集成插件以及 Eclipse 的 Maven 集成 (m2eclipse) 插件。虽然涉及到很多组件,但一旦你配置好所有内容,就可以轻松地构建并部署到 Android 模拟器。如果你在 Android 应用程序中使用第三方库,则应考虑使用这些工具来帮助管理这些依赖项。

获取 Spring Newsletter

关注 Spring Newsletter

订阅

抢先一步

VMware 提供培训和认证,助您快速提升。

了解更多

获取支持

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

了解更多

即将举行的活动

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

查看全部