当前位置: 首页 > 编程日记 > 正文

Maven学习(一) - Maven基础

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

Maven作为Java语言的构建和依赖管理工具,已经被广泛使用。但对于maven的pom.xml的配置以及插件的使用,大部分人也仅仅限于了解的程度。工欲善其事,必先利其器。在拖延了很久后,决定还是花时间根据《maven实战》这个书来进一步深入了解maven的使用。这个系列是在学习maven过程中的笔记和总结,聊以记录,利人利己。

maven坐标定义

  • groupId:当前maven项目隶属的实际项目,不止要到公司或组织,而应该到实际项目,应为项目往往会划分成多个模块,如org.sonatype.nexus,org.sonatype是一个组织,nexus是一个实际项目
  • artifactId:实际项目中的一个maven项目(模块),推荐使用实际项目名作为artifactId的前缀,比如上面的nexus的索引模块可为nexus-indexer,这样可区分不同实际项目的一些基础模块,比如base或core等模块
  • version:版本
  • packaging:maven项目的打包方式,jar打包和war打包构建的生命周期会有不同的命令,默认为jar
  • classifier:用来帮助定义构建输出的一些附属构件,如javadoc或sources。注意,不能直接定义项目的classifier,因为附属构件不是项目直接默认生成的,而是由附加的插件帮助生成的。

项目构建的文件名是与坐标相对应的,一般的规则是artifactId-version[-classifier].packaging,[-classifier]为可选

maven依赖配置

pom.xml中<dependencies>标签下包含一个或多个<dependence>元素,来声明一个或多个项目依赖。每个依赖可以包含的元素有

  • groupId、artifactId和version:依赖的基本坐标
  • type:依赖的类型,对应项目坐标的packaging
  • scope:依赖范围
  • optional:标记依赖是否可选
  • exclusions:用来排除传递性依赖

依赖范围

  • compile:scope默认依赖范围,对于编译,测试,运行三种classpath都有效,如spring-core
  • test:只对于测试classpath有效,如JUnit
  • provided:对编译和测试classpath有效,运行时无效。如servlet-api,因为运行时容器已经提供,不需要maven重复引入
  • runtime:测试和运行时classpath有效如JDBC驱动实现,编译时只需要JDK提供的JDBC接口
  • system:同provided范围一致,使用system范围的依赖不是通过maven仓库解析,而是通过systemPath元素显示指定依赖文件。因为可能造成构建的不可移植,应谨慎使用。

依赖传递

如果项目的依赖有自己的依赖,则项目也会加载依赖的依赖。比如spring-core依赖commons-logging,如果项目依赖了spring-core,那么它也会依赖commons-logging。当依赖的声明为可选时(<optional>true</optional>),依赖不会传递。

依赖调解

因为存在依赖传递,就会有不同的依赖中有不同版本的基础依赖,如A -> X(1.0),B -> C -> X(2.0),这样X就有不同的版本,哪个会被maven解析呢?于是就有了依赖调解的两个原则:

  1. 路径最近者优。,如上X(1.0)的路径为1,而X(2.0)的路径为2,因此X(1.0)会被使用
  2. 同等路径下,第一声明者优先。在路径长度都一致时,pom.xml中顺序靠前的被使用。

依赖排除

项目中可能存在,因为一些原因,不想引入某依赖的传递性依赖,则可以使用exclusions。比如在使用spring时不想用commons-logging,则可以在spring-core中排除。

<dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.0.0.M5</version><exclusions><exclusion><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId></exclusion></exclusions>
</dependency>

依赖版本归类

比如在使用spring时,可能会用到spring-context,spring-jdbc,spring-tx等,但他们的版本是一致的,考虑到以后版本的升级,可以定义一个spring.version的properties来统一设置版本。

<properties><spring.version>4.1.6.RELEASE</spring.version>
</properties>

而在依赖的<version>中用${spring.version}代替

<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>${spring.version}</version>
</dependency>

依赖查看与分析

// 查看项目依赖列表
mvn dependency:list
// 以树状显示依赖列表
mvn dependency:tree
// 依赖分析
mvn dependency:analyze

maven生命周期

maven有三套相互独立的生命周期,分别是clean,default,site。

  • clean的目的是清理项目
  • default的目的是构建项目
  • site的目的是建立项目站点

