为什么在Android';s"-“预构建”;蚂蚁目标?

为什么在Android';s"-“预构建”;蚂蚁目标?,android,ant,ivy,Android,Ant,Ivy,由于Android Java项目使用Ant作为构建工具,所以使用Ivy进行依赖关系管理对我来说似乎是一个自然的选择。然而,虽然基本设置工作正常,但我遇到了一个奇怪的问题。我已经创建了一个简单的方法来重现这个问题 关键是,依赖项可以很好地下载到“libs”目录中,但是由antdebug调用的构建过程似乎找不到jar但是,如果我调用“resolve”目标,而不是作为重载的“-pre-build”目标的一部分,而是像在ant resolve debug中那样手动调用,则效果很好 我已经验证了在“-pr

由于Android Java项目使用Ant作为构建工具,所以使用Ivy进行依赖关系管理对我来说似乎是一个自然的选择。然而,虽然基本设置工作正常,但我遇到了一个奇怪的问题。我已经创建了一个简单的方法来重现这个问题

关键是,依赖项可以很好地下载到“libs”目录中,但是由
antdebug
调用的构建过程似乎找不到jar但是,如果我调用“resolve”目标,而不是作为重载的“-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

不看build.xml本身很难说

但是,当您使用
进行解析时,它不会自动将库放入项目中。它们很可能位于
$HOME/.ivy2/cache
中。您需要做的是,在使用
任务之前,运行
以创建可在编译中使用的路径引用:

您可以看到,我已经使用
任务创建了名为
main.classpath
的所需类路径。然后,我可以使用它将其包含在我的
任务中

如果要将库下载到项目中,需要执行
,然后将该目录放入类路径中:

这对你有帮助吗

顺便说一下,你可能想看看我的常春藤安装项目。如果你有很多人分享你的 项目,它使加入常春藤变得容易。即使只是创建一个
ivy.dir
子目录,而不是将其作为包含的子项目。这样,就没有人需要了
安装Ivy,因为它已经安装在您的项目中。

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

但是,当您使用
进行解析时,它不会自动将库放入项目中。它们很可能位于
$HOME/.ivy2/cache
中。您需要做的是,在使用
任务之前,运行
以创建可在编译中使用的路径引用:

您可以看到,我已经使用
任务创建了名为
main.classpath
的所需类路径。然后,我可以使用它将其包含在我的
任务中

如果要将库下载到项目中,需要执行
,然后将该目录放入类路径中:

这对你有帮助吗

顺便说一下,你可能想看看我的常春藤安装项目。如果你有很多人分享你的 项目,它使加入常春藤变得容易。即使只是创建一个
ivy.dir
子目录,而不是将其作为包含的子项目。这样,就没有人需要了
安装Ivy,因为它已经安装在您的项目中。

我已经了解了情况:Android SDK的build.xml将
libs
目录中的所有JAR添加到
项目.all.JARs.path
属性,作为
-构建设置
目标的一部分。但是,如果将Ivy的
检索
目标作为
-pre-build
的一部分调用,这还为时过早,因为
-build setup
-pre-build
之前调用。因此,
-预构建
,虽然意味着被覆盖,但却是错误的位置。由于在调用
-build setup
之前似乎没有其他要覆盖的“虚拟”目标,我现在在build.xml文件中覆盖
-build setup
,版本取决于
retrieve
和原始
-build setup
,如下所示:


我发现了问题所在:Android SDK的build.xml将
libs
目录中的所有jar添加到
项目.all.JARs.path
属性中,作为
-build设置
目标的一部分。但是,如果将Ivy的
检索
目标作为
-pre-build
的一部分调用,这还为时过早,因为
-build setup
-pre-build
之前调用。因此,
-预构建
,虽然意味着被覆盖,但却是错误的位置。由于在调用
-build setup
之前似乎没有其他要覆盖的“虚拟”目标,我现在在build.xml文件中覆盖
-build setup
,版本取决于
retrieve
和原始
-build setup
,如下所示:


常春藤是否内置在Android构建系统中?我下载了github项目,但无法查看“-pre-build”目标的逻辑(因为它包含在从Android SDK发行版导入的构建文件中)。我猜问题是你需要通过让ivy下载你的依赖项来“引导”你的构建,然后标准构建逻辑可以在正常的“lib”目录中找到JAR。不,ivy不是Android构建系统的一部分。我忘了说您已经需要安装Ivy(例如~/.ant/lib),或者向ant文件添加引导目标。在任何情况下,正如您从日志中看到的,Ivy都已安装,并且实际上已将工件从其本地缓存正确复制到项目的libs目录。Android SDK只是将“-pre-build”定义为一个空目标,它意味着被覆盖,这就是我在build.xml文件中所做的。你只需要取消注释就可以了。我想Mark说的是这个文件import file=“${sdk.dir}/tools/ant/build.xml”/>我说的是。我很抱歉