一.基础概念

1.Maven作为Apache组织中颇为成功的开源项目,主要服务于基于Java平台的项目构建,依赖管理和项目信息管理。从清理,编译,测试到生成报告,到打包部署,自动化构建过程。

还可以跨平台,对外提供了一致接口。

Maven可以适应极限编程XP.

2.Maven为全世界提供了一个免费的中央仓库,几乎可以找到任何就行的来源类库,可以通过一些Maven衍生工具如Nexus,对其快速的搜索,只要定位了坐标,就能够自动下载。中央仓库地址http://repol.maven.org/maven2/

3.其他的构建工具有Make,Ant等。

4.环境变量配置

M2_HOME :变量值为maven的安装目录

在path后添加%M2_HOME%\bin;

检查JDK,maven配置的cmd命令

echo %JAVA_HOME%

java_version

echo %M2_HOME%

mvn -v

mvn help:system 该命令会打印出所有的Java系统属性和环境变量

5.设置代理

有的公司基于安全考虑会要求使用通过安全认证的代理访问因特网。

ping repol.maven.org 可以检查网络

检查代理 ip 218.14.227.197 端口为3128的服务器是否畅通:telnet 218.14.227.197 3128,如果正确,输入ctrl+]然后q,回车,退出即可。

然后设置/.m2/setting.xml.

eclipse 等在集成maven时会安装上一个内嵌的Maven,因为内嵌的版本通常比较新,但不一定稳定,而且也往往会在和在命令行使用的maven不是同一个版本,

Windows -preferences -maven-installation

Embedded maven为内嵌的。

然后单击add添加maven的安装目录M2_HOME

6.maven项目的核心是pom.xml,POM(Project Object Model项目对象模型) 定义了项目的基本信息,用于描述项目如何构建,声明项目依赖等。

1)第一行定义了文档的版本和编码方式

2)紧接着是project是所有pom.xml的根元素,声明了一些POM相关的命名空间以及xsd元素,虽然这些属性不是必须的,但是可以让第三方工具如IDE的XML编辑器帮助我的快速的编辑PO但是可以让第三方工具如IDE的CNLXML编辑器帮助我的快速的编辑POM.

IDE(Integrated Development,集成开发环境)

3).modelVrision指定当前pom版本,对于maven2 3来说,版本只能是4.0.0

4).groupId artifactId,version这三个元素定义了一个项目的基本坐标,在maven世界里,任何jar pom war 都是基于这些项目坐标进行区分的。

groupId 组,这个组往往和项目所在的组织或者公司存在关联,

artifactId定义了当前maven项目在组中的唯一ID

version定义当前项目版本 1.0-SNAPSHOT说明项目还在还处于开发中,不是稳定的版本。随着项目的发展,version会不断的更新,如升级为1.0,1.1-SNAPSHOT,1.1,1.2-SNAPSHOT等。

5).name声明了一个对于用户更为友好的项目名称,虽然不是必须的,但是还是推荐为每个POM命名,以方便信息交流。

6)packaging定义maven项目的打包方式,不定义时默认为jar,

7)classifier 用来帮助定义构建一些附属构建,附属构件与主构件对应。如hello-1.0.jar,可以生成一些包含java文档的hello-1.0-javadoc.jar,和包含源代码的sources构件hello-1.0-sources.jar.

groupId artifactId version是必须的,packaging是可选的,classifier是不能直接定义的。

7)dependencies 声明项目的依赖

7.主代码包含项目主代码和测试代码,前者前者会打包到最终的构件如jar中,而测试代码只在运行测试时用到,不会被打包。遵循maven约定,主代码在src/java/main目录下,测试代码在src/test/main

一般来说,项目的包命名要基于项目的groupId和artifactId ,这样更加清晰,更加符合逻辑,也方便搜索构建和java类。

在项目目录下运行 clean compile

默认情况下,maven构建的所有输出都在 target/目录中,clean为清理输出目录 target/

compile 编译将项目代码编译至target/classes目录,编译为·Class文件。

8.scope为依赖范围,如果不声明就是默认compile,表示该依赖对主代码和测试代码都有效。

详见http://www.cnblogs.com/kavlez/p/4381103.html

9.一个典型的单元测试包含三个步骤,

1)准备测试类及数据

2)执行要测试的行为

3)检查结果

所有的测试方法用@T所有的测试方法用@Test标注,

所有的方法名以test开头(Junit3的约定)。

maven clean test ,在maven执行测试之前会先自动执行项目主资源的处理,主代码编译,测试资源处理,测试代码编译。

由于历史原因,maven的核心插件之一compiler默认只支持编译Java1.3,因此需要配置该插件对java其他版本的支持,

<project>

<build>

