Maven是什么?
首先,Maven是什么?
一个项目管理工具,包含项目对象模型(Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System) 和用来运行定义在生命周期阶段中插件目标的逻辑
什么是约定优于配置?
系统、类库、框架应该假定合理的默认值,而非要求提供不必要的配置。在Maven中,它提供一些默认的选项,比如:
源代码约定存放在 project path/src/main/java
资源文件存放在 project path/src/main/resources
测试代码存放在 project path/src/test
生成项目JAR的类 project path/target/classes
项目JAR文件 project path/target
什么是Maven插件的全局重用性?
Maven的核心其实不做什么实际的事情,除了解析一些XML文档,管理生命周期与插件之外,它什么也不懂。反倒是Maven的插件被委派成主要职责的执行者,它们可以影响Maven的生命周期,提供对目标的访问。
Maven Surefire : 负责运行单元测试的插件,插件的发展往往有很好的向后兼容性,比如你可以用新版本的surefire插件来运行你的Junit3单元测试,结果也可以成功运行。 但是如果你想用surefire运行TestNG写的测试用例,你也可以运行,除了POM中一个插件的版本号,你不需要更改你项目的任何东西.
这种机制不仅仅适用于Surefire插件,也适用于项目使用Compiler插件进行编译等等,Maven将一般的构建任务抽象成插件,同时这些插件得到了很好的维护以及全局共享,你不需要从头开始自定义你项目的构建系统,然后提供支持。可以有人来维护这些插件,可以从远程仓库下载,这些都是基于 Maven插件的全局重用性.
如何理解,一个"项目"的概念模型?
Maven维护一个项目的模型,你需要为项目描述其属性。 项目的许可证是什么? 谁开发这个项目?这个项目有依赖于其他项目吗? Maven不仅仅类似于make和Ant的工具的基础上的改进,它基于项目模型, 这个项目定义的模型实现了一下特征:
- 依赖管理
项目是根据一个包含 组标识符,构建标识符和版本来定义,项目可以使用这些来声明依赖
- 远程仓库
和项目依赖相关的,我们可以使用定义在项目对象模型(POM)中的坐标来创建Maven构件的仓库
- 全局性构建逻辑重用
插件被编写成和项目对象模型一起工作,一切都被抽象到模型中,插件配置和自定义行为都在模型中进行
- 工具可移植性/集成
Maven出现之前,每个IDE都有不同的方法来存储实际上是自定义项目对象模型的信息。Maven标准化了这种描述,每个IDE仍然可以继续维护它的自定义项目文件,但是这些文件可以很容易的由模型生成。
- 便于搜索和过滤构件
像Nexus这样的工具,允许你使用存储在POM中的信息对仓库中的内容进行索引和搜索。
一个简单的Maven示例:
在任何地方编写一个POM.XML文件,比如 d:/mvn_test/pom.xml
写下如下代码:
<project><modelVersion>4.0.0</modelVersion><groupId>org.sonatype.mavenbook</groupId><artifactId>my-project</artifactId><version>1.0</version></project>
在命令行中定位到, d:/mvn_test下, 运行 mvn install
maven则会根据项目对象模型文件生成一个项目, 会创建target目录, 目录中会生成一个jar包跟一个存放POM属性文件的目录.
Maven标准目录结构
目录
描述
src/main/java |
源代码 |
src/main/resources |
资源文件 |
src/main/filters |
资源过滤文件 |
src/main/assembly |
Maven套件描述 |
src/main/config |
配置文件 |
src/main/webapp |
web应用资源 |
src/test/java |
测试源代码 |
src/test/resources |
测试资源 |
src/test/filters |
测试资源过滤文件 |
src/site |
应用站点 |
LICENSE.txt |
项目授权文件 |
README.txt |
Project's readme |
Maven的常用命令
mvn 命令是使用率最多的,常与下列参数一起使用:
命令
描述
mvn archetype:create |
创建Maven项目 |
mvn compile |
编译源代码 |
mvn test-compile |
编译测试源代码 |
mvn test |
运行应用程序中的单元测试 |
mvn site |
生成项目相关信息的网站 |
mvn clean |
清除项目目录中的生成结果 |
mvn package |
根据项目生成的jar |
mvn install |
在本地Repository中安装jar |
mvn eclipse:eclipse |
生成Eclipse项目文件 |
Maven 实战
使用maven archetype插件来创建一个项目;
mvn archetype:create -DgroupId=org.sonatype.mavenbook.ch03 -DartifactId=simple -DpackageName=org.sonatype.mavenbook
archetype:create 称之为maven的目标(通过archetype快速创建一个项目), 类似于Ant的一个目标.
-DName=value 代表给指定参数传入相应的值.
archetype:create 插件的前缀是 archetype ,目标为 create
其创建于artifactId匹配的目标--- simple ,此为项目的基础目录.
通过上面步骤创建了一个应用,下面需要构建与打包这个应用了
则可以将产生的项目构建并打包,则会产生target目录,结构如下:
其会将应用打包,你可以运行target下的jar文件,
Maven核心概念
上面,我们用了两种类型的命令来运行maven,
第一条命令是一条单个的插件目标 archetype:create
第二条命令是生命周期阶段-install
为了运行单个maven插件目标 ,我们使用 mvn archetype:create这样的语言,这里archetype是一个插件标识而create是目标标识。 一个maven插件是一个单个或者多个目标的集合。
Maven插件的例子有一些简单但核心的插件,像Jar插件,它包含了一组创建Jar文件的目标,compiler插件,它包含一组编译源代码和测试代码的目标 等等
另外,一个目标是一个明确的任务,它可以作为独立的目标运行,或者作为一个大的构建的一部分和其他目标一起运行。
一个目标是Maven中的一个"工作单元." 比如: Compiler插件中的compile目标,它用来编译项目中所有源文件. 目标也可以定义一些参数,参数可以定义一些明智的默认值。 可以使用-DName=value方式传入.
事实上,Maven的核心对你项目构建中特定的任务毫无所知。 它将所有任务代理给Maven插件来做,比如Compiler插件和Jar插件,它们在需要的时候被下载下来并且定时从Maven中央仓库更新。
当你下载Maven的时候,你得到的仅仅是一个包含了基本功能的Maven,它知道如何解析命令行,管理classpath,解析POM文件,在需要的时候下载Maven插件等等。 通过保持Compiler插件与Maven核心分离,并且提供有效的更新机制,我们很容易使用编译器的最新版本。
Maven生命周期
生命周期是包含在一个项目构建中的一些列有序的阶段。Maven可以支持许多不同的生命周期,但是最常用的生命周期是默认的Maven生命周期,其第一阶段是验证项目的基本完整性,最后一个阶段是把一个项目发布成产品。
默认的Maven生命周期
其中,插件目标可以附着在生命周期阶段上。 随着Maven沿着生命周期的阶段移动,它会执行附着在特定阶段上的目标。
Maven执行一个阶段的时候,它首先会有序的执行前面的所有阶段,到命令行指定的那个阶段为止。
Maven坐标
Archetype插件通过名字为pom.xml的文件创建了一个项目。这就是项目对象模型(POM),一个项目的声明描述。当Maven运行一个目标的时候,每个目标都会访问定义在项目POM里的信息。 比如; 当jar:jar目标需要创建一个JAR文件的时候,他通过观察POM来找出这个Jar文件的名字。
POM为项目命名,提供了项目的一组唯一标识符(坐标),并且通过依赖(dependencies),父(parents)和先决条件 (prerequisite)来定义和其他项目的关系。POM也可以定义插件的行为,为提供项目相关的社区和开发人员的信息.
一般来说,POM中的groupId,artifactId,version和packaging构造成项目的坐标,一个Maven坐标是一个地址,当一个项目通过依赖,插件或者父项目引用和另外一个项目关联的时候,Maven通过坐标来精确定位一个项目。
Maven坐标通过使用冒号作为分隔符来写: groupId:artifactId:packaging:version
|
Maven仓库
Maven中,构建和插件是在它们被需要的时候从远程仓库取出来的,初始的Maven下载包的大小很小,大概1.8M, 主要是初始的Maven不包括很多插件。 它只包含了几近赤裸的最少值,而在需要的时候再去仓库取。
Maven从远程仓库下载构件和插件到你本机上,存储在你的本地Maven仓库里。一旦Maven已经下载过一个构件,它将永远不需要再下载一次,因为Maven会首先查找本地的仓库,然后才是其他地方。
Maven仓库既是一个从远程仓库下载的构件的缓存,也允许你的项目相互依赖。
Maven依赖管理
我们可以在POM中定义项目的依赖,一个复杂的项目将会包含很多依赖,也有可能包含依赖于其他构建的依赖。这是Maven最强大的特征之一,它支持了传递性依赖。 比如说,你的项目依赖一个库,而这个库又依赖于5个或者10个其他的库(比如Spring),那么你不必找出所有这些依赖,然后写入POM,你只需要加上你直接依赖的那些库,Maven会隐式的把这些库间依赖的库也加入到你的项目中,Maven也会处理这些依赖中的冲突,同时能让你自定义默认的行为,或者排除一些特定的传递性依赖。
Maven中,一个依赖不仅仅是一个JAR,它是一个POM文件,这个POM文件可能也声明了对其他构建的依赖。这些依赖的依赖叫做传递性依赖,Maven仓库不仅仅存储二进制文件,也存储了这些构建的元数据,才使传递性依赖成为可能。
Maven站点生成和报告
Maven另外一个重要特征是,它能生成文档和报告。 运行mvn site命令即可。
这个命令会运行site生命周期阶段。 它不像默认生命周期那样,管理代码生成,操作资源,编译,打包等。 site生命周期只关心处理在src/site目录下的site内容,还有生成报告。
它会产生target/site目录,里面存放着一个web站点,它包含项目的一些报告。
Maven使用Demo:
利用m2eclipse插件来创建demo:
使用m2eclipse创建web项目:
这里m2eclipse会帮你做好一切准备工作,包括
创建相应的目录 、生成一个Servlet 、 在pom中加入项目默认依赖、添加jetty 插件.
项目创建好之后,有一个默认的servlet来测试项目是否生成成功。
命令行进入到项目根路径: 运行命令 mvn jetty:run
在m2eclipse创建web项目时,Jetty插件默认被安装,你可以查看pom.xml中的信息,则可以看到如下代码:
若命令行信息无误,则可以在浏览器中测试项目是否成功.默认的Servlet中,只打印出一句代码:
测试成功的效果则如下:
- 大小: 14.7 KB
- 大小: 20.2 KB
- 大小: 10.9 KB
- 大小: 9 KB
- 大小: 12.1 KB
- 大小: 27.5 KB
- 大小: 20.8 KB
- 大小: 55.1 KB
- 大小: 8.3 KB
- 大小: 3.4 KB
- 大小: 41.3 KB
- 大小: 20.6 KB
分享到:
相关推荐
使用场景及目标:适用于需要理解和掌握 Maven 的核心概念及其高级特性的开发团队成员,帮助他们在实际项目中有效地使用 Maven 进行构建和依赖管理。 阅读建议:建议读者结合实际项目案例进行实践操作,逐步掌握 ...
**Maven核心概念** 1. **项目对象模型(Project Object Model, POM)** Maven 的核心是POM,它是一个XML文件,包含了项目的基本信息,如项目名称、版本、依赖、构建目标等。POM使得Maven能够理解项目结构,并自动...
第3课 理解Maven核心概念(一) 第4课 使用Maven核心概念(二) 第5课 使用Maven创建web项目 第6课 使用Maven构建多模块项目(一) 第7课 使用Maven构建多模块项目(二) 第8课 使用Nexus搭建Maven私服 第9课 使用...
1. **Maven核心概念** - **项目对象模型(POM)**: POM是Maven中的核心概念,它是XML格式的配置文件,包含了项目的基本信息、依赖、构建目标、插件等信息。 - **依赖管理**: Maven自动处理项目的依赖关系,从远程...
**一、Maven核心概念** 1. **项目对象模型(Project Object Model,POM)** Maven的核心是POM,它是项目配置信息的XML文件。POM包含了项目的基本信息,如项目名称、版本、描述、依赖、构建设置等。通过POM,Maven...
Maven核心概念** - **POM**: Maven的中心概念,是一个XML文件,包含了项目的基本信息,如项目坐标(groupId, artifactId, version)、依赖、插件等。 - **依赖管理**: Maven通过POM文件管理项目所依赖的库,依赖...
** Maven核心概念 ** Maven是一个Java项目管理工具,它主要负责项目的构建、依赖管理和项目信息管理。Maven通过使用一种标准的项目对象模型(Project Object Model,POM),能够自动化构建过程,使得开发人员无需...
**一、Maven核心概念** 1. **项目对象模型(Project Object Model, POM)**:POM是Maven的核心,它是一个XML文件,包含了项目的基本信息,如项目坐标(groupId, artifactId, version)、依赖、构建配置等。 2. **...
一、Maven核心概念 1. 项目对象模型(Project Object Model,POM):Maven的中心概念是POM,它是项目的配置文件,通常以`pom.xml`的形式存在。POM包含了项目的基本信息,如项目名称、版本、开发者信息,以及项目...
### Maven核心概念 1. **项目对象模型(Project Object Model, POM)**:Maven的中心概念是POM,它是XML格式的配置文件,包含了项目的基本信息、依赖、构建指令等。POM文件帮助Maven理解项目结构和需求。 2. **...
使用Maven核心概念介绍(坐标、依赖、仓库、插件、生命周期等)、Maven与第三方Elicpse整合及如何在Eclipse中使用Maven、什么是私服、Maven为什么使用私服、Maven私服Nexus的安装使用、如何使用Maven构建Web应用、使用...
一、Maven核心概念 1. 项目对象模型(Project Object Model,POM):Maven的中心概念,它是一个XML文件,包含了项目的基本信息,如项目名称、版本、依赖、构建目标等。 2. 仓库:Maven通过仓库获取依赖,如本地仓库...
1. **Maven核心概念** - **项目对象模型(Project Object Model, POM)**:Maven项目的配置文件,以XML格式存储,包含了项目的基本信息、构建配置、依赖关系等。 - **坐标(Coordinates)**:每个Maven项目都有...
1. **Maven核心概念** - **项目对象模型(Project Object Model, POM)**:POM是Maven项目的基础,它是一个XML文件,包含了项目的基本信息,如项目名称、版本、依赖、构建目标等。 - **坐标(Coordinates)**:每...
1. Maven核心概念:包括POM(Project Object Model)、坐标系统(Group ID, Artifact ID, Version)、仓库(本地仓库和远程仓库)以及生命周期(Clean, Validate, Compile, Test, Package, Verify, Install, Deploy...
### Maven核心概念 1. **项目对象模型(Project Object Model, POM)**: Maven的中心概念是POM,这是一个XML文件,包含了项目的配置信息,如项目属性、依赖、构建目标等。 2. **坐标(Coordinates)**: Maven使用...
#### Maven核心概念 1. **坐标**:Maven使用坐标来唯一标识一个库,包括groupId、artifactId和version三个部分。 2. **依赖**:项目依赖其他项目时,需要在pom.xml文件中声明依赖关系,Maven会自动下载所需的依赖库...
1. Maven核心概念: - POM:项目对象模型,是Maven的核心,用于定义项目属性、依赖、构建目标等。 - 生命周期:包括清理、初始化、编译、测试、打包、验证、部署等多个阶段,每个阶段都有预定义的默认目标。 - ...