【问题标题】:Adding an Eclipse "Android Library" project and building via Maven添加一个 Eclipse“Android 库”项目并通过 Maven 构建
【发布时间】:2012-04-13 10:25:07
【问题描述】:

我正在尝试将 cocos2d 包含到预先存在的应用程序中。我已经以 Eclipse 的方式完成了一些事情,例如设置“isLibrary”并将库项目添加到 Eclipse 中的构建路径中,并且我在我的应用程序的 pom.xml 中有以下依赖项:

<dependency>
    <groupId>cocos2d_android</groupId>
    <artifactId>cocos2d_android</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <scope>provided</scope>
</dependency>

我认为这会解决问题,但是当我构建时,似乎没有包含该库。我知道这一点是因为当我启动一个 Activity SimpleGame,引用 cocos2d 源中的一个类时,Activity 死掉了,我在 DDMS 中得到了这个堆栈跟踪:

E/AndroidRuntime(10621): FATAL EXCEPTION: main E/AndroidRuntime(10621): java.lang.NoClassDefFoundError: org.cocos2d.opengl.CCGLSurfaceView E/AndroidRuntime(10621): at com.xyz.game.SimpleGame.onCreate(SimpleGame.java:22) ...

我正在寻找两件事:

1) 一种可靠的方法来查看某个类/jar/任何内容是否已打包到我的 apk 中,因为在我的应用程序中达到这一点的步骤现在很长而且很复杂

2) 主应用程序或库项目的 Manifest 或 pom.xml 中的某些内容似乎缺失 - 需要向 Maven 发出信号以获取另一个项目 - 它是什么?

我正在使用插件的 Maven 3.0.4 和 3.0.0-alpha-13,为 8 级及更高级别构建。

【问题讨论】:

    标签: android maven cocos2d-android


    【解决方案1】:

    1) 一种可靠的方法来查看某个类/jar/任何东西是否被打包到我的 apk 中,因为在我的应用程序中达到这一点的步骤现在很长而且很复杂 em>

    从命令行构建项目(即 mvn clean install),maven 将在构建的每个阶段/目标中输出详细日志,在 dex 目标中,您可以看到如下内容:

    [INFO] --- android-maven-plugin:3.1.1:dex (default-dex) @myproject ---
    [信息] C:\Program Files\Java\jdk1.6.0_21\jre\bin\java [-Xmx1024M, -jar, C:\Progr 我的文件\Android\android-sdk-r16\platform-tools\lib\dx.jar, --dex, --output=C:\workspace\myproject\target\classes.dex, C:\workspace\myproject\target \classes, C:\maven\repository\cocos2d_android\cocos2d_android\1.0.0-SNAPSHOT\cocos2d_android-1.0.0-SNAPSHOT.apklib, C:\maven\repository\com\google\code\gson\gson\1.7.1 \gson-1.7.1.jar, ... ...]

    Android 库项目实际上是 dex-ed 为 cocos2d_android-1.0.0-SNAPSHOT.apklib 和一些其他常规 jar 库档案。


    2) 主应用程序或库项目的 Manifest 或 pom.xml 中的某些内容似乎缺失 - 需要向 Maven 发出信号以获取另一个项目 - 它是什么?

    它是 ApkLib,它只是 Android 库项目(src/、res/、AndroidManifest.xml 等)的一个 zip 压缩包。我们通常创建/实现我们自己的 Android 库项目,将依赖的 Android 项目作为多模块 maven 项目,但是,如果您需要参考其他开发人员编写的 Android 库项目,则不需要这样做。感谢开发者,android-maven-plugin 已经支持非Maven Android 库项目,查看Compatible with non-Maven Android Library Projects

    生成的 .apklib 文件将具有标准 Android/Eclipse 库项目的布局。这意味着无论您的 Maven 布局如何,.apklib 文件中的布局都将是源代码位于“src/”而不是“src/main/java/”中,但在 Android/Maven 应用程序中使用时仍能正确解释项目。这是为了与非 Maven 开发者的库项目兼容,这对于发展 Android 开发者社区非常重要。

    使用其他非 Maven 开发者的库

    这也意味着我们可以获取任何外部 Android 库项目 zip 文件(来自非 Maven 开发人员)并对其执行 mvn install:install-file ... 并开始使用它作为依赖项。

    与非 Maven 开发人员共享您的 .apklib

    要与非 Maven 开发人员共享您的 .apklib 文件,如果您将其重命名为 .zip,他们可能会感觉更舒服。然后他们可以简单地将其解压缩到一个目录中并从那里使用它。

    所以解决方法是:

    1. 将您的 Android 库项目正确打包到 zip 存档中,然后将其重命名为 something.apklib。

    2. 使用 mvn install:install-file 将 something.apklib 安装到您的 Maven 本地存储库中。

    3. 在任何需要库依赖的 Android 项目中,只需使用:

      <dependency>
        <groupId>cocos2d_android</groupId>
        <artifactId>cocos2d_android</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <type>apklib</type>
      </dependency>
      

    查看 android-maven-plugin 网站上的Samples,了解如何正确使用 apklib。

    【讨论】:

    • 谢谢 yorkw!虽然 Maven 有办法拉入并压缩项目吗?我的 cocos2d 副本是来自 github 的只读克隆,我希望每次从 github 发生更改时不重复此过程的便利...
    • 我不知道是否有任何可以从 github 自动拉取、压缩和安装的 maven 插件。你打算多久升级一次你的应用程序?从生产的角度来看,不太可能需要每天或每周定期维护/升级所需应用程序的依赖项。手动解决方法是 android-maven-plugin 提供的唯一方法,我认为在大多数情况下它对于生产性维护是可以接受的。
    • 快速说明:上面的“Samples”超链接缺少最后的“s”(应该是code.google.com/p/maven-android-plugin/wiki/Samples)。所以不会让我进行 1 个字符的编辑。
    【解决方案2】:

    范围不应为 provided。提供的手段:

    provided - 这很像 compile,但表示您期望 JDK 或在运行时提供它的容器。它仅在 编译和测试类路径,并且不可传递。

    请改用compile

    额外提示:由于compile 是默认值,您可以删除&lt;scope&gt;provided&lt;/scope&gt; 行。

    【讨论】:

    • 有趣的是,您应该提到 - 使用 compile 默认值,尝试构建 .apk 时出现重复输入错误。显然我在某处有一个额外的依赖规范,但我不确定在哪里 - 我已经尝试从 eclipse 的构建路径中删除项目,不知道还有什么可以尝试的。
    • @BryM。这可能是由 Android 库中已经存在的 cocos2d_android 中的依赖项引起的。你可能会在你的类路径中找到重复的类,并使用 Maven 依赖 标签来修剪来自 cocos2d_android 的冗余依赖。
    猜你喜欢
    • 2014-11-25
    • 2015-10-08
    • 2013-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 2015-01-10
    相关资源
    最近更新 更多