1.什么是MAVEN:

Maven首先是一个强大的Java构建工具,当然还有其他的工具。但是Maven更优秀。同时Maven本身也是用java开发的。理解Maven的工作原理,体会Maven这个软件的思想,对Java的学习也更有好处。
当然构建工具我们都用过,比如我现在使用的SmartIDE。构建工具的作用最主要的就是编译代码。Maven不仅仅完成了这个工作,同时还可以打包,生成项目文档,执行测试,把打包好的代码安装到服务器上。一个项目构建的整个过程,这样使用Maven就可以实现自动化,自动化的好处不言而喻,降低人为的错误成本,提高效率。其中MAVEN最优秀的当属依赖管理了。
安装Maven的文档网上都有,主要是下载直接解压即可,配置好环境变量,在windows中断输入MVN -v有回显就ok了。然后安装eclipse的Maven插件,配置基本的对象标示(groupid,artichId,type)然后进行编译,这里要注意一下,MAVEN需要用JDK来编译,所以默认的要把eclipse的Jre路径修改为JDK。
创建一个Maven项目有好几种方法,使用命令行,手动创建,ecelipse。建议都尝试一下,对整体的把握会更好。

2.我们理解一下Maven的核心概念:POM

首先这个POM指的是并不是工程目录中的pom.xml而是项目对象模型,但是他们之间仍然有联系。把将要构建的项目进行建模。把这个项目看成一个对象,那么这个对象(PO)的坐标就是由GroupId,artifactid,Version,Classifier,type 这5个部分组成。另一个方面一个项目肯定不能由一个对象组成啊,所以这个PO应该有depecdencies这个属性,用来表示它所以来的外部项目。

那么这个Po的属性我们可以用Java代码描述一下
class PO{
private String groupId;
private String artifactId;
private String version;
private String classifier;
private String type;
private Set<PO> dependencies;
}

OK,通过上面的结构尝试用xml文件来描述,

<PO>
    <groupId></groupId>
    <artifactId></artifactId>
    <version></version>
    <classifier><classifier>
    <type></type>
    <dependencies>
        <PO></PO>
        <PO></PO>
        ...
    </dependencies>
</PO>

so,很明显,这个就是pom.xml了。所以说,pom.xml就是用来描述PO的。所以当我们看到Maven项目中的pom.xml的时候,就会想到,这个xml文件是用来描述要构建的项目的。
那构建的时候这个Pom.xml有什么其他的属性呢?在pom.xml中有build相关的元素。关于Maven的构建一定要先了解lifecyle声明周期,在Maven中构建一个项目,就对应一个LifeCyle,这个LifeCyle也区分多个阶段,这个阶段叫做Phase,一个标准的构建LifeCyle包含这些Phase

validate: 用于验证项目的有效性和其项目所需要的内容是否具备
initialize:初始化操作,比如创建一些构建所需要的目录等。
generate-sources:用于生成一些源代码,这些源代码在compile phase中需要使用到
process-sources:对源代码进行一些操作,例如过滤一些源代码
generate-resources:生成资源文件(这些文件将被包含在最后的输入文件中)
process-resources:对资源文件进行处理
compile:对源代码进行编译
process-classes:对编译生成的文件进行处理
generate-test-sources:生成测试用的源代码
process-test-sources:对生成的测试源代码进行处理
generate-test-resources:生成测试用的资源文件
process-test-resources:对测试用的资源文件进行处理
test-compile:对测试用的源代码进行编译
process-test-classes:对测试源代码编译后的文件进行处理
test:进行单元测试
prepare-package:打包前置操作
package:打包
pre-integration-test:集成测试前置操作     
integration-test:集成测试
post-integration-test:集成测试后置操作
install:将打包产物安装到本地maven仓库
deploy:将打包产物安装到远程仓库

