我有些惊讶,如果确实如此,为什么没有人问过这个问题,但在浏览了15分钟的Stack Overflow后,并没有找到完全匹配的答案。(如果我错了,请指出正确的方向并投票关闭...)
问题1:
在Ant构建系统下,布局Java项目的最佳实践是什么?对于我们的目的,我们有以下背景(也许大部分都不相关):
- 大多数开发人员使用Eclipse(不是全部)
- 项目保存在subversion中
- 项目构建最近迁移到Hudson,在其中我们希望使用发布插件来管理发布,并使用一些自定义脚本来处理自动化部署
- 这个项目是一个“传统”应用程序,一种“生产原型”,用户非常有限,但他们位于隔离的远程站点,因此交付可追溯的版本化工件以进行简单安装、手动数据收集/恢复和远程诊断非常重要。
- 某些依赖项(JARs)包含在SVN存储库中;其他依赖项可以在构建时通过ant脚本获取,如果有必要。还没有像Ivy那样花哨的东西(请不要告诉我切换到Maven3...我知道,如果/当适当的时间来临,我们将这样做)。
- 构建包括JUnit、FindBugs、CheckStyle、PMD、JavaDoc和一些自定义文档生成
- 两到三个主要的JAR工件(一个主应用程序工件加上几个最小的API JAR,以包含在几个耦合应用程序中)
- 希望分发以下分发工件:
- 一个“完整的”源+二进制tarball,其中包括所有依赖项解决方案、预构建的jars和JavaDoc
- 一个二进制tarball,只包括文档和JavaDoc、jars以及辅助包装器脚本等
- 一个“合作伙伴”源+二进制文件,其中包含合作伙伴开发人员可能查看的“共享”源代码,以及相关的测试用例
当前的结构如下
project-root/ project-root/source project-root/source/java // 主应用程序(依赖于-icd)项目根目录下有几个子目录,包括distributable interface code、JUnit测试源代码、配置/数据、预格式化文档和依赖JAR文件等。构建时,还会生成编译的类文件、API文档、JAR库、输出结果等,并自动生成的.java产品。如何在开发过程中保持版本控制和构建产物之间的严格分离,同时生成一个一致的发布版本,以及将开发树视为操作/发布的过程中出现的问题?可以考虑将构建后的产物存储到一个独立的目录(例如build/dist),并将其作为发布版本进行传播,而不是将它们直接放在开发者的根目录下的lib目录中。这样做既能保证严格的版本控制,也能让用户和开发者使用相同的目录结构。将生成的所有产品放在单独的build/
目录中对于开发很好,但是作为发布的产物,这是一个很烦人的问题。为了发布目的,我宁愿所有的 JAR 包都放在一个单独的lib
目录中,实际上,像下面这样的结构最有意义。目前,我们通过执行一些复杂的路径操作来在 .tar.gz 和 .zip 文件生成时动态构建此结构。我认为 dist 应该如下所示:
project-root/ project-root/source // 仅出现在某些发布版本中 project-root/etc // 与开发树相同 project-root/doc // 与开发树相同 project-root/doc/javadoc // 来自 build project-root/lib // 所有依赖项和构建的 JAR 文件 project-root/bin // 与开发树相同 build.properties // 构建和发布编号等信息...这个问题专门涉及“如何保持清洁的开发和发布项目布局”的问题;但也收集关于 Java/Ant 项目布局的一般信息和对我们特定方法的评论。(是的,如果您认为它应该是一个社区 Wiki,我会这么做...)
project-root
完全复制所有内容到project-root/build
并不优雅。也许我对此过于苛求了,或者只是想要同时拥有开发者树和用户树...我希望我的开发者树看起来像用户树,但我不希望构建时的产物与受版本控制的项目混在一起。也许将所有内容完全复制到build/
子目录是实现这一点的唯一途径...你是如何布置你的项目(在仓库中以及构建时)的呢? - andersoj