每个生命周期包含一些阶段(phase),这些阶段是有顺序的,并且后面的阶段依赖于前面的阶段。default是生命周期中最核心的部分,它包含很多阶段,以下是常见的几种阶段,全量的阶段可见http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Lifecycle_Reference。

  • validate:验证项目是否正确
  • compile:编译项目源代码
  • test:使用一个测试套件测试编译后的代码
  • package:打包项目代码
  • verify:检查集成测试结果
  • install:将打包好的项目代码安装到本地仓库
  • deploy:复制最后的打包结果到远程仓库

我们可以用命令行来执行生命周期阶段

  • mvn clean:调用clean生命周期的clean阶段,包含pre-clean和clean阶段
  • mvn test:调用default生命周期的test阶段,包含validate到test的所有阶段
  • mvn clean install:调用clean生命周期的clean阶段和default生命周期的install阶段,实际执行的是clean生命周期的pre-clean,clean阶段和default生命周期从validate至install的所有阶段

maven插件

插件目标

我们知道maven的核心只定义了抽象的生命周期,具体的任务是交由插件完成的,插件以独立的构件存在,maven会在需要时下载并使用插件。对于一个插件,可能会有多个功能,每个功能就对应一个插件目标(Plugin Goal)。

比如maven-dependency-plugin有多个目标,如dependency:list,dependency:tree,dependency:analyze等,冒号前是插件前缀,冒号后是插件目标。类似的,compiler:compile(maven-compiler-plugin的compile目标)和surefire:test(maven-surefire-plugin的test目标)。

在使用时,需要将生命周期的阶段和插件目标相互绑定,以完成某个具体的构建任务。如maven-compiler-plugin的compile目标绑定的就是default生命周期的compile阶段。

maven内置了很多生命周期阶段同插件目标的绑定,比如打包类型为jar的default生命周期的内置插件绑定关系如下:

生命周期阶段插件目标执行任务
process-resourcesmaven-resources-plugin:resources复制主资源文件至主输出目录
compilemaven-compiler-plugin:compile编译主代码至主输出目录
process-test-resourcesmaven-resources-plugin:testResources复制测试资源文件至测试输出目录
test-compilemaven-compiler-plugin:testCompile编译测试代码至测试输出目录
testmaven-surefire-plugin:test执行测试用例
packagemaven-jar-plugin:jar创建项目jar包
installmaven-install-plugin:install将项目输出构件安装到本地仓库
deploymaven-deploy-plugin:deploy将项目输出构件部署到远程仓库

出了内置的绑定关系外,用户可以选择将某个插件目标绑定到生命周期的某个阶段。一个例子是创建项目的源码jar包,可以使用maven-source-plugin的jar-no-fork目标奖项目主代码打成jar文件,我们将其绑定到verify阶段。

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-source-plugin</artifactId><version>3.0.1</version><executions><execution><id>attach-sources</id><phase>verify</phase><goals><goal>jar-no-fork</goal></goals></execution></executions>
</plugin>

有很多插件的目标在编写时已经定义了默认绑定阶段,可以使用命令查看

mvn help:describe -Dplugin=org.apache.maven.plugins:maven-source-plugin:3.0.1
Ddetail

可以看到输出的信息中有

source:jar-no-fork
...
Bound to phase: package

即jar-no-for默认绑定的生命周期阶段为package

插件配置

用户可以通过命令行和pom配置来配置插件的参数

1.命令行配置,用户可以在maven命令中使用-D参数,指定一个key-value的形式,来配置插件目标的参数。例如maven-surefire-plugin提供了一个maven.test.skip参数,当为true时,就跳过执行测试。

mvn install -Dmaven.test.skip=true

2.pom中插件全局配置,所有基于该插件目标的任务都会使用此配置,常见的youmaven-compiler-plugin编译java的版本。

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.3.2</version><configuration><source>1.8</source><target>1.8</target><encoding>utf-8</encoding></configuration>
</plugin>

3.用户可以为某个插件任务配置特定的参数,将maven-antrun-plugin:run绑定到多个生命周期阶段上,加以不同的配置

