您的位置:首页 > 编程语言 > Java开发

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

2017-07-01 14:29 281 查看

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前后依赖。

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

(调用make clean 实际执行:pre-clean 和 clean)

(调用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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  maven java 测试