Maven入门介绍

Maven

1. Maven介绍

Maven是一个项目管理工具,可以负责项目开发过程中几乎所有的东西。

1.2 生命周期

Maven用生命周期来描述一个项目的构建过程,一个生命周期中包含一组阶段的序列,每个阶段(phase)定义了目标(goal,操作)及目标被执行的顺序。一个典型的Maven构建生命周期 由以下几个阶段的序列组成:

  • prepare-resource,资源拷贝,本阶段可以自定义需要拷贝的资源
  • compile,编译,完成源代码的编译
  • package,打包,根据配置文件的描述,打包配置创建jar包
  • install,安装,在本地/远程仓库中安装工程包

这里感觉与Linux IP协议栈中的Netfilter类似(三表五链),定义了几个挂载点,在挂载点上挂载钩子函数,数据包在经过某个挂载点(对应Maven中的phase)时会自动执行 挂载的函数钩子(对应Maven中的goal)

Maven也是类似的,定义了生命周期中的序列(phase),在序列上注册目标(goal),然后当Maven开始构建工程时,会按照所定义的阶段序列的顺序执行每个阶段注册的目标。

Maven有以下三个标准的生命周期:

  • clean
  • default(or build)
  • site

1.2.1 clean

调用如下命令后,Maven进入clean生命周期

maven clean

clean生命周期由以下几个阶段(phase)组成:

  • pre-clean
  • clean
  • post-clean

2. Maven安装

3. Maven的标准工程结构

Maven的标准工程结构如下:

|-- pom.xml 	(Maven的核心配置文件)
|-- src
|-- main
|	-- java 			(java源代码目录)
		-- resources	(资源文件目录)
|-- test
	-- java 			(单元测试代码目录)
|-- target 				(输出目录,所有的输出物都放在这个目录下)
	-- classes 			(编译后的class文件存放处)

3. POM文件

POM代表工程对象模型。它是一个xml文件,包含了关于工程和各种配置细节的信息,Maven使用这些信息构建工程。 POM文件是使用Maven工作的基本组件。被放在工程根目录下,命名为pom.xml,每个project应该只有一个POM文件。

3.1 POM举例

<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.companyname.project-group</groupId>
<artifactId>project</artifactId>
<version>1.0</version>

</project>

每个POM文件需要project元素和三个必须的字段:

  • groupId: 工程组的标志:它在一个组织或项目中通常是唯一的
  • artifactId: 工程的标志:通常是工程的名称
  • version: 工程的版本号

以上三个字段唯一确定了某个project:groupId确定了组织,artifactId确定了该组织下的某个project(以名字来区分),version确定了该project的版本

4. Maven资源依赖

新建一个Maven项目时,Maven会检查你的pom.xml文件,确定哪些依赖需要下载。这里用到dependency标签,如下所示:

<dependencies>
	<dependency>
		<groupId>log4j</groupId>
		<artifactId>log4j</artifactId>
		<version>1.2.12</version>
		<scope>test</scope>
	</dependency>
</dependencies>

Maven会根据配置文件找到依赖关系,到Maven的本地资源库查找是否有该资源,如果没找到,Maven会自动从默认的Maven中央存储库查找下载。如果Maven中心存储库中也没有找到,该过程将 停止并将错误消息输出到maven控制台。

其中的scope标签,表示jar包的作用范围。可以填写compile、runtime、test、system和provided,用来在编译、测试等场景下选择对应的classpath。

4.1 Maven本地资源库

新建一个Maven项目时,所有相关文件将被存储在Maven的本地仓库。默认情况下,Maven的本地资源库默认在用户目录的.m2目录下, 可以通过修改配置文件来修改这个默认目录(maven安装目录/conf/setting.xml里面的localRepository项)

4.2 Maven中央存储库

对于本地仓库中没有的依赖包,Maven会从中央存储库中下载。可以在网站<link http://mvnrepository.com/>上搜寻需要的jar包及版本。

4.3 手动声明储存库

还可以在Maven的配置文件中声明远程的位置,如下:

<repositories>
	<repository>
		<id>java.net</id>
		<url>https://maven.java.net/content/repositories/public/</url>
	</repository>
</repositories>

现在,Maven的依赖库查询顺序更改为:

  1. 在Maven本地资源库中搜索,如果没有找到,进入第2步,找到则退出
  2. 在Maven中央存储库搜索,如果没有找到,进入第3步,找到则下载到本地存储库,然后退出
  3. 在声明的远程存储库搜索,如果没有找到,提示错误信息并退出,找到则下载到本地存储库,然后退出

5. Maven插件

Maven实际上是一个依赖插件执行的框架,如上所述,这个框架定义了项目的构建过程(阶段),每个阶段又可以分为多个目标。目标是实际需要执行的动作。动作是如何定义的呢? 就是通过插件。Maven中的插件式一个或多个目标的集合,定义了目标待执行的操作。插件简化了项目的构建,不然每次构建一个新的项目时我们都需要手动写一套待执行的动作(如Netfilter中 编写并挂载一套新的hook)。有了插件后,我们可以直接指定使用哪个插件完成哪个动作。同普通依赖库相同,插件在Maven中也使用相同的维护方法,不过在中央版本库中的维护目录不同。

可以使用下面的语法执行:

mvn [plugin-name]:[goal-name]

例如,一个Java工程可以使用maven-compiler-plugin的compile-goal编译,pom文件的配置如下:

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-compiler-plugin</artifactId>
	<version>3.1</version>
</plugin>

使用以下命令:

mvn compiler:compile

会调用maven-compiler-plugin插件并执行compile目标。完整的命令应该是

mvn org.apache.maven.plugins:maven-compiler-plugin:3.1:compiler

这里为什么可以直接的执行?

https://www.cnblogs.com/AlanLee/p/6208562.html

  1. Maven默认使用org.apache.maven.plugins作为groupId,所以命令mvn compiler:compile解析后变为:mvn org.apache.maven.plugins:compiler:compile
  2. 根据插件元数据的xml中配置的prefix(compiler)找到duiying de artifactId,此时命令解析变为:mvn org.apache.maven.plugins:maven-compiler-plugin:compiler:compile
  3. 最后根据groupId和artifactId,找到各个版本的该插件,用其中的稳定版本即可,此时命令解析为最终的形态

####5.1 插件类型

Maven提供了两种类型的插件

  1. Build Plugins: 在构建时执行,并在pom.xml的元素中配置
  2. Reporting Plugins: 在网站声称过程(site生命周期)中执行,并在pom.xml的元素中配置

5.2 常用插件

参考:

猜你喜欢

转载自my.oschina.net/u/2561528/blog/1805700