<plugin><artifactId>maven-antrun-plugin</artifactId><version>1.8</version><executions><execution><id>ant-validate</id><phase>validate</phase><goals><goal>run</goal></goals><configuration><tasks><echo>validate phase</echo></tasks></configuration></execution><execution><id>ant-verify</id><phase>verify</phase><goals><goal>run</goal></goals><configuration><tasks><echo>verify phase</echo></tasks></configuration></execution></executions>
</plugin>

插件查找

可以从http://maven.apache.org/plugins/index.html中查询插件的详细信息,也可以使用maven-help-plugin描述插件。

//查询插件信息
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-source-plugin:3.0.1
//查询插件目标信息
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-source-plugin:3.0.1 -Dgoal=jar-no-fork
//查询详细信息
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-source-plugin:3.0.1 -Ddetail

Maven内置变量

Maven内置了一些目录变量,对涉及文件路径的配置会有帮助

  • ${basedir} 项目根目录
  • ${project.build.directory} 构建目录,缺省为target
  • ${project.build.outputDirectory} 构建过程输出目录,缺省为target/classes
  • ${project.build.finalName} 产出物名称,缺省为${project.artifactId}-${project.version}
  • ${project.packaging} 打包类型,缺省为jar
  • ${project.xxx} 当前pom文件的任意节点的内容

转载于:https://my.oschina.net/u/2377110/blog/1583666

相关文章:

Python培训就业方向有哪些

关注“Python培训就业方向有哪些”的同学&#xff0c;基本都是打算学习Python技术但是对于Python的就业还是很迷茫的&#xff0c;针对在这个问题&#xff0c;小编下面为大家做下简单的解析&#xff0c;希望能够帮助到大家。 Python培训就业方向有哪些? 1.Python自动化测试 熟悉…

linux下安装hadoop

关键词&#xff1a;Ubuntu;hadoop; 注意&#xff1a;开始这一步之前&#xff0c;需安装Oracle的jdk&#xff0c;参见&#xff1a; http://www.cnblogs.com/fengfengqingqingyangyang/archive/2012/11/06/2756981.html 1、下载hadoop的合适版本&#xff1a;http://labs.mop.com/…

谢文睿:西瓜书 + 南瓜书 吃瓜系列 5. 决策树

Datawhale南瓜书是经典机器学习教材《机器学习》&#xff08;西瓜书&#xff09;的公式推导解析指南&#xff0c;旨在让在学习西瓜书的过程中&#xff0c;再也没有难推的公式&#xff0c;学好机器学习。 以往内容&#xff1a; 西瓜书公式推导讲解来了&#xff01;0. 导学1. 一…

2017还有29天,你的目标实现了吗?|内有彩蛋

点开标题的&#xff0c;都有一颗大心脏。2017 就要这么过去了&#xff0c;细思极恐啊同志们&#xff0c;年初定下的目标&#xff0c;你实现了几个&#xff1f; 如果这里是一个树洞&#xff0c;你将对着它说点什么呢&#xff1f; 如果你敢留下感想&#xff0c;我们就敢让它上墙。…

Python培训分享:Python内置标准异常及其解析

本期小编为大家带来的Python培训教程是关于“Python内置标准异常及其解析”的内容&#xff0c;我们都知道&#xff0c;在Python技术运作下&#xff0c;总会出现一些Python无法正常处理的程序时就会发生一个异常。异常是一个事件&#xff0c;此事件是在程序执行过程中发生&#…

shell 语法简介(转载)

一、基本语法1.1、shell文件开头shell文件必须以下面的行开始&#xff08;必须方在文件的第一行&#xff09;&#xff1a; #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh来执行程序。 当编辑好脚本时&#xff0c;如果要执行该…

如何利用Seaborn绘制热力图?

如何利用Seaborn绘制热力图&#xff1f; 这是本学期在大数据哲学与社会科学实验室做的第八次分享了。 第一次分享的是&#xff1a; 如何利用“wordcloudjieba”制作中文词云&#xff1f; 第二次分享的是&#xff1a; 如何爬取知乎中问题的回答以及评论的数据&#xff1f; …

如何学习大数据?

想要都进入大数据行业的第一步&#xff0c;是先搞清楚大数据究竟有哪些就业方向。 大数据就业岗位 随着大数据技术在企业界如火如荼的实践&#xff0c;企业对组建大数据团队的迫切程度也也来越高&#xff0c;对与大数据相关高端人才的需求也越来越紧迫&#xff0c;但企业对大数…

