Maven最佳实践:遵循约定
“一法度衡石丈尺,车同轨,书同文字” —— 《史记秦始皇本纪》
?
标准的重要性不用我过于强调,想象一下如果不是所有人都基于HTTP开发WEB应用,这个世界会乱成怎样。IE,FF等浏览器之间的差别已经让很多开发者头痛不已。JAVA成功的原因之一就是由于它能屏蔽大部分操作系统的差异,XML流行的原因之一是所有语言都接受它。Maven当然还不能和这些既成功又成熟的技术相比,但所有Maven的用户都应该清楚,Maven提倡的是“约定优于配置(Convention Over Configuration)”,这是Maven最核心的理念之一。
?
Maven是服务于项目生命周期的(有些人说它是build工具,但build只是生命周期的一部分),它试图抽象整个项目生命周期,实际上它也做到了。几乎所有的项目都离不开Mave所定义的生命周期阶段(clean compile test package site...)。不止如此,基于这些阶段,Maven通过插件提供了绝大部分的默认实现,它们不用做任何配置(或者仅需要很少的配置),就能帮你完成你的工作。
?
先看一个简单的基于Ant的build.xml文件。(在Maven之前,你在使用Ant,对吧?如果连Ant都没用,那就更糟了)
这段代码做的事情是清除目录,创建目录,编译源文件,复制依赖至目标目录。这已经十分简单了,但是,为此你还是需要做一些配置:指定源码目录,指定编译字节码目录,指定目标目录,你还需要记住一些ant的配置命令,如delete, mkdir, javac, jar。这看起来没什么问题,至少目前是这样。
?
可能还有用shell脚本在做build这件事情,那么配置可能会比这个复杂一点(笔者不熟悉shell,如果有能将上述代码用shell重写一遍,笔者将不甚感激)。
?
现在说说Ant或shell/bat存在的问题,首先,有很多配置需要你填写,源码目录,字节码目录……,每一个项目,你都要重复这些劳动;第二,也是更重要的一点,你根本无法保证N个项目的ant配置(或shell)配置使用了相同的风格,后果是,每接受一个项目,开发者都要去学习这份脚本,以了解如何构建项目。如果第一个原因只是为了技术的简化的话,第二个原因更是软件工程的因素,我们不是一个人在开发项目,不是只开发一个项目,所以应该时刻谨记为了别人,为了将来。
?
现在看看使用Maven我们需要什么配置,就一个pom.xml文件:
Maven约定目录src/main/javajava源码目录目录src/main/resources资源文件目录目录src/test/java测试java源码目录目录src/test/resources测试资源文件目录目录target打包输出目录目录target/classes编译输出目录目录target/test-classes测试编译输出目录目录target/site项目site输出目录目录src/main/webappweb应用文件目录(当打包为war时),如WEB-INF/web.xmljar默认打包格式*Test.javaMaven只会自动运行符合该命名规则的测试类%user_home%/.m2Maven默认的本地仓库目录位置中央仓库Maven默认使用远程中央仓库:http://repo1.maven.org/maven21.3Maven Compiler插件默认以1.3编译,因此需要额外配置支持1.5?
其实基本上所有的约定,或者说默认配置,都可以在Maven的超级POM(super pom)中找到。由于所有的POM都继承了这个超级POM(类似于java中所有类都继承于Object),因此它的默认配置就被继承了。以Maven 2.0.9为例,你可以在%m2_home%/lib/下看到一个名为maven-2.0.9-uber.jar的文件,打开这个文件,可以找到org/apache/maven/project/pom-4.0.0.xml这个文件,这就是超级POM。
?
Maven提供了一套科学的默认配置,它要求你遵循这些配置约定,然后它就会帮你处理日常的事务compile, test, package等等。使用Maven的时候,你应该尽可能遵循它的配置约定,一方面可以简化配置,另一方面可建立起一种标准,减少交流学习成本。一旦你习惯了这种约定,你得到的回报是巨大的。反之,恣意的做自定义,想要Maven像Ant一样听你的话,那么你会讨厌Maven,Maven也会讨厌你。
1 楼 shiren1118 2008-12-15 约定优于配置(Convention Over Configuration)
叫规约的也挺多的~~~~ 2 楼 shiren1118 2008-12-15 可以达意,感觉还是像翻译的,嘎嘎~~~ 3 楼 shooray 2009-05-26 看【约定】就知道应该是原创,顶作者。
规约这个词不知道是谁创造出来的,听着都难受。现有的词汇可以表达的东西,就不要再发明创造了。