一、概念:

Maven是一个项目管理工具,它包含了一个项目对象模型(Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。

1、项目构建流程:

2、Maven项目目录:

目录

说明

src/main/java

存放项目的java文件

src/main/resources

存放项目的资源文件,如spring,hibernate的配置文件。

src/test/java

存放所有的测试的java文件。

src/test/resources

存放测试用的资源文件。

target

项目输出位置。

pom.xml

对象模型配置文件

二、仓库:

Maven的仓库三种:本地仓库、中央仓库、远程仓库;

(一)  本地仓库:

本地仓库是指 maven 下载了插件或者 jar 文件后存放在本地机器上的拷贝。在 Linux 上,它的位置在 ~/.m2/repository,在 Windows XP 上,在 C:\Documents and Settings\username\.m2\repository ,在 Windows 7 上,在 C:\Users\username\.m2\repository。当 maven 查找需要的 jar 文件时,它会先在本地仓库中寻找,只有在找不到的情况下,才会去远程库中找。

可以在%MAVEN_HOME%/conf/settings.xml中设置localRepository的值来修改本地仓库路径

运行 mvn install 可以把我们的项目安装到本地库;

(二) 中央仓库:

Maven的中央仓库由Maven社区提供,默认地址是http://repo1.maven.org/maven2,所有不在本地仓库中的依赖都会去这个中央仓库查找。然后Maven会将这些依赖下载到你的本地仓库。访问中央仓库不需要做额外的配置。

(三) 远程仓库:

远程仓库一般用于放置组织内部的项目,该项目由多个项目共享;

远程仓库是位于web服务器上的一个仓库,Maven可以从该仓库下载依赖,就像从中央仓库下载依赖一样。远程仓库可以位于Internet上的任何地方,也可以是位于本地网络中。

远程仓库不能被外部访问,因此不能放在公开的中央仓库下,而应该放到内部的远程仓库中。

远程仓库中的依赖也会被Maven下载到本地仓库中。

可以在pom文件里配置远程仓库。将以下的xml片段放到属性之后:

 <repositories>
  <repository>
    <id>jenkov.code</id>
    <url>http://maven.jenkov.com/maven2/lib</url>
  </repository>
</repositories>

三、安装:

1、JDK的安装;

2、在Apache的官网上http://maven.apache.org/download.cgi下载最新版本的Binary zip archive包并解压到硬盘上的某个路径下;

3、配置环境变量:

a)   添加环境变量M2_HOME,值为maven包的路径;

b)   在环境变量PATH里面添加maven的bin的路径;

4、测试安装是否成功:

在cmd命令行窗口下输入:mvn –version,如果显示出maven的版本号,则说明安装成功;

5、Eclipse配置:

a)   配置maven的安装路径:

在上图中点击“Add”按钮,然后Maven的路径,确定后就会在列表中显示;

b)   配置maven 本地库的路径:

在上图中点击“Browser”按钮,选择maven路径下的settings.xml文件,settings.xml中配置的localRepository项的值就会显示在下面;

c)   运行参数配置:

选择jdk项,点击“编辑”按钮,在下面的缺省VM参数里面输入:

-Dmaven.multiModuleProjectDirectory=$M2_HOME

四、常用命令:

命令

说明

mvn archetype:create

创建Maven项目

mvn compile

编译源代码

mvn deploy

发布项目

mvn test-compile

编译测试源代码

mvn test

运行应用程序中的单元测试

mvn site

生成项目相关信息的网站

mvn clean

清除项目目录中的生成结果

mvn package

根据项目生成的jar

mvn install

在本地Repository中安装jar

mvn eclipse:eclipse

生成eclipse项目文件

mvn jetty:run

启动jetty服务

mvn tomcat:run

启动tomcat服务

mvn clean package -Dmaven.test.skip=true

清除以前的包后重新打包,跳过测试类

五、生命周期:

1、    Maven有三个内嵌的生命周期:clean是删除target目录中之前生成的.class和.jar等文件;default是默认生命周期,负责项目的编译和打包; site关注的是为项目生成文档,实际上site可以为项目生成一个网页式的文档。

2、    每一个生命周期被分为一系列的构建阶段,构建阶段又被分为一系列的构建目标。因此,整个构建过程由一系列的生命周期、构建阶段和构建目标组成。

3、    你可以执行一个生命周期,如clean或site,一个构建阶段,如default生命期的install,或者一个构建目标,如dependency:copy-dependencies。注意:你不能直接执行default生命期,你需要指定default生命期中的一个构建阶段或者构建目标。

4、    将构建阶段的名称作为参数传给mvn命令,就是执行该构建阶段,如:mvn package。

(一) Clean清理项目:

a)   pre-clean 执行清理前的工作

b)   clean 清理上一次构建生成的所有文件

c)   post-clean 执行清理后的文件

