约定优于配置是一个简单的概念。 系统,类库,框架应该假定合理的默认值,而非要求提供不必要的配置。 流行的框架如 Ruby on Rails 2 和 EJB3 已经开始坚持这些原则,以对像原始的 EJB 2.1 规范那样的框架的配置复杂度做出反应。 一个约定优于配置的例子就像 EJB3 持久化,将一个 特殊的Bean持久化,你所需要做的只是将这个类标注为 @Entity 。 框架将会假定表名和列名是基于类名和属性名。 系统也提供了一些钩子,当有需要的时候你可以重写这些名字,但是,在大部分情况下,你会发现使用框架提供的默认值会让你的项目运行的更快。
Maven通过给项目提供明智的默认行为来融合这个概念。 在没有自定义的情况下,
源代码假定是在 D:/linkin/mavenTest/src/main/java ,
资源文件假定是在 D:/linkin/mavenTest/src/main/resources。
测试代码假定是在 D:/linkin/mavenTest/src/test 。
项目假定会产生一个 JAR 文件,Maven假定你想要把编译好的字节码放到
D:/linkin/mavenTest/target/classes 并且在D:/linkin/mavenTest/target 创建一个可分发的 JAR 文件。
虽然这看起来无关紧要,但是想想大部分基于 Ant 的构建必须为每个子项目定义这些目录。 Maven 对约定优于配置的应用不仅仅是简单的目录位置,Maven 的核心插件使用了一组通用的约定,以用来编译源代码,打包可分发的构件,生成 web 站点,还有许多其他的过程。 Maven 的力量来自它的"武断",它有一个定义好的生命周期和一组知道如何构建和装配软件的通用插件。如果你遵循这些约定,Maven 只需要几乎为零的工作——仅仅是将你的源代码放到正确的目录,Maven 将会帮你处理剩下的事情。
使用“遵循约定优于配置”系统的一个副作用是用户可能会觉得他们被强迫使用一种特殊的方法。 当然 Maven 有一些核心观点不应该被怀疑,但是其实很多默认行为还是可配置的。 例如项目源码的资源文件的位置可以被自定义,JAR 文件的名字可以被自定义,在开发自定义插件的时候,几乎任何行为可以被裁剪以满足你特定的环境需求。如果你不想遵循约定,Maven 也会允许你自定义默认值来适应你的需求。
OK,那我们现在安装好maven,具体的环境变量配置这些我就不重复了。maven为我们提供了好多的骨架,可以适用于不用类型的项目。我们先使用CMD窗口来生成一个maven项目架构,看下maven项目的目录。
1,生成一个java项目。
CMD指令下切换到自己要建项目的路径下,输入 mvn archetype:generate,敲下回车就会让我们输入groupId,artifactId,version,package。之后就会帮我们生成一个普通的java项目。生成的项目我们打开看下在src下main和test中是没有resources目录的,我们自己建一个用来放我们的资源文件。
2,生成一个web项目。
mvn archetype:generate -DarchetypeArtifactId=maven-archetype-webapp,敲下回车正确输入相关参数后,就会帮我们生成一个web项目。现在我们来看下生成的web项目,在main文件夹下是没有java目录,在项目下也没有test文件夹目录,那我们就自己来建。
自己完善后的项目目录结构如下:
使用目录模板,可以使 pom.xml 更简洁。因为Maven已经根据缺省目录,预定义了相关的动作,而无需人工的干预。以 resources 目录为例:src/main/resources,负责管理项目主体的资源。在使用Maven执行compile之后,这个目录中的所有文件及子目录,会复制到target/classes目录中,为以后的打包提供了方便。src/test/resources,负责管理项目测试的资源。在使用Maven执行test-compile之后,这个目录中的所有文件及子目录,会复制到target/test-classes目录中,为后续的测试做好了准备。如今,完全不需要在pom.xml中指定就能够自动完成。在src和test都使用resources,方便构建和测试,这种方式本就已是前人的经验。通过使用Maven,使这个经验在开发团队中得到普及。
创建标准目录模板,可以通过如下命令:
mvn archetype:create -DgroupId=com.codeline.commons -DartifactId=codelineCommons
mvn archetype:generate 我一般使用generate来生成。
Maven也考虑到:不同类型的项目需要拥有不同的目录结构。如创建web项目,可以使用命令:
mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-webapp -DarchetypeArtifactId=maven-archetype-webapp
mvn archetype:generate -DarchetypeArtifactId=maven-archetype-webapp