软件测试培训分享:Bug的作用有多大?

软件测试人员在工作中遇到最常见的是就是bug&#xff0c;那么bug经常出现是对是错呢?Bug的作用有多大?本期小编为大家介绍的软件测试培训教程就是关于这方面的内容的&#xff0c;来看看下面的详细介绍吧。 软件测试培训分享&#xff1a;Bug的作用有多大?主要有以下几点&…

(转)Linux进程调度时机

转自&#xff1a;http://oss.org.cn/kernel-book/ch05/5.3.2.htm 调度程序虽然特别重要&#xff0c;但它不过是一个存在于内核空间中的函数而已&#xff0c;并不神秘。Linux的调度程序是一个叫Schedule&#xff08;&#xff09;的函数&#xff0c;这个函数被调用的频率很高&…

python 字符编码问题

字符编码 一、字符编码的演进 ASCIIGB2312 GBK1.0 GB18030Unicode编码&#xff1a;国际标准字符集&#xff0c;它将世界各种语言的每个字符定义一个唯一的编码&#xff0c;以满足跨语言、跨平台的文本信息转换。Unicode&#xff08;统一码、万国码&#xff09;规定所有的…

谢文睿:西瓜书 + 南瓜书 吃瓜系列 6. 神经网络

Datawhale南瓜书是经典机器学习教材《机器学习》&#xff08;西瓜书&#xff09;的公式推导解析指南&#xff0c;旨在让在学习西瓜书的过程中&#xff0c;再也没有难推的公式&#xff0c;学好机器学习。 以往内容&#xff1a; 西瓜书公式推导讲解来了&#xff01;0. 导学1. 一…

Python培训常识:Python面试中常被问到的几种设计模式要知道

学习Python技术大家都是为了日后能够找到适合自己的工作岗位&#xff0c;那么除了要学习好Python技术外&#xff0c;对于面试环节的问题也要有所了解&#xff0c;本期小编为大家介绍的Python培训教程就算关于Python面试中常被问到的几种设计模式&#xff0c;希望能够给带来帮助…

ThinkPHP 框架学习

学习内容全部参考开发手册 建议收藏网页 https://www.kancloud.cn/manual/thinkphp/1696 一、几个概念 应用&#xff1a;基于同一个入口文件访问的项目称之为一个应用 模块&#xff1a;一个应用下面可以包含多个模块。每个模块在应用目录下面都是一个独立的子目录 控制器&…

【青少年编程】【三级】克隆猫游戏

「青少年编程竞赛交流群」已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】或【Python】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 微信后台回复“资料下载”可获取以往学习的材料&#xff08;视频、代码、文档&…

想转行学软件测试要注意哪些问题

软件测试的快速发展&#xff0c;让很多人都红了眼&#xff0c;大家都想转行学软件测试&#xff0c;那么想转行学软件测试要注意哪些问题呢?大家是否考虑过自己是否合适呢?那么我们来看看下面的介绍吧。 想转行学软件测试要注意哪些问题?据数据显示&#xff0c;今年毕业生首选…

SpringMVC学习二

使用POJO作为参数 web.xml <?xml version"1.0" encoding"UTF-8"?> <web-app version"3.0" xmlns"http://java.sun.com/xml/ns/javaee" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocatio…

使用CInternetSession和CHttpFile读取网页内容

参考网址&#xff1a;http://www.398588.com/Article/T9/78.aspx读取网页的内容可以类比本地的文件一下&#xff0c;代码如下&#xff1a;#include <afxinet.h> CString url; GetDlgItemText(IDC_EDIT1,url); CInternetSession Sess; CHttpFile*cFile (CHttp…

谢文睿:西瓜书 + 南瓜书 吃瓜系列 7. 支持向量机

Datawhale南瓜书是经典机器学习教材《机器学习》&#xff08;西瓜书&#xff09;的公式推导解析指南&#xff0c;旨在让在学习西瓜书的过程中&#xff0c;再也没有难推的公式&#xff0c;学好机器学习。 以往内容&#xff1a; 西瓜书公式推导讲解来了&#xff01;0. 导学1. 一…