(二) Default构建项目:

d)   compile 编译项目中的源代码;

e)   test 使用合适的单元测试框架进行测试,这些测试代码不会被打包或部署;

f)   test-compile 将需要测试的源代码编译到路径,一般是编译src/test/java目录下的java文件至目标输出的测试classpath目录中;

g)   package 接受编译好的代码,打包成可发布的格式,如JAR;

h)   install 将包安装到本地仓库,给其他本地引用提供依赖;

(三) Site生成项目站点:

i)   pre-site 在生成项目站点前要完成的工作;

j)   site 生成项目的站点文档;

k)   post-site 在生成项目站点后要完成的工作;

l)   site-deploy 发布生成的站点到服务器上;

六、新建maven项目:

1、新建maven工程:

2、选择工程类型:

3、输入工程信息:

4、运行项目:

单击右键项目"run as"--->maven build,在Navigator视图下可以看到target目录下有文件了。

注意:如果运行时提示“No goals have been specified for this build…………”,则需要打开运行配置窗口,然后在Goals中输入“compile”就行:

七、POM文件:

属性名

说明

modelVersion

表示正在使用的pom模型版本

groupId

群组ID: 公司域名反写

artifactId

项目ID: 一个公司只有一个域名,但是可以有多个项目

version

版本号: 用于描述开发过程的阶段性标识

project.build.sourceEncoding

默认字符集

dependencies

依赖管理

dependency

具体的依赖项

parent

一个pom可以继承自父pom,它可以继承父pom的dependencies,要想让一个pom继承另一个pom,可以使用parent标签来声明父pom,然后在parent标签里面包含groupId, artifactId, version, relativePath属性。

如果子pom和父pom有相同的内容,子pom中的值会覆盖父pom中的值

dependencyManagement

只是声明依赖,并不实现引入

plugins

引入插件

pluginManagement

表示插件声明,Maven不会加载该插件

properties

声明定义一个属性,而要使用这个属性时可以使用“${PropName}”

1、dependencyManagement与dependencies的区别:

dependencies:所有声明在父项目中 dependencies 里的依赖都会被子项目自动引入,并默认被所有的子项目继承。即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继承)

dependencyManagement :只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且 version 和 scope 都读取自父 pom; 另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。

比如如下配置:

首先在父POM中定义:

 <properties>
<javaee-api.version>1.0-SNAPSHOT</javaee-api.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>${javaee-api.version}</version>
</dependency>
</dependencies>
</dependencyManagement>

接着在子POM中定义如下:

 <parent>
<artifactId>parent</artifactId>
<groupId>com.zhisheng</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
</dependency>
</dependencies>

2、plugins与dependencyManagement的区别:

pluginManagement是表示插件声明,即你在项目中的pluginManagement下声明了插件,Maven不会加载该插件,pluginManagement声明可以被继承。pluginManagement一般是用来在父POM中定义,提供给子POM使用,子POM也可以覆盖这个定义,而且你在父POM中定义了版本之后,子模块中直接应用groupId和artifactId,而不用指定版本,同时也方便统一管理;而在父POM中的pluginManagement并不会介入到Maven的生命周期。pluginManagement主要是为了统一管理插件,确保所有子POM使用的插件版本保持一致,类似dependencies和dependencyManagement。

Plugins:就是直接引入一个plugin,而且可以绑定到Maven相关的生命周期上。

八、依赖管理:

1、假设你的项目依赖于一个库,而这个库又依赖于其他库。你不必自己去找出所有这些依赖,你只需要加上你直接依赖的库,Maven会隐式的把这些库间接依赖的库也加入到你的项目中。

2、传递性依赖的嵌套深度没有任何限制,只是在出现循环依赖时会报错。

3、“短路径优先”意味着项目依赖关系树中路径最短的版本会被使用。例如,假设A、B、C之间的依赖关系是A->B->C->D(2.0)和A->E->(D1.0),那么D(1.0)会被使用,因为A通过E到D的路径更短。但如果你想要强制使用D(2.0),那你也可以在A中显式声明对D(2.0)的依赖。

4、依赖范围 – 你可以指定只在当前编译范围内包含合适的依赖。

  a)   Compile:这是默认范围。如果没有指定,就会使用该依赖范围。编译依赖对项目所有的classpath都可用。此外,编译依赖会传递到依赖的项目。

  b)   Provided:和compile范围很类似,但provided范围表明你希望由JDK或者某个容器提供运行时依赖。例如,当使用Java EE构建一个web应用时,你会设置对Servlet API和相关的Java EE APIs的依赖范围为provided,因为web容器提供了运行时的依赖。provided依赖只对编译和测试classpath有效,并且不能传递。

  c)   runtime:runtime范围表明编译时不需要依赖,而只在运行时依赖。此依赖范围对运行和测试classpath有效,对编译classpath无效。

  d)   test:test范围表明使用此依赖范围的依赖,只在编译测试代码和运行测试的时候需要,应用的正常运行不需要此类依赖。

  e)   system:系统范围与provided类似,不过你必须显式指定一个本地系统路径的JAR,此类依赖应该一直有效,Maven也不会去仓库中寻找它。

  f)   import(Maven2.0.9及以上):import范围只适用于pom文件中的部分。表明指定的POM必须使用部分的依赖。因为依赖已经被替换,所以使用import范围的依赖并不影响依赖传递。