<plugins>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-compiler-plugin</artifactId>

<configuration>

<source>1.5</source>

<target>1.5</target>

</configuration>

</plugin>

</plugins>

</build>

</project>

10.指令

clean:删除target/输出目录

clean compile:先clean,后编译主代码。

clean test:先clean,然后处理主代码,编译主代码,处理测试代码,编译测试代码,然后执行测试。

clean package:先clean,然后编译,测试,最后打包。

clean installation 先clean,然后package,然后install ,打包之后还不能为其他项目所用,需要install。

install就是把项目下载到本地仓库。

为了生成可执行的jar需要借助maven-shade-plugin

archetype 项目骨架。使用eclipse一般用quickstart骨架。

11.dependencies 依赖的配置,

1)groupId artifactId,version这三个元素定义了一个项目的基本坐标,

2)type类似与项目的packaging ,依赖的类型,可以不声明,默认为jar

3)scope依赖的范围

Maven编译代码时需要使用classpath,但classpath不止一种,而是:

编译classpath

测试classpath

运行classpath

Maven会根据需要使用不同的classpath,而scope可以用来控制依赖与这三种classpath之间的关系。

compile:编译依赖范围,默认使用该项,对三种classpath都有效。

test:测试依赖范围,仅对测试classpath有效,如上面的Junit。

provided:已提供依赖范围,对编译和测试classpath有效,比如开头贴出的servlet-api的依赖,会在运行时由app server提供,Maven不可以重复引入。

runtime:运行时依赖范围,对测试和运行classpath有效,编译时无效。如jdbc驱动实现

system:系统依赖范围,和provided完全一致,对编译和测试classpath有效,但必须通过systemPath显示指定依赖文件的位置,可以使用系统环境变量。由于此类依赖不是通过maven仓库解析的,而往往与本机系统绑定,可能造成构建的不可移植,因此慎重使用。

<scope>system</scope>

<systemPath>${java.home}/lib/rt.jar</scope>

import:不针对任何一种classpath,该项用于导入其他pom中的dependencyManagement元素。

依赖与classPath的关系

依赖的传递性

最左边表示第一依赖范围,横行表示第二依赖范围,交叉表示传递后的,

依赖的调解

原则1.路径最近者优先如

a -b-c-x(1.0)    a-e-x(2.0)

前者路径长为三,后者为二,所以a实际的x为2.0版本,

在maven2.0.8版本以前,当两个路径一样时不确定是用哪个,在2.0.9版本后添加了第二原则

原则2,第一声明优先,在依赖路径长度相等时,在POM中依赖声明的顺序决定了谁会被解析使用,顺序最靠前的那个依赖优胜。

4)optional 可选依赖,

<optional>true</ooptional>

表示该依赖为可选依赖,只会对当前项目产生影响,其他项目依赖此项目时,需要显示声明此依赖,也就是可选依赖不会被传递。

在理想情况下是不应该使用可选依赖的,使用他的原因是某一项目实现了多个特性。

5).exclusion排除依赖,不想使用某个依赖,自己显示声明。

<exclusions>

<exclusion>

<groupId></groupId>

<artifactId></artifactId>

</exclusion>

</exclusions>

可以定义多个,不要定义version.

6). properties归类依赖

<properies>

<a.version>1.2.0</a.version>

</properties>

在下边定义版本version标签时可以如下表示

<version>${a.version}</version>

7).优化依赖

mvn dependency:list

查看依赖列表

mvn dependency:tree

mvn dependency:analyze 分析依赖

12.仓库

1).在不使用maven管理项目时,lib/目录下内容存在大量重复,仓库的布局

如log4j:log4j:1.2.15 对应仓库的路径为 log4j/log4j/1.2.15/log4j-1.2.15.jar

groupId/artifactId/version/artifactId-version.packaging

假如groupId中间有点如org.t假如groupId中间有点如org.test 就会分割成org/test

如果有classifier很在version后边

artifactId-version-classifier.packaging

2)本地仓库和远程仓库

本地仓库有直接使用,没有就去远程仓库下载,远程仓库也没有就会报错。

中央仓库是maven核心自带的远程仓库,默认配置下本地没有就去中央仓库下载。

私服是一种特殊的远程仓库,为了节省宽带和时间,在局域网内架设的一个私有的仓库服务器,用其代理所有的外部的远程仓库。

除了中央仓库和私服,还有其他的公开的远程仓库如java.net maven 仓库 http://download.java.net/maven/2/

JBoss Maven库

http://repository.jboss.com/maven2/

3)修改本地仓库路径

默认c:\users\xxx\.m2\repository\

有时候会因为某些原因如c盘空间不够更改路

更改~/.m2/setting.xml设置localRepository元素值

<setting>

