MAVEN学习 (1):创建MAVEN项目并且理解基本的原理

来源:互联网 发布:mac双系统卸载 编辑:程序博客网 时间:2024/05/17 06:51

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中定义了所有的默认的配置项。这里写图片描述

摘自:http://www.jianshu.com/p/0fb5e3fb704d 原文写的特别棒。手动点赞。
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之后。
这里写图片描述
这里写图片描述
这里写图片描述

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

首先要知道基本的mvn项目目录结构。
这里写图片描述
编写pom.xml放到和src同级目录下面。
然后mvn compile mvn test mvn install
这里写图片描述
此时可以看到这个GroupId并没有什么特别的要求。唯一的要求是要让这个项目更易于管理,没有编译上的要求。只要保证其他的项目依赖这个项目的时候找到就好。
这里写图片描述

4.创建目录的两种选择

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

MAVEN中项目依赖的处理:
这里写图片描述
聚合使用module 记得修改Packageing为pom
classpath对应scope。
三种classpath,编译,运行,测试。
scope选项的值会决定到底使用哪个classpath
compile,provided,test,import,system,runntime.
这里写图片描述

这篇文章写的很好。http://blog.csdn.net/wanghantong/article/details/36427165

原创粉丝点击