5、排除依赖 – 如果项目X依赖于项目Y,项目Y又依赖项目Z,项目X的所有者可以使用”exclusion”元素来显式排除项目Z。

6、可选依赖 – 如果项目Y依赖项目Z,项目Y的所有者可以使用”optional”元素来指定项目Z作为X的可选依赖。那么当项目X依赖项目Y时,X只依赖Y并不依赖Y的可选依赖Z。项目X的所有者也可以根据自己的意愿显式指定X对Z的依赖。(你可以把可选依赖理解为默认排除)。

(一) 项目依赖:

项目A依赖项目B,项目B依赖项目C.众多的项目形成一个有向无环图(DAG),使用maven,就可以自动推导出项目所依赖的全部jar包。

在pom.xml中进行如下配置:

 <dependencies>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.7.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>

(二) 外部依赖:

有时只有一个jar包而没有它的groupId和artifactId,并且三种maven仓库中都没有这个jar包项目,但当前项目依赖这个jar包,这种依赖叫做外部依赖。

有两个方法解决:

1、在每个maven项目的pom.xml文件中如下配置:

 <dependency>
<groupId>mydependency</groupId>
<artifactId>mydependency</artifactId>
<scope>system</scope>
<version>1.0</version>
<systemPath>${basedir}\mydependency.jar</systemPath>
</dependency>

2、方法一太过麻烦,可以将第三方jar包安装到本地maven仓库中去:

mvn install:install-file -Dfile=xxx -DgroupId=xxx -DartifactId=xxx -Dversion=xxx -Dpackaging=xxx

其中packaging是打包类型,可以取值war,jar等。

如果第三方jar包有相应的pom.xml,则不必提供groupId,artifactId等信息,因为它们都在pom.xml里面写着呢.可以使用如下命令:

mvn install:install-file -Dfile=xxx -DpomFile=xxx

(三) 快照依赖:

快照依赖指的是那些还在开发中的依赖(jar包)。与其经常地更新版本号来获取最新版本,不如你直接依赖项目的快照版本。快照版本的每一个build版本都会被下载到本地仓库,即使该快照版本已经在本地仓库了。总是下载快照依赖可以确保本地仓库中的每一个build版本都是最新的。

在pom文件的最开头的版本号后追加-SNAPSHOT,则告诉Maven你的项目是一个快照版本。如:

<version>1.0-SNAPSHOT</version>

在配置依赖时,在版本号后追加-SNAPSHOT表明依赖的是一个快照版本。

九、Maven工程类型:

Maven工程类型有三种:

1、WAR包工程;

2、JAR包工程;

3、POM工程;

工程之间的关系:

1、依赖:通过在 dependencies 元素下添加 dependency 子元素,可以声明一个或多个依赖。

依赖是具有传递性的。

2、聚合:一个项目往往是由多个 project 构成的,在进行构建时,我们当然不想针对多个 project 分别执行多次构建命令,这样极容易产生遗漏也会大大降低效率。Maven的聚合功能可以通过一个父模块将所有的要构建模块整合起来,将父模块的打包类型声明为 POM,通过 <modules> 将各模块集中到父 POM 中。配置如下:

 <modules>
<module>../com.dugeng.project1</module>
<module>../com.dugeng.project2</module>
</modules>

父类型的模块,不需要有源代码和资源文件,也就是说,没有 src/main/java 和 src/test/java 目录。Maven 会首先解析聚合模块的 POM 文件,分析要构建的模块,并通过各模块的依赖关系计算出模块的执行顺序,根据这个潜在的关系依次构建模块。将各子模块聚合到父模块中后,我们就可以对父模块进行一次构建命令来完成全部模块的构建。

3、继承:通过构建父模块将子模块共用的依赖,插件等进行统一声明。

例如将 com.dugeng.parent 这个模块声明为 project1 和 project2 的父模块,那么我们在 project1 和 2 中用如下代码声明父子关系:

 <parent>
<groupId>com.dugeng.mavenproject</groupId>
<artifactId>com.dugeng.parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../com.dugeng.parent/pom.xml</relativePath>
</parent>

由于父模块只是用来声明一些可共用的配置和插件信息,所以它也像聚合模块一样只需要包括一个 POM 文件,其它的项目文件如 src/main/java 是不需要的。

父工程应该是一个POM工程;