Python培训分享:Python发展前景怎么样?

最近学习Python技术的同学越来越多&#xff0c;大家对于Python技术比较关注的两个点&#xff0c;就是Python技术好不好学&#xff0c;Python就业前景好不好&#xff0c;那么本文针对Python发展前景怎么样这个问题为大家做下详细的介绍。 Python培训分享&#xff1a;Python发展前…

处理器拦截器(HandlerInterceptor)详解

处理器拦截器&#xff08;HandlerInterceptor&#xff09;详解 编程界的小学生 关注 2017.04.06 15:19* 字数 881 阅读 657评论 0喜欢 4简介SpringWebMVC的处理器拦截器&#xff0c;类似于Servlet开发中的过滤器Filter&#xff0c;用于处理器进行预处理和后处理。 应用场景1、日…

Datawhale组队学习周报(第018周)

文章目录本周结营的开源内容即将结营的开源内容正在进行的开源内容七月排期的开源内容希望排期的开源内容每周号外Whalepaper 招新公告本周&#xff08;06月14日~06月20日&#xff09;&#xff0c;第 25 期组队学习一共有 3 门开源课程&#xff0c;共组建了 3 个学习群&#xf…

【原创】多台电脑如何公用一个键盘鼠标进行操作 - Mouse with Borders 软件

搞程序开发的同事经常会碰到类似的情况&#xff0c;桌子有多台设备&#xff0c;笔记本&#xff0c;台式机了&#xff0c;经常需要来回切换操作&#xff0c;桌子上摆满了键盘和鼠标&#xff0c;如果要是用同一个键盘或者鼠标&#xff0c;操作这些设备那就很便利了。 给大家推荐一…

Python培训教程分享:如何实现pygame的初始化和退出操作?

本期小编为大家介绍的Python培训教程是关于“如何实现pygame的初始化和退出操作?”的内容&#xff0c;pygame模块针对不同的开发需求提供了不同的子模块&#xff0c;例如显示模块、字体模块、混音器模块等&#xff0c;一些子模块在使用之前必须进行初始化&#xff0c;比如字体…

PLSQL的 dynamic sql小例子

开始 SET serveroutput ON;DECLAREp_tab_name varchar2(20);cursor_name INTEGER;p_rows_del INTEGER; BEGINp_tab_name : EMP_CPY;cursor_name : DBMS_SQL.OPEN_CURSOR;DBMS_SQL.PARSE(cursor_name, DELETE FROM ||p_tab_name, DBMS_SQL.NATIVE);DBMS_OUTPUT.PUT_LINE(p_tab_n…

【青少年编程】陈晓光:打靶游戏

「青少年编程竞赛交流群」已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】或【Python】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 微信后台回复“资料下载”可获取以往学习的材料&#xff08;视频、代码、文档&…

Phpcms V9手机门户设置教程:怎么用PC V9做手机网站

一、在PHPcms V9管理后台设置手机门户 1.1、开启手机网站。位置&#xff1a;模块 》手机门户 》 添加手机站点&#xff0c;具体设置可参照截图&#xff1a; 填写站点名和LOGO文件相对位置&#xff0c;绑定用于手机网站的二级域名m.cmsyou.com&#xff0c;域名以http://开头。 1…

参加软件测试培训需要学习哪些知识

软件测试在互联网行业的发展前景非常好&#xff0c;很多人都想学习软件测试&#xff0c;其中有很多都是零基础学员&#xff0c;那么参加软件测试培训需要学习哪些知识?零基础是否能学会呢?来看看下面的详细介绍吧。 参加软件测试培训需要学习哪些知识?下面给大家简单说下软件…

C#用XmlDocument操作XML

1.加载xml文件 string xmlPath AppDomain.CurrentDomain.BaseDirectory"xml/test.xml"; XmlDocument xmlDoc new XmlDocument(); xmlDoc.Load(xmlPath);//这里是xml文件的路径 string xmlString"<books><book>test</book></books>…

【第20周复盘】转换思路,让更多的小朋友们参与进来!

「青少年编程竞赛交流群」已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】或【Python】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 微信后台回复“资料下载”可获取以往学习的材料&#xff08;视频、代码、文档&…