更新了对 Android 项目的 Maven 支持

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

距离我最初关于使用 Maven 与 Spring Android 的文章已经有一段时间了,工具的状态也发生了一些变化。随着最近发布的 Android 4.0 SDKAndroid Development Tools (ADT) 修订版 14,Google 进行了 多项更改,这些更改影响了第三方 Maven 插件对构建 Android 项目的支持。幸运的是,Android Maven PluginM2E 的 Android Configurator 团队一直在努力支持 Android 工具中的这些最新更改。如果您最近尝试运行 Spring Android 示例,那么您可能注意到这些项目无法构建。在本文中,我将说明在 Spring Android Showcase 项目中使用最新的 Maven 插件和 Eclipse 支持所需的配置更改。

Android Maven Plugin

从版本 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

潜在的构建错误

当您尝试使用新插件构建项目时,可能会遇到一些构建错误。

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

M2E 的 Android Configurator

自上次我 撰写关于 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。

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

m2e - Maven Integration for Eclipse

需要注意的是,m2e - Maven Integration for Eclipse 插件不会随同 configurator 自动安装。如果您正在使用 STS 2.8.0,则 m2e 插件已经安装。如果没有,则可以按照上面的步骤,在导入您的 Android 项目之前,也从 Eclipse Marketplace 安装 m2e 插件

将项目导入到 Eclipse 中

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

  1. 在 Eclipse Package Explorer 中右键单击您的项目。
  2. 选择 Maven 右键菜单并选择 更新项目配置...
  3. 在 Available Maven Codebases 中验证您的项目是否已选中,然后单击 OK。

结论

Maven 插件是用于构建 Android 项目的强大工具,这些插件将在社区的帮助下继续发展和成熟。Spring Android 示例 已更新以与这些最新插件配合使用,请拉取最新版本并查看更改。此外,Android Maven Pluginm2e 的 Android Configurator 都在 GitHub 上,欢迎您的反馈和拉取请求!

订阅 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

先行一步

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

了解更多

获取支持

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

了解更多

即将到来的活动

查看 Spring 社区中所有即将到来的活动。

查看全部