先行一步
VMware 提供培训和认证,助您加速进步。
了解更多距离我最初关于使用 Maven 与 Spring Android 的文章已经有一段时间了,工具的状态也发生了一些变化。随着最近发布的 Android 4.0 SDK 和 Android Development Tools (ADT) 修订版 14,Google 进行了 多项更改,这些更改影响了第三方 Maven 插件对构建 Android 项目的支持。幸运的是,Android Maven Plugin 和 M2E 的 Android Configurator 团队一直在努力支持 Android 工具中的这些最新更改。如果您最近尝试运行 Spring Android 示例,那么您可能注意到这些项目无法构建。在本文中,我将说明在 Spring Android Showcase 项目中使用最新的 Maven 插件和 Eclipse 支持所需的配置更改。
从版本 3.0.0-alpha-11 开始,Maven Android Plugin 有了一个新名称,现在称为 Android Maven Plugin。最新版本 3.0.0-alpha-13 修复了 Android SDK r14 的构建问题。
要更新您的插件版本,请对 artifactId 和 version 进行以下更改。
<plugin>
<groupId>com.jayway.maven.plugins.android.generation2</groupId>
<artifactId>android-maven-plugin</artifactId>
<version>3.0.0-alpha-13</version>
<configuration>
<sdk>
<platform>${android-platform}</platform>
</sdk>
<deleteConflictingFiles>true</deleteConflictingFiles>
<undeployBeforeDeploy>true</undeployBeforeDeploy>
</configuration>
<extensions>true</extensions>
</plugin>
修改后,您现在可以从命令行运行 maven 来构建您的项目。
mvn clean install
当您尝试使用新插件构建项目时,可能会遇到一些构建错误。
当我更新 Spring Android Showcase 客户端时,构建失败并出现以下错误
[INFO] UNEXPECTED TOP-LEVEL ERROR:
[INFO] java.lang.OutOfMemoryError: Java heap space
[INFO] at com.android.dx.ssa.SsaBasicBlock.<init>(SsaBasicBlock.java:130)
[INFO] at com.android.dx.ssa.SsaBasicBlock.newFromRop(SsaBasicBlock.java:148)
[INFO] at com.android.dx.ssa.SsaMethod.convertRopToSsaBlocks(SsaMethod.java:174)
[INFO] at com.android.dx.ssa.SsaMethod.newFromRopMethod(SsaMethod.java:104)
[INFO] at com.android.dx.ssa.SsaConverter.convertToSsaMethod(SsaConverter.java:45)
[INFO] at com.android.dx.ssa.Optimizer.optimize(Optimizer.java:99)
[INFO] at com.android.dx.ssa.Optimizer.optimize(Optimizer.java:73)
[INFO] at com.android.dx.dex.cf.CfTranslator.processMethods(CfTranslator.java:273)
[INFO] at com.android.dx.dex.cf.CfTranslator.translate0(CfTranslator.java:134)
[INFO] at com.android.dx.dex.cf.CfTranslator.translate(CfTranslator.java:87)
[INFO] at com.android.dx.command.dexer.Main.processClass(Main.java:483)
[INFO] at com.android.dx.command.dexer.Main.processFileBytes(Main.java:455)
[INFO] at com.android.dx.command.dexer.Main.access$400(Main.java:67)
[INFO] at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:394)
[INFO] at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:135)
[INFO] at com.android.dx.cf.direct.ClassPathOpener.processDirectory(ClassPathOpener.java:191)
[INFO] at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:123)
[INFO] at com.android.dx.cf.direct.ClassPathOpener.processDirectory(ClassPathOpener.java:191)
[INFO] at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:123)
[INFO] at com.android.dx.cf.direct.ClassPathOpener.processDirectory(ClassPathOpener.java:191)
[INFO] at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:123)
[INFO] at com.android.dx.cf.direct.ClassPathOpener.processDirectory(ClassPathOpener.java:191)
[INFO] at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:123)
[INFO] at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:109)
[INFO] at com.android.dx.command.dexer.Main.processOne(Main.java:418)
[INFO] at com.android.dx.command.dexer.Main.processAllFiles(Main.java:329)
[INFO] at com.android.dx.command.dexer.Main.run(Main.java:206)
[INFO] at com.android.dx.command.dexer.Main.main(Main.java:174)
[INFO] at com.android.dx.command.Main.main(Main.java:95)
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 37.252s
[INFO] Finished at: Mon Nov 07 13:02:13 EST 2011
[INFO] Final Memory: 13M/81M
[INFO] ------------------------------------------------------------------------
要解决此问题,您可以简单地将以下 jvmArgument 添加到插件声明中。这将增加构建可用的内存。
<plugin>
<groupId>com.jayway.maven.plugins.android.generation2</groupId>
<artifactId>android-maven-plugin</artifactId>
<version>3.0.0-alpha-13</version>
<configuration>
<sdk>
<platform>${android-platform}</platform>
</sdk>
<dex>
<jvmArguments>
<jvmArgument>-Xms256m</jvmArgument>
<jvmArgument>-Xmx512m</jvmArgument>
</jvmArguments>
</dex>
<deleteConflictingFiles>true</deleteConflictingFiles>
<undeployBeforeDeploy>true</undeployBeforeDeploy>
</configuration>
<extensions>true</extensions>
</plugin>
Spring Android 1.0.0.M4 是基于 Android Rome Feed Reader 构建的。此版本的 ROME 在 Maven Central 仓库中不可用,因此要使用它,您必须在 POM 中包含仓库信息。Spring Android Showcase 客户端不包含任何 ROME 示例,因为这些示例包含在单独的示例项目中。通常,这意味着您不必包含该库的仓库引用。使用之前版本的 Maven Android Plugin,项目无需包含仓库引用即可正确构建。然而,Android Maven Plugin 的 3.0.0-alpha-13 版本似乎会尝试下载所有依赖项,即使是可选的依赖项。如果您不包含 ROME 仓库,则构建会失败并出现以下错误。
[WARNING] The POM for com.google.code.android-rome-feed-reader:android-rome-feed-reader:jar:1.0.0-r2 is missing, no dependency information available
Downloading: http://maven.springframework.org/milestone/com/google/code/android-rome-feed-reader/android-rome-feed-reader/1.0.0-r2/android-rome-feed-reader-1.0.0-r2.jar
Downloading: http://repo1.maven.org/maven2/com/google/code/android-rome-feed-reader/android-rome-feed-reader/1.0.0-r2/android-rome-feed-reader-1.0.0-r2.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 21.486s
[INFO] Finished at: Mon Nov 07 16:04:24 EST 2011
[INFO] Final Memory: 13M/81M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal com.jayway.maven.plugins.android.generation2:android-maven-plugin:3.0.0-alpha-13:apk (default-apk) on project spring-android-showcase-client: Error while processing transient dependencies: Could not find artifact com.google.code.android-rome-feed-reader:android-rome-feed-reader:jar:1.0.0-r2 in org.springframework.maven.milestone (http://maven.springframework.org/milestone)
为了使用当前的 maven 插件成功构建,您需要在 Spring Android 项目中包含 Android ROME 仓库。
<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>
自上次我 撰写关于 Maven Android 插件的博客 以来,M2E 的 Android Configurator 也经历了名称更改。以前它叫做 Maven Integration for Android Development Tools。最新版本的 Android Configurator 现在支持 Android SDK r14。
您可以从 Eclipse Marketplace 安装 configurator。如果您正在使用 SpringSource Tool Suite (STS),则可以从 Dashboard 的 Extensions 选项卡安装 Eclipse Marketplace。它位于 Utilities 部分下。否则,如果您使用的是其他版本的 Eclipse 3.7,则可以从 Indigo 下载站点获取 Eclipse Marketplace。
需要注意的是,m2e - Maven Integration for Eclipse 插件不会随同 configurator 自动安装。如果您正在使用 STS 2.8.0,则 m2e 插件已经安装。如果没有,则可以按照上面的步骤,在导入您的 Android 项目之前,也从 Eclipse Marketplace 安装 m2e 插件。
安装所需的 Eclipse 插件后,您可以导入您的 Android 项目。如果您有现有的 POM 文件,则只需将项目作为 Existing Maven Project 导入并指向您的 POM。如果您之前一直在使用旧版本的 Maven 插件处理项目,则需要更新您的项目。
Maven 插件是用于构建 Android 项目的强大工具,这些插件将在社区的帮助下继续发展和成熟。Spring Android 示例 已更新以与这些最新插件配合使用,请拉取最新版本并查看更改。此外,Android Maven Plugin 和 m2e 的 Android Configurator 都在 GitHub 上,欢迎您的反馈和拉取请求!