<localRespository>D:\java\repository\</localRepository>

</setting>

4)安装好Maven后,如果不执行任何命令,本地仓库是不存在的,只有在执行第一条指令后,maven才会开始创建本地仓库。

$m2_home/lib/maven-model-builder.3.0.jar

访问org/apache/model/pom-4.0.0.xml

所有maven都会继承的超POM

5).当创建了私服后,局域网内的maven用户使用时,找本地,本地没有去私服下载,私服没有再去外部仓库下载,缓存到私服上之后再下载到本地,此外一些无法从外部仓库下载的构件也能从本地上传到私服供大家使用。

即使一台直接连入internet的个人机器上使用maven,也应该在本地建立私服,可以

1.节省自己的外网宽带,

2.加速maven构建,

3.可以部署第三方构件,

4.提高稳定性增强控制(即使暂时没有网络连接,maven也可正常工作)

5.降低中央仓库负荷

6)远程仓库的配置

repositories下可以定义一个或多个远程仓库,releases和snapshots元素比较重要,用来控制maven发布版构件和快照版构件的下载,这两元素还有两个子元素updatePolicy和checksumPolicy

updatePolicy用来配置maven从远程仓库更新检查频率。

daily 每天一次

never从不

always每次构建都更新

interval:X每隔几分钟,X为任意整数

checksumPolicy:配置检查校验和文件策略,当构件被部署到maven仓库中时,会同时生成对应的检验和文件。在构件被下载时,maven会验证校验和文件,如果失败,warn fail ignore.

7)远程仓库的认证

大部分无需认证就可以访问,

有时候出于安全考虑,组织内每个项目都有独立的的仓库,每个仓库有用户名密码,在本地setting.xml中配置

8)部署至远程仓库

repository发布版本构件的仓库

snapshotRepository:快照版本的仓库

mvn clean deploy输出到对应的远程仓库。

9) 当依赖的版本为release和lastest:会更新最新发布版本和最新版本(包含快照),基于groupId/artifactId/maven-metadata.xml,

,该文件列出了仓库中该构件的所有可用版本。lastest指向这些版本中最新的版本,release指向最新的发布版本。

当依赖的版本为快照时,maven会更新最新的快照,maven会检查仓库元数据groupId/artifactId/version/maven-metadata.xml,

该文件的snapshot元素包含了timetamp和builderNumber两个子元素,分表代表该快照的时间戳和构建号。

元数据并不永远正确,有时候当用户发现无法解析某些构件,或者解析得到错误的构件时,可能是元数据错误,需要手工或者使用工具如nexus对其进行修复。

10)镜像

如果仓库a可以提供仓库b存储的所有内容,那么就可以认为a是b的一个镜像。http://maven.net.cn/content/groups/public/是中央仓库http://repol.maven.org.maven2/在中国的镜像,由于地理位置的因素,该镜像往往能提供比中央仓库更快的服务。可以在setting.xml中配置maven使用镜像来代替中央仓库。

配置私服作为镜像

需要注意的是由于镜像仓库完全屏蔽了被镜像的仓库,所以当镜像仓库不稳定或者停止服务时,maven将无法访问被镜像的仓库,因而将无法下载构建。

11).仓库搜索服务

1.sonatype nexus

http://repository.sonatype.org/

当前最流行的来源maven仓库管理软件。

2.jarvana

http://www.jarvana.com/jarvana/

支持浏览构件内容,提供了便捷的java文档浏览功能。

3.MVNbrowser

http://www.mvnbrower.com

只提供关键字搜索,除了提供基于坐标的依赖声明代码片断等功能之外,最大特色就是可以告诉用户该构件的依赖于其他哪些构件以及该构件被哪些构件依赖

4.MVNrepository

http://mvnrepository.com

界面比较清晰,提供了基于关键字的搜索,依赖声明代码片断,构件下载,依赖与被依赖关系信息,构建所包含的信息等功能,还提供了一个简单的图表,显示某个构件各个版本间大小的变化。