每一个生命周期的内部这些Phase都是顺序执行的,比如执行Mvn install那么deploy之前的Phase都是要执行的。
那么这些Phase又是怎么执行的呢?这就引入了Goal的概念,其实Phase有点像Java中的接口,只是进行了执行的协商,但是没有进一步的动作,而Goal就是来定义执行什么动作的。一个Goal在Maven中就是一个Mojo。这个Mojo中定义了一个Excute的方法,这个goal的具体动作就是在这个Excute方法中定义的。而这个Mojo类就是放在Maven plugin里面。所谓的Plugin其实也就是一个Maven项目,只不过这个项目会引用Maven的一些API。同样的既然他是Maven项目,当然也有Maven坐标。
那么他们是怎么关联上的呢?
在执行具体步骤的时候,我们需要为LifeCyhle的每个Phase来绑定一个Goal。这样才能够在每个步骤都来执行一个具体的动作。比如在lifeCycle中有个Compile Phase规定了构建的流程需要经过编译这个步骤,而Maven-compile-plugin这个plugin有个compile goal就是用javac来将源文件编译为class文件的。绑定的地方就是在pom.xml中的build元素。

<build>
<plugins>
  <plugin>
    <artifactId>maven-myquery-plugin</artifactId>
    <version>1.0</version>
    <executions>
      <execution>
        <id>execution1</id>
        <phase>test</phase>
        <configuration>
          <url>http://www.foo.com/query</url>
          <timeout>10</timeout>
          <options>
            <option>one</option>
            <option>two</option>
            <option>three</option>
          </options>
        </configuration>
        <goals>
          <goal>query</goal>
        </goals>
      </execution>
    </executions>
  </plugin>
</plugins>
</build>

这样就把maven-myquery-plugin 的test(phase)绑定到了quey(goal)

那么接下来,编译就需要编译的源文件,不过我们到目前为止还没有看到pom.xml有源文件的地方。Maven是怎么找到源文件的呢?

在Maven中是有一个规则,约定优于配置。Maven默认从项目的根目录开始从src/mian/java这个目录去查找java源文件。编译后的class保存在target/classes目录下。在Maven中,所有的PO都有一个根对象,super POM。super pom中定义了所有的默认的配置项。

maven 指定编码编译 maven编译原理_测试

3.Maven的生命周期:
在上一块我们介绍了这个构建的生命周期,从上面的描述中可以感受到Maven的生命周期是抽象的,即生命周期不做任何实际工作,实际的工作都是由goal来完成的,Maven还有几个其他的生命周期:
1.clean生命周期:清理项目,三个Phase
2.default生命周期:构建项目,重要的Phase如下:
3.site生命周期:建立和发布项目站点,phase如下:
这些命令周期之间是没有顺序依赖的,各个生命周期相互独立,一个生命周期的phase前后依赖。

命令行和生命周期的关联:

  1. (调用make clean 实际执行:pre-clean 和 clean)
  2. (调用default生命周期的teset,当然也就执行了teset之前的所有阶段)
    3.make clean install调用clean生命周期的clean阶段和default的install阶段,实际执行pre-clean和clean,install以及之前所有的阶段。
    在eclipse中右键Maven项目可以看到一些MVN 命令。
    当然可以自己配置命令行关联,至于这个自动关联的原理就是goal和phase的关系了。

创建一个Maven项目

好的既然了解了这么多,那么我们创建一个Maven项目吧

安装好maven eclipse之后。

maven 指定编码编译 maven编译原理_测试_02


maven 指定编码编译 maven编译原理_maven 指定编码编译_03


maven 指定编码编译 maven编译原理_测试_04

3.使用mvn命令行创建基本的mvn项目。

首先要知道基本的mvn项目目录结构。

maven 指定编码编译 maven编译原理_生命周期_05


编写pom.xml放到和src同级目录下面。

然后mvn compile mvn test mvn install

maven 指定编码编译 maven编译原理_测试_06


此时可以看到这个GroupId并没有什么特别的要求。唯一的要求是要让这个项目更易于管理,没有编译上的要求。只要保证其他的项目依赖这个项目的时候找到就好。

maven 指定编码编译 maven编译原理_生命周期_07

4.创建目录的两种选择

1.mvn archetype:generate
2.mvn archetype:generate -DgoupId====

MAVEN中项目依赖的处理:

maven 指定编码编译 maven编译原理_maven_08


聚合使用module 记得修改Packageing为pom

classpath对应scope。

三种classpath,编译,运行,测试。

scope选项的值会决定到底使用哪个classpath

compile,provided,test,import,system,runntime.

maven 指定编码编译 maven编译原理_maven 指定编码编译_09

这篇文章写的很好。