十、学习资源:

http://www.yiibai.com/maven/

Maven知识整理的更多相关文章

  1. 一:Maven知识整理

    一:maven的好处 1.依赖管理:对jar包的统一管理 可以节省空间 2.项目一键构建: 编码 编译 测试(junit) 运行 打包 部署 一个 tomcat:run就能把项目运行起来 Maven能 ...

  2. Salesforce知识整理(一)之Lightning Web Component Tools

    目录 LWC知识整理(一) 工具 Salesforce CLI Visual Studio Code(VS Code) Developer Hub(Dev Hub) 开启Dev Hub 相关资料 茶余 ...

  3. js事件(Event)知识整理

    事件(Event)知识整理,本文由网上资料整理而来,需要的朋友可以参考下   鼠标事件 鼠标移动到目标元素上的那一刻,首先触发mouseover 之后如果光标继续在元素上移动,则不断触发mousemo ...

  4. Kali Linux渗透基础知识整理(四):维持访问

    Kali Linux渗透基础知识整理系列文章回顾 维持访问 在获得了目标系统的访问权之后,攻击者需要进一步维持这一访问权限.使用木马程序.后门程序和rootkit来达到这一目的.维持访问是一种艺术形式 ...

  5. Kali Linux渗透基础知识整理(二)漏洞扫描

    Kali Linux渗透基础知识整理系列文章回顾 漏洞扫描 网络流量 Nmap Hping3 Nessus whatweb DirBuster joomscan WPScan 网络流量 网络流量就是网 ...

  6. wifi基础知识整理

    转自 :http://blog.chinaunix.net/uid-9525959-id-3326047.html WIFI基本知识整理 这里对wifi的802.11协议中比较常见的知识做一个基本的总 ...

  7. 数据库知识整理<一>

    关系型数据库知识整理: 一,关系型数据库管理系统简介: 1.1使用数据库的原因: 降低存储数据的冗余度 提高数据的一致性 可以建立数据库所遵循的标准 储存数据可以共享 便于维护数据的完整性 能够实现数 ...

  8. 【转载】UML类图知识整理

    原文:UML类图知识整理 UML类图 UML,进阶必备专业技能,看不懂UML就会看不懂那些优秀的资料. 这里简单整理 类之间的关系 泛化关系(generalization) 泛化(generalize ...

  9. Linux进程管理知识整理

    Linux进程管理知识整理 1.进程有哪些状态?什么是进程的可中断等待状态?进程退出后为什么要等待调度器删除其task_struct结构?进程的退出状态有哪些? TASK_RUNNING(可运行状态) ...

随机推荐

  1. 从今天开始 每天记录HTML,CSS 部分的学习笔记

    从今天开始 每天记录HTML,CSS 部分的学习笔记

  2. 循环神经网络-Dropout

    dropout 是 regularization 方法,在rnn中使用方法不同于cnn 对于rnn的部分不进行dropout,也就是说从t-1时候的状态传递到t时刻进行计算时,这个中间不进行memor ...

  3. Kubernetes资源监控探索

    搭建kubernetes集群,有一个默认的dashboard,但是这个dashboard比较简陋,不能将自定义展示.所以打算使用Grafana+Heapster+Influxdb构建一个一体化监控平台 ...

  4. nodejs .http模块, cheerio模块 实现 小爬虫.

    代码: var http = require("http"); var cheerio = require("cheerio"); var url = 'htt ...

  5. DOM中offsetLeft与style.left的区别

    offsetLeft 获取的是相对于父对象的左边距 left 获取或设置相对于 具有定位属性(position定义为relative)的父对象 的左边距 如果父div的position定义为relat ...

  6. C++ API方式连接mysql数据库实现增删改查

    这里复制的 http://www.bitscn.com/pdb/mysql/201407/226252.html 一.环境配置 1,装好mysql,新建一个C++控制台工程(从最简单的弄起,这个会了, ...

  7. JVM 自带性能监测调优工具 (jstack、jstat)及 JVM GC 调优

    1. jstack:占用最多资源(CPU 内存)的Java代码 https://www.cnblogs.com/chengJAVA/p/5821218.html https://blog.csdn.n ...

  8. 构建工具 —— Groovy 与 Gradle

    1. Gradle Gradle 是一个基于 Groovy 的构建工具,使用 Groovy 来编写构建脚本,类似 maven,支持依赖管理和多项目创建. 相比 maven,更轻量: windows c ...

  9. jupyter环境安装

    jupyter notebook环境安装 一.什么是Jupyter Notebook? 1. 简介 Jupyter Notebook是基于网页的用于交互计算的应用程序.其可被应用于全过程计算:开发.文 ...

  10. selenium和PhantomJS的使用

    利用selenium来进行爬取数据 import time from selenium import webdriver # 创建phantomjs浏览器对象 driver = webdriver.P ...