Android 项目更新的 Maven 支持

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

自从我最初关于使用Maven 与 Spring Android的文章发表以来,已经过去了一段时间,工具的状态也发生了一些变化。随着最近发布的Android 4.0 SDKAndroid 开发工具 (ADT) 的第 14 版,Google 做出了一些更改,这些更改影响了构建 Android 项目的第三方 Maven 插件支持。幸运的是,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 和版本进行以下更改。


<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 插件成功,您需要将 Android ROME 存储库包含在您的 Spring Android 项目中。


<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 配置器也改名了。以前,它被称为 Android 开发工具的 Maven 集成。最新版本的 Android 配置器现在支持 Android SDK r14。

安装插件

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

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

m2e - Eclipse 的 Maven 集成

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

将您的项目导入 Eclipse

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

  1. 右键单击 Eclipse Package Explorer 中的项目。
  2. 选择 Maven 上下文菜单并选择“更新项目配置…”
  3. 验证您的项目是否已在“可用的 Maven 代码库”中选中,然后单击“确定”。

结论

Maven 插件是用于构建 Android 项目的强大工具,并且这些插件将在社区的帮助下不断发展和成熟。Spring Android 示例已更新为可与这些最新插件一起使用,因此请提取最新版本并查看更改。此外,Android Maven 插件m2e 的 Android 配置器位于 GitHub 上,它们欢迎您的反馈和拉取请求!

获取 Spring 简报

通过 Spring 简报保持联系

订阅

领先一步

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

了解更多

获取支持

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

了解更多

即将举行的活动

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

查看全部