`
thisisvoa
  • 浏览: 63656 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

学习笔记之Maven(一)

阅读更多

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的工具的基础上的改进,它基于项目模型, 这个项目定义的模型实现了一下特征:

    1. 依赖管理
      项目是根据一个包含 组标识符,构建标识符和版本来定义,项目可以使用这些来声明依赖
    2. 远程仓库
      和项目依赖相关的,我们可以使用定义在项目对象模型(POM)中的坐标来创建Maven构件的仓库
    3. 全局性构建逻辑重用
      插件被编写成和项目对象模型一起工作,一切都被抽象到模型中,插件配置和自定义行为都在模型中进行
    4. 工具可移植性/集成
      Maven出现之前,每个IDE都有不同的方法来存储实际上是自定义项目对象模型的信息。Maven标准化了这种描述,每个IDE仍然可以继续维护它的自定义项目文件,但是这些文件可以很容易的由模型生成。
    5. 便于搜索和过滤构件
      像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 ,此为项目的基础目录.

通过上面步骤创建了一个应用,下面需要构建与打包这个应用了

mvn install

则可以将产生的项目构建并打包,则会产生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中,只打印出一句代码:


测试成功的效果则如下:

分享到:
评论

相关推荐

    maven学习笔记maven学习笔记

    maven学习笔记maven学习笔记maven学习笔记

    读书笔记:maven实战学习笔记.zip

    读书笔记:maven实战学习笔记

    Maven学习笔记.zip

    **Maven学习笔记** 在Java开发领域,Maven是一个不可或缺的构建...本学习笔记涵盖了Maven的基础知识,从安装到使用,希望能为你的Maven学习之路提供帮助。在实际开发中,不断实践和探索,你将更加熟练地驾驭Maven。

    Maven 教程:基础篇-尚硅谷学习笔记 2022年

    **Maven教程:基础篇——尚硅谷学习笔记 2022年** Maven是一个强大的Java项目管理和构建工具,由Apache软件基金会开发。它通过提供一个标准的项目对象模型(Project Object Model,POM)来简化项目的构建过程,并...

    maven学习笔记01(基础入门)

    ** Maven基础入门 ** Maven是一个Java项目管理工具,它主要负责构建、依赖管理和项目信息管理。...在`maven_study_01`的学习笔记中,你可以找到更多关于Maven的基础知识和实践案例,帮助你快速上手并掌握这一工具。

    Maven学习笔记一 maven私服和项目的创建

    NULL 博文链接:https://bing-zz.iteye.com/blog/1460546

    maven项目学习笔记记录

    **Maven项目学习笔记记录** 在软件开发领域,Maven是一个强大的项目管理和构建工具,尤其在Java开发中广泛使用。本笔记将深入探讨Maven的核心概念、主要功能以及实际应用场景,帮助你更好地理解和掌握这一重要工具...

    Maven3 学习笔记

    【标题】:“Maven3 学习笔记” 在软件开发领域,Maven 是一个非常重要的构建工具,尤其在Java世界中占据着主导地位。Maven3 是 Maven 的第三个主要版本,它增强了性能,提升了用户体验,并引入了更多现代化的构建...

    maven学习笔记.rar

    ** Maven学习笔记详解 ** Maven,作为Java项目管理和构建工具,是开发人员不可或缺的利器。它通过使用一种标准化的项目对象模型(Project Object Model,POM)来管理项目的依赖关系,构建过程以及配置信息。Maven...

    maven学习笔记整理

    maven学习笔记整理

    maven基础学习笔记

    maven基础学习笔记

    尚硅谷Maven课程笔记代码资源

    【尚硅谷Maven课程笔记代码资源】是一份全面学习Maven的资料集合,它涵盖了从基础到高级的各种知识点,旨在帮助开发者深入理解并熟练运用Maven进行自动化构建。该资源包含课件、源码和相关的笔记,使得学习过程更加...

    Maven高级-黑马程序员学习笔记

    Maven的多模块开发特性允许我们将项目组织成一个父项目和若干子项目,每个子项目代表一个独立的模块。这种结构使得代码逻辑清晰,便于团队协作。 1. **设置模块关系**:在父POM中,通过`&lt;modules&gt;`标签声明子模块,...

    Maven学习笔记

    **Maven学习笔记** Maven是一个强大的Java项目管理和构建工具,它简化了项目的构建、依赖管理和文档生成。本文档基于尚硅谷的视频教程,旨在帮助读者深入理解Maven的核心概念和使用方法。 **1. 为什么学习Maven** ...

    mybatis_maven学习笔记

    【mybatis_maven学习笔记】 在Java开发领域,MyBatis和Maven是两个不可或缺的工具,它们分别在数据访问层和项目构建方面扮演着重要角色。MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射,...

    maven学习笔记1

    【Maven学习笔记1】 Maven是一个强大的Java项目管理和构建工具,它可以帮助开发者管理项目的依赖、构建过程、项目信息和报告。本笔记主要涵盖了Maven的基础知识,包括资料收集、安装指南,特别是针对Linux环境下的...

    Maven 2 学习笔记.txt

    ### Maven 2 学习笔记 #### 一、Maven 项目的基本结构及创建 Maven使用特定的目录结构来组织项目文件,通过`mvn archetype:create`命令可以快速创建项目模板。例如: ```shell mvn archetype:create -DgroupId=...

    maven_实战_学习笔记

    maven_实战_学习笔记 Maven安装 Maven 使用入门 主代码 位置:src/main/java 命令:mvn clean compile 解释:clean告诉maven清理target目录 compile告诉maven 编译项目主代码 测试代码 位置:src/test/java 命令...

Global site tag (gtag.js) - Google Analytics