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