Maven最佳实践:遵循约定

转载自:http://juvenshun.iteye.com/blog/293975

现在看看使用Maven我们需要什么配置,就一个pom.xml文件:

Xml代码 收藏代码
  1. <project>
  2. <modelVersion>4.0.0</modelVersion>
  3. <groupId>org.sonatype.mavenbook</groupId>
  4. <artifactId>my-project</artifactId>
  5. <version>1.0</version>
  6. </project>

不用惊讶,Maven不会变魔术,它能做到这么简单,是有条件的,条件就是你要遵守Maven约定。pom.xml所在的目录应为项目的根目录,假设该目录为${proj-dir},那么Maven有以下假设:

  • ${proj-dir}/src/main/java —— 存放项目的.java文件。
  • ${proj-dir}/src/main/resources —— 存放项目资源文件,如spring, hibernate配置文件。
  • ${proj-dir}/src/test/java —— 存放所有测试.java文件,如JUnit测试类。
  • ${proj-dir}/src/test/resources —— 测试资源文件。
  • ${proj-dir}/target —— 项目输出位置。

运行一条mvn clean package命令,Maven会帮你清除target目录,重新建一个空的,编译src/main/java类至target/classes,复制src/main/resources的文件至target/classes,编译src/test/java至target/test-classes,复制src/test/resources的文件至target/test-classes;然后运行所有测试;测试通过后,使用jar命令打包,存储于target目录。Maven做的事情一点也不少,只是都对用户隐蔽起来了,它只要求你遵循它的约定。

这么做有什么好处呢?第一,显而易见,配置大量减少了,随着项目变得越复杂,这种优势就越明显。第二,我这里要强调的是,对于软件工程来说,所有使用Maven的项目,对外都暴露统一的命令集。如mvn clean install。只要项目被正确配置好了,任何一个新人,输入一行Maven命令,就能将项目构建起来了,这大大减少了交流学习的时间。

这时可能会有人说,我不想遵守这种约定呢?我要把源码放在${proj-dir}/src/code目录下。首先,问自己三遍,你真的需要这样做么?如果仅仅是因为喜好,那么别耍个性,个性意味着牺牲通用性,意味着增加无谓的复杂度。以下是一个“个性”的例子:

Xml代码 收藏代码
  1. <project>
  2. <modelVersion>4.0.0</modelVersion>
  3. <groupId>org.sonatype.mavenbook</groupId>
  4. <artifactId>my-project</artifactId>
  5. <version>1.0</version>
  6. <build>
  7. <sourceDirectory>src/java</sourceDirectory>
  8. <testSourceDirectory>src/test</testSourceDirectory>
  9. <outputDirectory>output/classes</outputDirectory>
  10. <testOutputDirectory>output/test-classes</testOutputDirectory>
  11. <directory>target/jar</directory>
  12. </build>
  13. </project>

很显然,Maven允许你自定义,比如这个例子中,Maven就被配置成从src/java目录寻找源码,编译class文件至output/classes,从src/test寻找测试源码,编译至output/test-classes目录,最后,打包jar文件至target/jar目录。Maven允许你这么做,但不推荐你这么做。因为一旦你使用这种自定义,习惯Maven约定的人一开始会觉得奇怪,src/main/java目录去哪里了?target下面怎么没有我要的jar文件?这些都造成了无谓的交流成本提高。只有一些特殊的情况,这些自定义手段能帮你解决实际的问题,比如你在处理遗留代码,你没办法改变源码目录结构,这个时候只有让Maven妥协。

下面总结一些Maven的默认值,也就是说,虽然你没做什么配置,但是你应该知道Maven假设它们成立,也就是所谓的“约定”:

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.xml
jar默认打包格式
%user_home%/.m2Maven默认的本地仓库目录位置
中央仓库Maven默认使用远程中央仓库:http://repo1.maven.org/maven2

其实基本上所有的约定,或者说默认配置,都可以在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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值