我可能有这个不太常见的设置:
(> = 依赖关系(
安卓项目> 安卓库项目 1> 安卓库项目 2
所以我有一个 Android 库项目,它依赖于另一个库项目。
当我在 Eclipse 中构建项目时,一切正常,但我无法让我的构建与 Ant 一起工作。
First Ant 编译 Android 库项目 2,生成一个类.jar并将该文件放在 bin 文件夹中。
然后 Ant 尝试编译 Android 库项目 1,但随后我收到错误,因为它缺少 Android 库项目 2 中的类。
好吧,这并不奇怪,因为jar文件不包含在libs文件夹中。但是在 project.properties 中,我已经依赖于库项目 2,那么为什么 Ant 不将类.jar复制到库项目 1 的 libs 文件夹中呢?
好吧,我可以想到一个解决方案,使用 Ant 任务将文件复制到 libs 文件夹,但随后我必须修改构建.xml这是我不喜欢的。
**编辑
问题是缺少 R 类,当我查看类时.jar这个 java 文件不包含 R 类。所以我的解决方案很可能行不通。
此行为是由构建工具的 R17 更改引起的:http://tools.android.com/recent/dealingwithdependenciesinandroidprojects
简而言之:库的 R 文件不再打包在该库的类中.jar。然而,由于帕伦特。父库的 R(示例中为 project1(还包含"子"库(示例中为 project2(的资源引用,无论如何都不必引用子库。
替换所有项目2。项目 1 中的 R 导入语句与项目 1。R 导入语句,你应该没问题。
对于要编译的 ant 在 ant.properties 中添加依赖项。例如:
android.library.reference.1=../path/to/library
这听起来像是一个非常脆弱的设置 - 你可能有充分的理由这样做,但你能不能解耦库之间的依赖关系?
例如;实现桥接模式来转换两个库之间的调用,并使调用 Android 项目附加它们。这样,两个库中都没有依赖于另一个库的代码,并且唯一需要处理依赖项设置的项目是主项目。
使用库的主要原因之一是使代码可重用,这种方法确保某人(您,同事,您的继任者......(可以只插入一个库并创建自己的另一个库实现。
这是另一篇关于在 Java 中应用桥接模式的好文章: http://java.dzone.com/articles/design-patterns-bridge
问题是缺少R类。
因此,我删除了两个库项目之间的 R 类依赖关系。
我不知道这是否可以解决,但我认为无论如何这都是不好的做法。
没有这种依赖关系,Ant 构建得很好。
老问题,但像我一样,其他人可能会对此感到震惊......
官方的回答是"做不到",具体来说:
在生成时,库与应用程序一次合并一个,从最低优先级到最高优先级开始。请注意,一个库本身不能引用另一个库,并且在生成时,库在与应用程序合并之前不会相互合并。
(摘自官方文档:"引用库项目"(。
这意味着任何事情都可以进行,因为没有"干净"的方式来使用工具(并且肮脏的方法已经有序(。
希望对你有帮助