Android 项目的 Maven 支持已更新

工程 | Roy Clarkson | 2011 年 11 月 7 日 | ...

距离我最初发布关于Maven 与 Spring Android 的文章已经有一段时间了,工具的状态也有所改变。随着Android 4.0 SDKAndroid 开发工具 (ADT) r14 的发布,Google 进行了一些更改,这些更改影响了第三方 Maven 插件对 Android 项目的构建支持。幸运的是,Android Maven 插件M2E 的 Android 配置器的团队一直在努力支持 Android 工具的这些最新更改。如果您最近尝试运行Spring Android 示例,您可能会注意到项目无法构建。在这篇文章中,我将详细介绍在 Spring Android Showcase 项目中利用最新的 Maven 插件和 Eclipse 支持所需的配置更改。

Android Maven 插件

从 3.0.0-alpha-11 版本开始,Maven Android 插件有了新的名称,现在称为 Android Maven 插件。最新版本 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

潜在的构建错误

当您尝试使用新插件进行构建时,您的项目可能会出现一些构建错误。

java.lang.OutOfMemoryError

当我更新 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 插件,项目无需包含存储库引用即可正确构建。然而,Android Maven 插件的 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>

M2E 的 Android 配置器

自上次我撰写关于 Maven Android 插件的博客以来,M2E 的 Android 配置器也更名为。之前,它被称为 Maven Integration for Android Development Tools。最新版本的 Android Configurator 现在支持 Android SDK r14。

安装插件

您可以从 Eclipse Marketplace 安装配置器。如果您使用的是 SpringSource Tool Suite (STS),那么您可以从仪表板上的 Extensions(扩展)选项卡安装 Eclipse Marketplace。它位于 Utilities(实用工具)部分下。否则,如果您使用的是不同版本的 Eclipse 3.7,Eclipse Marketplace 可从 Indigo 下载站点获取。

  1. 安装 Eclipse Marketplace 客户端。
  2. 在 Eclipse Marketplace 中,搜索 Android Configurator。
  3. 点击 Install(安装)按钮以安装 Android Configurator。
  4. 如果尚未安装 Android ADT,此配置将安装它。

m2e - Eclipse 的 Maven 集成

需要注意的是,m2e - Eclipse 的 Maven 集成插件不会随配置器自动安装。如果您使用的是STS 2.8.0,则 m2e 插件已安装。如果不是,那么您可以按照上述步骤先从 Eclipse Marketplace 安装m2e 插件,然后再导入您的 Android 项目。

将您的项目导入 Eclipse

在安装了所需的 Eclipse 插件后,您可以导入您的 Android 项目。如果您有一个现有的 POM 文件,那么只需将项目导入为 Existing Maven Project(现有 Maven 项目)并指向您的 POM。如果您之前使用旧版本的 Maven 插件处理过您的项目,那么您将需要更新您的项目。

  1. 在 Eclipse Package Explorer 中右键单击您的项目。
  2. 选择 Maven 上下文菜单并选择 Update Project Configuration...(更新项目配置...)。
  3. 在 Available Maven Codebases(可用的 Maven 代码库)中验证您的项目已被选中,然后点击 OK(确定)。

结论

Maven 插件是构建 Android 项目的强大工具,这些插件将在社区的帮助下不断发展和成熟。Spring Android 示例已更新以适应这些最新的插件,因此请拉取最新版本并查看更改。此外,Android Maven 插件M2E 的 Android 配置器都在 GitHub 上,它们欢迎您的反馈和拉取请求!

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,助您加速进步。

了解更多

获得支持

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件,只需一份简单的订阅。

了解更多

即将举行的活动

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

查看所有