Eclipse:覆盖 project.properties 中定义的库路径

Posted

技术标签:

【中文标题】Eclipse:覆盖 project.properties 中定义的库路径【英文标题】:Eclipse: Override library path defined in project.properties 【发布时间】:2012-09-11 02:02:32 【问题描述】:

我使用ActionBarSherlock 作为库。我们尚未将 ABS 包含到我们的存储库中,因此参与our project 的每个人都必须单独下载并安装它。 ActioBarSherlock 是一个 android 库项目,我通过在同一个 Eclipse 的工作区中打开它和我的项目来运行它(它们都没有被复制到工作区,它们都存在于另一个文件夹中)并将其添加到我的 project.properties 中,按照这个: Referencing a library project

该引用路径是相对的,由于每个人可能在不同的文件夹中都有 ABS,因此我们在 Eclipse 的 project.properties 文件中也有不同的路径为 android.library.reference.1有什么方法可以在本地覆盖该库路径,以便我们可以在我们的存储库中拥有project.properties,但 Eclipse 将在本地使用其他路径?目前我必须在每次拉取后手动修复该路径我们的 repo 因为路径不同。

存在 other *.properties files 但 Eclipse 忽略它们:

local.properties

构建系统的可定制的计算机特定属性。如果您使用 Ant 构建项目,则它包含 SDK 安装的路径。由于该文件的内容特定于 SDK 的本地安装,因此不应在源版本控制系统中维护 local.properties。 如果你使用 Eclipse,这个文件就不用了。

ant.properties

构建系统的可自定义属性。您可以编辑此文件以覆盖 Ant 使用的默认构建设置,还可以提供密钥库和密钥别名的位置,以便构建工具可以在以发布模式构建应用程序时签名。该文件是项目的组成部分,因此请将其保存在源代码修订控制系统中。 如果你使用 Eclipse,这个文件就不用了。

【问题讨论】:

【参考方案1】:

只需让每个人将其放入projectroot/libs。较新的(ADT 17 及更高版本,IIRC)版本的 ADT 将自动选择它并将其编译到您的应用程序中。请注意,该文件夹是libs,带有s,而不是lib。使用/lib 将不起作用。

【讨论】:

如果我想在多个项目中使用同一个库,这种方法意味着我必须将这些相同的文件复制到多个位置。是否有任何其他选项可以让我将安装在硬盘驱动器中单个位置的库同时用于多个项目? 我不知道。如果你修改 project.properties,eclipse 无论如何都会在你下次构建项目时覆盖该文件, ActionBarSherlock 不是 JAR,因此不会进入 libs/。这是一个 Android 库项目。【参考方案2】:

选项:

project.properties:您可以在每个用户的主文件夹libs 中创建一个链接,并让project.properties 中的路径参考~/libs

使用通用库: 创建一个名为“common”的库项目。在设置中,让它导出 jar。在您的 Android 应用程序中,导入 jar。

我个人认为使用 maven 配置是最好的,但第二个选项最快。

【讨论】:

选项一种违背了我的问题的目的,因为我想让用户决定他们在本地存储源代码的位置,只要 Eclipse 可以找到它。 AFAIK Eclipse 对代码位置没有其他限制,除了同一项目中的源必须位于同一硬盘驱动器上(引用是用相对路径完成的,而不是绝对路径)。选项二:我们已经将 ABS 作为库项目。我们为什么要复制它?第三个,Maven 可能有点矫枉过正。 选项 2:然后将 ABS 配置为“导出”其库将是最终结果。如果您真的不想使用约定并使自己变得更难,请创建一个运行 find <someFolder> -iname 'magical.jar' -print >> local.properties 的 ant 任务(检查以正确附加)。大多数人都希望完成任务并牺牲配置而不是约定。为什么选择维护一些配置...【参考方案3】:

如果你忽略了 repo 中的 project.properties 怎么办?这样每个用户都可以保留自己的,而您不需要一直覆盖它。我不认为你可以在本地覆盖它。

另一个简化操作的选项是您可以将项目导出为 JAR 文件,而不是将其作为库项目引用。如果您不需要修改 ABS 代码,您可以右键单击项目 -> java -> jar 文件,所有开发人员都可以将其保存在同一个地方为简单起见。

【讨论】:

这个怎么样:为什么ActionBarSherlock是一个库项目,而原来的兼容性库只是一个.jar? ActionBarSherlock中的自定义操作栏实现依赖于样式,主题、布局和可绘制对象,以便正确显示。由于 Android 和 .jar 文件的限制,目前无法通过其他方式完成。 来源:ABS FAQ 我想将 project.properties 保留在 repo 中,因为 Eclipse 需要它,我希望用户可以在克隆后轻松编译我们的项目。使用 .hgignore 忽略它不起作用,因为该文件已被跟踪。存在some options in .hg/hgrc,但这些也应该设置到我们项目的每个分支中。 @Kuitsi 我不知道!谢谢分享!如果你不在 repo 中保留 project.properties 也没什么大不了的。用户无需导入项目,只需在 eclipse 上使用现有源创建一个新项目,该文件就会生成。我知道这不是最好的选择,但如果您没有其他东西,它可能会对您有所帮助! 这似乎是最接近我的答案,因此奖励赏金,因为它即将到期。 Android 有一个新的.aar archive format 用于库项目。【参考方案4】:

编辑:我们的项目不再需要这个问题,因为我们从 Eclipse 迁移到 Android Studio 和 Gradle 构建系统。正如@bgs 建议的那样,带有 Maven 的 Eclipse 也应该可以工作。

我们之前的做法:

仍在寻找更好的替代方案,但到目前为止,我们最终将 project.properties 保留在我们的仓库中。 project.properties 在拉取时如果没有更改,则不会被覆盖。我们还在自述文件中建议用户添加此内容

[alias]
commit = commit -X project.properties

到他们的.hg/hgrc 配置文件,以防止意外提交对该文件的更改。

此方法至少有一个缺点:合并时,即使您使用hg commit -m 'merge' 提交合并,您也可能会收到类似abort: cannot partially commit a merge (do not specify files or patterns) 的错误。如果发生这种情况,请暂时禁用该别名。

【讨论】:

以上是关于Eclipse:覆盖 project.properties 中定义的库路径的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Eclipse 中处理 Maven WAR 覆盖?

是否可以在 Eclipse 中使用 Emma 覆盖工具来忽略某些行?

方法不会覆盖 Eclipse 中的包可见方法

为啥 Cobertura 在通过 Eclipse 插件运行时报告 0% 覆盖率?

jacoco + eclipse单元测试覆盖率

Eclipse:覆盖 project.properties 中定义的库路径