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