本帖最后由 测试积点老人 于 2019-1-7 17:10 编辑
Maven1. 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生命周期 clean生命周期由以下几个阶段(phase)组成:
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的依赖库查询顺序更改为: - 在Maven本地资源库中搜索,如果没有找到,进入第2步,找到则退出
- 在Maven中央存储库搜索,如果没有找到,进入第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>
复制代码
使用以下命令:
会调用maven-compiler-plugin插件并执行compile目标。完整的命令应该是 - mvn org.apache.maven.plugins:maven-compiler-plugin:3.1:compiler
复制代码
这里为什么可以直接的执行? - Maven默认使用org.apache.maven.plugins作为groupId,所以命令mvn compiler:compile解析后变为:mvn org.apache.maven.plugins:compiler:compile
- 根据插件元数据的xml中配置的prefix(compiler)找到duiying de artifactId,此时命令解析变为:mvn org.apache.maven.plugins:maven-compiler-plugin:compiler:compile
- 最后根据groupId和artifactId,找到各个版本的该插件,用其中的稳定版本即可,此时命令解析为最终的形态
5.1 插件类型 Maven提供了两种类型的插件 - Build Plugins: 在构建时执行,并在pom.xml的元素中配置
- Reporting Plugins: 在网站声称过程(site生命周期)中执行,并在pom.xml的元素中配置
|