为什么使用Ivy解析依赖关系不适用于Android的“-pre-build”Ant目标?

时间:2012-10-19 15:03:34

标签: android ant ivy

由于Android Java项目使用Ant作为构建工具,使用Ivy进行依赖管理似乎是我的自然选择。然而,虽然基本设置工作正常,但我遇到了一个奇怪的问题。我创建了一个fork of an existing example on GitHub来轻松重现问题。

关键是,依赖项被很好地下载到“libs”目录中,但ant debug调用的构建过程似乎找不到JAR。 但是,如果我将“解决”目标称为我的重载“-pre-build”目标的一部分,但是在ant resolve debug中手动操作,则可以正常工作。

我已经在“-pre-build”完成之前验证了库是否真正位于“libs”中(通过将“libs”中的文件列为“-pre-build”目标的一部分),所以我是真的很想知道为什么他们找不到。

要重现,在运行ant之前从“libs”中删除库是很重要的。任何想法在这里出了什么问题?

resolve:
[ivy:retrieve] :: Apache Ivy 2.3.0-rc1 - 20120416000235 :: http://ant.apache.org/ivy/ ::
[ivy:retrieve] :: loading settings :: file = /Users/seschube/development/IvyAndroidExample/ivysettings.xml
[ivy:retrieve] :: resolving dependencies :: com.example#ivy-android-example;0.1
[ivy:retrieve]  confs: [default]
[ivy:retrieve]  found org.acra#acra;4.2.3 in acra
[ivy:retrieve]  found com.google.inject#guice;2.0-no_aop in maven2
[ivy:retrieve]  found com.google.zxing.core#core;1.6 in zxing
[ivy:retrieve] :: resolution report :: resolve 115ms :: artifacts dl 5ms
    ---------------------------------------------------------------------
    |                  |            modules            ||   artifacts   |
    |       conf       | number| search|dwnlded|evicted|| number|dwnlded|
    ---------------------------------------------------------------------
    |      default     |   3   |   0   |   0   |   0   ||   4   |   0   |
    ---------------------------------------------------------------------
[ivy:retrieve] :: retrieving :: com.example#ivy-android-example
[ivy:retrieve]  confs: [default]
[ivy:retrieve]  4 artifacts copied, 0 already retrieved (1195kB/76ms)

-pre-build:
     [echo] The "libs" directory contains: acra-4.2.3.jar;core-1.6.jar;guice-2.0-no_aop-javadoc.jar;guice-2.0-no_aop.jar

-code-gen:
[mergemanifest] Merging AndroidManifest files into one.
[mergemanifest] Manifest merger disabled. Using project manifest only.
     [echo] Handling aidl files...
     [aidl] No AIDL files to compile.
     [echo] ----------
     [echo] Handling RenderScript files...
[renderscript] No RenderScript files to compile.
     [echo] ----------
     [echo] Handling Resources...
     [aapt] Generating resource IDs...
     [echo] ----------
     [echo] Handling BuildConfig class...
[buildconfig] Generating BuildConfig class.

-pre-compile:

-compile:
    [javac] Compiling 3 source files to /Users/seschube/development/IvyAndroidExample/bin/classes
    [javac] /Users/seschube/development/IvyAndroidExample/src/com/example/IvyAndroidExampleActivity.java:7: error: package org.acra does not exist
    [javac] import org.acra.*;
    [javac] ^
    [javac] /Users/seschube/development/IvyAndroidExample/src/com/example/IvyAndroidExampleActivity.java:8: error: package com.google.inject does not exist
    [javac] import com.google.inject.*;
    [javac] ^
    [javac] /Users/seschube/development/IvyAndroidExample/src/com/example/IvyAndroidExampleActivity.java:9: error: package com.google.zxing does not exist
    [javac] import com.google.zxing.*;
    [javac] ^
    [javac] 3 errors

BUILD FAILED

2 个答案:

答案 0 :(得分:4)

我发现了正在发生的事情:Android SDK的build.xml将libs目录中的所有JAR作为project.all.jars.path目标的一部分添加到-build-setup属性。但是,如果Ivy的retrieve目标作为-pre-build的一部分被调用,则为时尚早,因为在-build-setup之前调用了-pre-build。所以-pre-build,虽然意味着被覆盖,但是错误的地方。由于似乎没有其他“虚拟”目标在调用-build-setup之前被覆盖,我现在在我的build.xml文件中覆盖-build-setup,其版本取决于{{1} }和原来的retrieve一样:

-build-setup

答案 1 :(得分:0)

如果不查看build.xml本身,很难说。

但是,当您使用<ivy:resolve>进行解析时,它不会自动将库放入您的项目中。最有可能的是,他们在$HOME/.ivy2/cache。您需要做的是在使用<javac>任务之前运行<ivy:cachepath>来创建可在编译中使用的路径引用:

您可以看到我已使用main.classpath任务创建了名为<ivy:cachepath>的必需类路径。然后我可以使用它将它包含在我的<javac>任务中。

如果要将库实际下载到项目中,则需要执行<ivy:retrieve/>,然后将该目录放入类路径中:

                            

这对你有帮助吗?

顺便说一下,你可能想看看Github上的常春藤设置项目。如果你有很多人分享你的 项目,它可以很容易地包括常春藤。即使您只是创建一个ivy.dir 子目录,而不是使其成为包含的子项目。这样,没有人必须这样做 安装Ivy,因为它已经安装在你的项目中。