繁体   English   中英

基于Ant的构建的Java项目布局最佳实践

[英]Java Project Layout Best Practices for Ant-based Builds

我有点震惊(如果?)这个确切的问题没有被问到,但15分钟的扫描SO并没有完全匹配。 (如果我错了,请指出正确的方法并投票结束...)

问题1:

在Ant构建系统下布置Java项目的最佳实践是什么? 出于我们的目的,我们有以下背景(可能大多数是无关紧要的):

  • 大多数开发人员都在使用Eclipse(并非所有)
  • 项目维持颠覆
  • 项目构建最近已迁移到Hudson,我们希望使用发布插件来管理版本,以及一些自定义脚本来处理自动部署
  • 这个项目是一个“常规”应用程序,一种“生产原型”,用户数量非常有限,但它们位于具有气隙分离的远程站点,因此可以提供版本化,可追溯的工件,以便于安装,手动数据收集/恢复,和远程诊断很重要。
  • 一些依赖项(JAR)包含在SVN repo中; 如果需要,可以在构建时通过ant脚本获取其他内容。 没有像Ivy那样花哨的东西(请不要告诉我切换到Maven3 ......我知道,如果/适当的时候到了,我们会这样做。)
  • Build包括JUnit,FindBugs,CheckStyle,PMD,JavaDoc,一些自定义文档生成
  • 两个或三个主JAR工件(一个主应用程序工件加上几个最小的API JAR,包含在几个耦合的应用程序中)
  • 希望分发以下分发工件:
    • 一个“完整”源+ bin tarball,所有依赖项已解析,jars和JavaDoc预构建
    • 一个bin tarball,只有docs和JavaDoc,jar和辅助包装脚本等
    • 一个“合作伙伴”源+ bin,它具有合作伙伴开发人员可能关注的“共享”源以及相关的测试用例

目前的结构看起来像这样

project-root/
project-root/source                 
project-root/source/java             // main application (depends on -icd)
project-root/source/java-icd         // distributable interface code
project-root/source/test             // JUnit test sources
project-root/etc                     // config/data stuff
project-root/doc                     // pre-formatted docs (release notes, howtos, etc)
project-root/lib                     // where SVN-managed or Ant-retrieved Jars go
project-root/bin                     // scripts, etc...

在构建时,它扩展到包括:

build/classes                        // Compiled classes
build/classes-icd 
build/classes-test
build/javadoc
build/javadoc-icd                    
build/lib                            // Compiled JAR artifacts
build/reports                        // PMD, FindBugs, JUnit, etc... output goes here
build/dist                           // tarballs, zipfiles, doc.jar/src.jar type things, etc..
build/java                           // Autogenerated .java products
build/build.properties               // build and release numbering, etc...

问题2:

我怎样才能保持版本控制项目和建设时工件之间在开发树严格分离,同时产生一个连贯的分布如上让我来开发和测试过程中对待开发树作为业务/分配? 特别是,我不喜欢在顶级lib目录中使用我的<jar>任务drop .jar文件 - 开发人员树中的该目录是不可侵犯的SVN区域。 但是使用build/lib/*.jar分发一些供公众使用的东西是令人困惑的烦恼。 我们希望在分发中的一致位置出现的文档和其他构建工件也是如此,但不希望开发人员和用户使用完全不同的目录结构。

将所有生成的产品放在一个单独的build/目录中对于开发时非常好,但它是一个令人烦恼的工件。 出于分发的目的,我宁愿将所有JAR放在一个lib位置,事实上,像下面这样的结构最有意义。 目前,我们建立在与飞这种结构ant dist做一些复杂的路径的操作以.tar.gz和.zip文物都建。

我认为dist应该是这样的:

project-root/
project-root/source                  // present in only some dists 
project-root/etc                     // same as in development tree
project-root/doc                     // same as in development tree
project-root/doc/javadoc             // from build 
project-root/lib                     // all dependency and built JAR files
project-root/bin                     // same as in development tree
build.properties               // build and release numbering, etc...

这个问题只是关于“我如何保持清洁的开发和分配项目布局?” 正如我上面所说; 同时也收集有关Java / Ant项目布局的信息,以及对我们特定方法的批评。 (是的,如果您认为它应该是社区Wiki,我会这样做......)

在布局方面,我们使用的东西已经发展成非常接近Maven布局的东西( 见这里 )。 这是一个非常实用的布局,已被很多人使用。 并且,如果您想稍后切换到Maven,那么您已经完成了设置。 我们有几个变体,其中最重要的是我们将自动化单元和集成测试分开。

在混合来源和建造人工制品方面 - 我当然会建议反对它。 正如您所见,它与IDE索引和版本控制相混淆,并且通常会使生活变得困难。

据我所知,要么必须接受这种混合,要么将依赖项作为构建的一部分进行复制,并将输出视为一个单独的项目 - 如果需要,可能会在另一个IDE窗口中不断打开。 无论如何,将“作为用户”的工作与作为发布包的“生产者”混合的想法听起来会让人感到困惑。

我的一个建议是你分发的目录树不应该是CVS中的目录树。 有一个脚本将build目录放在一起构建,然后将其拉上。 该脚本可以将源控制文件和派生文件组合到其内容中。 它还可以执行诸如清除SVN目录之类的操作,您不想分发这些目录。 如果您希望能够以相同的方式处理开发和分布式树,只需确保dist的布局与开发项目的布局相同 - 最简单的方法是复制除build子目录之外的所有内容。 (和CVS目录,也许像Eclipse .project和.classpath这样的东西)。

我怀疑你不会喜欢这个建议。 您可能认为分布式文件只是开发环境的可移植版本 - 但我认为它不是,它永远不会是,并且它不需要。 如果你能接受这个想法,你可能会觉得我的建议很合适。

编辑:我想了一下,看了一下我使用的一些脚本。 我认为在这种情况下我要做的就是在开发过程中建立一个单独的树; 将执行环境指向project-root / build / app(或者如果可以的话,可能是project-root / build)而不是project-root,然后是符号链接(或者如果没有符号链接则复制)所有必需品(无论是静态的) ,从项目根目录,或从构建中派生出来的那个。 然后,构建分布可能就像压缩该树一样简单(当然,使用解析符号链接的工具)。 关于这一点的好处是它允许执行树的结构非常干净 - 它不包含源目录,IDE文件,构建脚本或项目内部的其他支持文件等。如果您正在使用Subversion ,它仍然包含静态区域符号链接的任何内容中的.svn目录; 如果您使用的是Mercurial,它将不包含任何.hg内容。

http://ant.apache.org/ant_in_anger.html

该项目包含子目录

  • bin常用二进制文件,脚本 - 把它放在路径上。
  • 这是建筑用的树; Ant创建它并可以在“干净”项目中清空它。
  • dist分配输出在这里; 该目录在Ant中创建,清理将其清空
  • doc手工制作的文档
  • lib导入的Java库进入此目录
  • src源在此树下以与包名称匹配的层次结构进入。

sun / oracle的一般建议(也许有点过时)可能需要查看项目布局:

端到端Java应用程序的准则,模式和代码

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM