Maven

Maven⼯具的简介

开发过程中遇到的问题

1、都是同样的代码,为什么在我的机器上可以编译执⾏,⽽在他的机器上就不⾏?
2、为什么在我的机器上可以正常打包,⽽配置管理员却打不出来?
3、项⽬组加⼊了新的⼈员,我要给他说明编译环境如何设置,但是让我挠头的是,有些细节我也记不清楚 了。
4、我的项⽬依赖⼀些jar包,我应该把他们放哪⾥?放源码库⾥?
5、这是我开发的第⼆个项⽬,还是需要上⾯的那些jar包,再把它们复制到我当前项⽬的svn库⾥吧
6、现在是第三次,再复制⼀次吧。 ----- 这样真的好吗?
7、我写了⼀个数据库相关的通⽤类,并且推荐给了其他项⽬组,现在已经有五个项⽬组在使⽤它了,今天我 发现了⼀
个bug,并修正了它,我会把jar包通过邮件发给其他项⽬组 -----这不是⼀个好的分发机制,太多 的环节可能导致出现bug
8、项⽬进⼊测试阶段,每天都要向测试服务器部署⼀版。每次都⼿动部署,太麻烦了。

什么是Maven

Maven是基于项⽬对象模型(POM),可以通过⼀⼩段描述信息来管理项⽬的构建,报告和⽂档的软件项 ⽬管理⼯具。Maven是跨平台的项⽬管理⼯具。主要服务于基于Java平台的项⽬构建,依赖管理和项⽬ 信息管理。

Maven主要有两个功能:

- 项⽬构建
- 依赖管理

什么是构建

在这里插入图片描述

在这里插入图片描述

项⽬构建的⽅式

Eclipse

⼿⼯操作较多,项⽬的构建过程都是独⽴的,很难⼀步完成。⽐如:编译、测试、部署等。 开发时每个⼈的IDE配置都不同,很容易出现本地代码换个地⽅编译就出错

Ant

Ant只是⼀个项⽬构建⼯具,它没有集成依赖管理。 Ant在进⾏项⽬构建时,它没有对项⽬⽬录结构进⾏约定,需要⼿动指定源⽂件、类⽂件等⽬录地址。同时它 执⾏task时,需要显示指定依赖的task,这样会造成⼤量的代码重复。

Maven

- Maven不仅是⼀个项⽬构建⼯具,更是⼀个项⽬管理⼯具。它在项⽬构建⼯程中,⽐ant更全⾯,更灵活。
- Maven在进⾏项⽬构建时,它对项⽬⽬录结构拥有约定,知道你的源代码在哪⾥,类⽂件应该放到哪⾥去。
- 它拥有⽣命周期的概念,maven的⽣命周期是有顺序的,在执⾏后⾯的⽣命周期的任务时,不需要显示的配 置前⾯任务的⽣命周期。例如执⾏ mvn install 就可以⾃动执⾏编译,测试,打包等构建过程

Maven⼯具使⽤

Maven⼯具的安装

环境准备

PC端: win10/win7操作系统
Jdk: jdk-8u172-windows-x64.exe
maven: apache-maven-3.5.3-bin.zip

Maven的历史版本下载地址: https://archive.apache.org/dist/maven/maven-3/

maven解压

将Maven的软件包解压到某⼀个盘符下,如D盘,E盘的某⼀个你喜欢的路径下;如果你C盘的空间⾜够 ⼤,也可以选择C盘。注意: 你的路径中不要使⽤中⽂,也尽量不要带有空格及其他特殊符号

在这里插入图片描述

Maven本地仓库配置

创建仓库⽬录
选择⼀个你喜欢的位置创建⼀个⽂件夹repository,当作Maven的本地仓库。起名尽量⻅名知意,这⾥的仓库是maven1/repository
在这里插入图片描述

修改settings.xml⽂件
第⼀步:打开Maven的conf⽬录下的settings.xml⽂件

在这里插入图片描述

第⼆步:找到localRepository标记,⼤概在⽂件的50⾏左右,然后配置⼀下本地仓库路径,指向你创建 的仓库⽬录

在这里插入图片描述

第三步:再配置⼀下远程仓库的地址。下⾯给⼤家的是阿⾥云的远程仓库地址。

<mirror>
    <id>alimaven</id>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>			   <mirrorOf>central</mirrorOf>
</mirror>

只需要将上述提供的阿⾥云的地址复制到mirrors标记内部即可,mirrors的结束标记⼤约在165⾏左右

在这里插入图片描述

Maven环境变量配置
Maven的环境变量配置与jdk的环境变量配置⾮常类似

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

Maven配置时pom.xml⽂件的说明

pom.xml常⽤元素介绍

Maven中的project 包含的⼀些约束信息

modelVersion : 指定当前pom的版本
groupId :(主项⽬标示,定义当前maven属于哪个项⽬,反写公司⽹址+项⽬名)
artifactId : (实际项⽬模块标识,项⽬名+模块名)
version(当前项⽬版本号,第⼀个0标识⼤版本号,第⼆个0标示分⽀版本号,第三个
0标识⼩版本号,0.0.1,snapshot快照,alpha内部测试,beta公测,release稳
定,GA正式发布)
properties : ⼀些常⽤属性的声明(包括依赖的版本号,编码,资源位置等)
name : 项⽬描述名
url : 项⽬地址
description : 项⽬描述
developers : 开发⼈员列表
licenses : 许可证
organization:组织
dependencies:依赖列表
dependency:依赖项⽬ ⾥⾯放置坐标
scope:包的依赖范围
optional :设置依赖是否可选
exclusions:排除依赖传递列表
dependencyManagement : 依赖的管理
build:为构建⾏为提供⽀持
plugins:插件列表
parent:⼦模块对⽗模块的继承
modules:聚合多个maven项⽬

对scope包依赖范围的说明

3.1. 依赖范围
maven中三种classpath:编译,测试,运⾏ 1.compile:默认范围,编译测试运⾏都有效 2.provided:在编译和测试时有效 3.runtime:在测试和运⾏时有效 4.test : 只在测试时有效 5.system : 在编译和测试时有效,与本机系统关联,可移植性差
3.2. 注意范围
问题描述:maven scope ‘provided’ 和 ‘compile’的区别 2.1. 解释 其实这个问题很简单。 对于scope=compile的情况(默认scope),也就是说这个项⽬在编译,测试,运⾏阶段都需要这个artifact(模块)对应的jar包在classpath中。 ⽽对于scope=provided的情况,则可以认为这个provided是⽬标容器已经provide这artifact。换句话说,它只影响到编译,测试阶段。在编译测试阶段,我们需要这个artifact对应的jar包在classpath中⽽在运⾏阶段,假定⽬标的容器(⽐如我们这⾥的liferay容器)已经提供了这个jar包,所以⽆需我们这个artifact对应的jar包了。
2.2. 实例(scope=provided) ⽐如说,假定我们⾃⼰的项⽬ProjectABC 中有⼀个类叫C1,⽽这个C1中会import这个portal-impl的artifact中的类B1,那么在编译阶段,我们肯定需要这个B1,否则C1通不过编译,因为我们的scope设置为provided了,所以编译阶段起作⽤,所以C1正确的通过了编译。测试阶段类似,故忽略。 那么最后我们要吧ProjectABC部署到Liferay服务器上了,这时候,我们到$liferay-tomcat-
home\webapps\ROOT\WEB-INF\lib下发现,⾥⾯已经有了⼀个portal-impl.jar了,换句话说,容器已经提供了这个artifact对应的jar,所以,我们在运⾏阶段,这个C1类直接可以⽤容器提供的portal-impl.jar中的B1类,⽽不会出任何问题。
omcat-
home\webapps\ROOT\WEB-INF\lib下发现,⾥⾯已经有了⼀个portal-impl.jar了,换句话说,容器已经提供了这个artifact对应的jar,所以,我们在运⾏阶段,这个C1类直接可以⽤容器提供的portal-impl.jar中的B1类,⽽不会出任何问题。
2.3. 实际插件的⾏为 刚才我们讲述的是理论部分,现在我们看下,实际插件在运⾏时候,是如何来区别对待scope=compile和scope=provided的情况的。 做⼀个实验就可以很容易发现,当我们⽤maven install⽣成最终的构件包ProjectABC.war后,在其下的WEB-INF/lib中,会包含我们被标注为scope=compile的构件的jar包,⽽不会包含我们被标注为scope=provided的构件的jar包。这也避免了此类构件当部署到⽬标容器后产⽣包依赖冲突。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值