1-1 maven 学习笔记(1-6章)的更多相关文章

  1. Stealth视频教程学习笔记(第二章)

    Stealth视频教程学习笔记(第二章) 本文是对Unity官方视频教程Stealth的学习笔记.在此之前,本人整理了Stealth视频的英文字幕,并放到了优酷上.本文将分别对各个视频进行学习总结,提 ...

  2. Stealth视频教程学习笔记(第一章)

    Stealth视频教程学习笔记(第一章) 本文是对Unity官方视频教程Stealth的学习笔记.在此之前,本人整理了Stealth视频的英文字幕,并放到了优酷上.本文将分别对各个视频进行学习总结,提 ...

  3. 20145330《Java学习笔记》第一章课后练习8知识总结以及IDEA初次尝试

    20145330<Java学习笔记>第一章课后练习8知识总结以及IDEA初次尝试 题目: 如果C:\workspace\Hello\src中有Main.java如下: package cc ...

  4. Maven学习笔记-03-Eclipse下maven项目在Tomcat7和Jetty6中部署调试

    现在最新的Eclipse Luna Release 已经内置了Maven插件,这让我们的工作简洁了不少,只要把项目直接导入就可以,不用考虑插件什么的问题,但是导入之后的项目既可以部署在Tomcat也可 ...

  5. java JDK8 学习笔记——第16章 整合数据库

    第十六章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API中的接口会有数据库厂商操作,称为JDBC驱动程 ...

  6. CSS3秘笈第三版涵盖HTML5学习笔记1~5章

    第一部分----CSS基础知识 第1章,CSS需要的HTML HTML越简单,对搜索引擎越友好 div是块级元素,span是行内元素 <section>标签包含一组相关的内容,就像一本书中 ...

  7. 《DOM Scripting》学习笔记-——第三章 DOM

    <Dom Scripting>学习笔记 第三章 DOM 本章内容: 1.节点的概念. 2.四个DOM方法:getElementById, getElementsByTagName, get ...

  8. Maven学习笔记-04-Eclipse下maven项目在Tomcat7和Jetty6中部署调试

    现在最新的Eclipse Luna Release 已经内置了Maven插件,这让我们的工作简洁了不少,只要把项目直接导入就可以,不用考虑插件什么的问题,但是导入之后的项目既可以部署在Tomcat也可 ...

  9. Programming Entity Framework-dbContext 学习笔记第五章

    ### Programming Entity Framework-dbContext 学习笔记 第五章 将图表添加到Context中的方式及容易出现的错误 方法 结果 警告 Add Root 图标中的 ...

  10. The Road to learn React书籍学习笔记(第三章)

    The Road to learn React书籍学习笔记(第三章) 代码详情 声明周期方法 通过之前的学习,可以了解到ES6 类组件中的生命周期方法 constructor() 和 render() ...

随机推荐

  1. python 小练习之生成手机号码

    需求分析: 1 将固定的号码段放到list中 如:136 137 180 183等等 2 随机取8个数字元素 3 将固定号码段与随机产生的元素拼接在一起 4 写入文件 import stringdef ...

  2. EntityFramework Core 2.0全局过滤(HasQueryFilter)

    前言 EntityFramework Core每一次版本的迭代和更新都会带给我们惊喜,每次都会尽量满足大部分使用者的需求.在EF Core 2.0版本中出现了全局过滤新特性即HasQueryFilte ...

  3. mac 系统安装 eclipse 方法

    经过好几天的折腾,终于在各种不靠谱的经验.说明的忽悠中把自己心爱的 mac 安装上了 eclipse,看到别人的不靠谱,我决定自己写一篇经验,为了大家能够不走我这么多的弯路,也为了自己将来可以回来看看 ...

  4. spring的Profile使用对比和应用场景分析

    spring中存在这样一个功能,通过Profile来选择不同环境下的不同配置,说白了,就是通过设置一个参数来选择使用不同的数据,这个数据可能是一个bean,可能是一个xml文件,也有可能是一个prop ...

  5. R︱Rstudio 1.0版本尝鲜(R notebook、下载链接、sparkR、代码时间测试profile)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 2016年11月1日,RStudio 1.0版 ...

  6. android的Findbugs问题整理

    1. 对字符串不相等的判断 错误 if (chapterInfo.getPayMode() != String.valueOf(com.shuqi.base.common.Constant.PAYMO ...

  7. 如何修改WinPE Boot的.wim镜像文件

    1. 使用imagex /apply或imagex /mountrw将WIM镜像文件mount到某个文件夹,假设为d:\tmp\winpe_x86\mount.  例: imagex /mountrw ...

  8. 【mongodb系统学习之十】mongodb查询(二)

    5).常用查询条件: a).比较操作符:"$lt","$lte","$gt","$gte",分别是<,<=, ...

  9. FC总线技术简介

    FC是由美国标准化委员会(ANSI)的X3T11小组于1988年提出的高速串行传输总线,解决了并行总线SCSI遇到的技术瓶颈,并在同一大的协议平台框架下可以映射更多FC-4上层协议.FC具备通道和网络 ...

  10. 图解MBR分区无损转换GPT分区+UEFI引导安装WIN8.1

    确定你的主板支持UEFI引导.1,前期准备,WIN8.1原版系统一份(坛子里很多,自己下载个),U盘2个其中大于4G一个(最好 准备两个U盘)2,大家都知道WIN8系统只支持GPT分区,传统的MBR分 ...