【问题标题】:android-maven-plugin causes java.lang.OutOfMemoryError when trying to create dexandroid-maven-plugin 在尝试创建 dex 时导致 java.lang.OutOfMemoryError
【发布时间】:2012-02-09 14:25:43
【问题描述】:

我需要一只手。我在一个 android 项目中使用 android-maven-plugin 3.0.0 和 maven-external-dependency-plugin 0.4。我使用来自不同存储库的这些库作为依赖项:

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>com.google.android</groupId>
        <artifactId>android</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>com.google.android</groupId>
        <artifactId>android-test</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency> 
        <groupId>com.admob.android.ads</groupId> 
        <artifactId>admob-android</artifactId> 
        <version>4.0.4</version> 
    </dependency>
    <dependency>
        <groupId>com.google.code</groupId>
        <artifactId>google-api-translate-java</artifactId>
        <version>0.97</version>
    </dependency>
    <dependency>
        <groupId>com.db4o</groupId>
        <artifactId>db4o-core-java5</artifactId>
        <version>${com.db4o.version}</version>
    </dependency>
    <dependency>
        <groupId>com.db4o</groupId>
        <artifactId>db4o-cs-java5</artifactId>
        <version>${com.db4o.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.james</groupId>
        <artifactId>apache-mime4j</artifactId>
        <version>0.6</version>
    </dependency>
    <dependency>
        <groupId>commons-codec</groupId>
        <artifactId>commons-codec</artifactId>
        <version>1.4</version>
    </dependency>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpmime</artifactId>
        <version>4.0.1</version>
    </dependency> 
    <dependency>
        <groupId>org.json</groupId>
        <artifactId>json</artifactId>
        <version>20090211</version>
    </dependency>
    <dependency>
        <groupId>org.restlet.jee</groupId>
        <artifactId>org.restlet</artifactId>
        <version>${restlet.version}</version>
    </dependency>
</dependencies>

依赖项都满足了,但是当需要将所有 jars 集成到 Android dex 中时,出现内存不足错误:

[INFO] UNEXPECTED TOP-LEVEL ERROR:
[INFO] java.lang.OutOfMemoryError: Java heap space
[INFO]  at com.android.dx.cf.code.OneLocalsArray.<init>(OneLocalsArray.java:46)
[INFO]  at com.android.dx.cf.code.OneLocalsArray.copy(OneLocalsArray.java:51)
[INFO]  at com.android.dx.cf.code.OneLocalsArray.copy(OneLocalsArray.java:33)
[INFO]  at com.android.dx.cf.code.Frame.copy(Frame.java:98)
[INFO]  at com.android.dx.cf.code.Ropper.processBlock(Ropper.java:683)
[INFO]  at com.android.dx.cf.code.Ropper.doit(Ropper.java:639)
[INFO]  at com.android.dx.cf.code.Ropper.convert(Ropper.java:252)
[INFO]  at com.android.dx.dex.cf.CfTranslator.processMethods(CfTranslator.java:256)
[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.processArchive(ClassPathOpener.java:245)
[INFO]  at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:131)
[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)

尝试增加内存添加:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <forkMode>pertest</forkMode>
        <argLine>-Xms1024m -Xmx2048m</argLine>
        <testFailureIgnore>false</testFailureIgnore>
        <skip>false</skip>
    </configuration>
</plugin>

或者这个:

<plugin>
    <groupId>com.jayway.maven.plugins.android.generation2</groupId>
    <artifactId>android-maven-plugin</artifactId>
    <inherited>true</inherited>
    <configuration>
        <argLine>-Xmx1024m</argLine>

...

或像这样导出 maven_opts:

export MAVEN_OPTS=-Xmx1024m

不解决问题

我收到几条警告,说明依赖文件中的类使用旧的类格式编译,但我不确定这是问题的根源:

[INFO] warning: Ignoring InnerClasses attribute for an anonymous inner class
[INFO] (org.osgi.framework.AdminPermission$1) that doesn't come with an
[INFO] associated EnclosingMethod attribute. This class was probably produced by a
[INFO] compiler that did not target the modern .class file format. The recommended
[INFO] solution is to recompile the class from source, using an up-to-date compiler
[INFO] and without specifying any "-target" type options. The consequence of ignoring
[INFO] this warning is that reflective operations on this class will incorrectly
[INFO] indicate that it is *not* an inner class.

如果有任何帮助,我将不胜感激。这是从控制台打开调试的完整输出,因此您可以仔细查看错误: http://pastebin.com/5DPBihH0

最好的。

大妈

【问题讨论】:

    标签: android plugins maven


    【解决方案1】:

    这是一个已知问题,但我相信它已在 android-maven-plugin 版本 3.1.0 中修复。最新的是 3.1.1。你没有发布你的pom.xml,所以我不知道这是否是问题所在,但听起来确实如此。

    如果由于某种原因无法升级,这是适用的配置:

      <dex>
        <jvmArguments>
          <jvmArgument>-Xms256m</jvmArgument>
          <jvmArgument>-Xmx512m</jvmArgument>
        </jvmArguments>     
      </dex>
    

    这是他们网站上报告的问题:http://code.google.com/p/maven-android-plugin/issues/detail?id=146

    还有在 Springsource 博客中:http://blog.springsource.org/2011/11/07/updated-maven-support-for-android-projects/

    【讨论】:

    • 谢谢你这就是问题所在。最好的!
    【解决方案2】:

    我认为这与这些警告有关:

    [INFO] warning: Ignoring InnerClasses attribute for an anonymous inner class
    [INFO] (org.osgi.framework.AdminPermission$1) that doesn't come with an
    [INFO] associated EnclosingMethod attribute. This class was probably produced by a
    [INFO] compiler that did not target the modern .class file format. The recommended
    [INFO] solution is to recompile the class from source, using an up-to-date compiler
    [INFO] and without specifying any "-target" type options. The consequence of ignoring
    [INFO] this warning is that reflective operations on this class will incorrectly
    [INFO] indicate that it is *not* an inner class.
    

    应该对你有帮助的答案:

    "Ignoring InnerClasses attribute" warning is killing Eclipse
    What is the "Ignoring InnerClasses attribute" warning output during compilation?
    http://code.google.com/p/maven-android-plugin/issues/detail?id=26

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-07
      • 2014-10-25
      • 1970-01-01
      • 1970-01-01
      • 2013-01-20
      • 1970-01-01
      • 2014-10-15
      • 1970-01-01
      相关资源
      最近更新 更多