maven第一天——入门与基本概念
一、什么是maven?
1.概述
核心点:项目构建、依赖管理、【更新】:源码关联
(如何关联源码:在依赖的jar上右击 maven download source即可)
Maven是一个项目管理和综合工具。Maven提供了开发人员构建一个完整的生命周期框架。(字面意思为 专家)
开发团队可以自动完成该项目的基础设施建设时间几乎没有,Maven使用标准的目录结构和默认构建生命周期。
maven是Java编写的,服务于Java 的构建工具
在多个开发团队环境的情况下,Maven可以设置在上班的路上在很短的时间内为标准。由于大部分的项目设置简单可重复使用,
Maven的生活的开发容易,而创建报告,检查,生产和测试的自动化设置。
学maven最重要也是最难的不是怎么配置、怎么使用maven,而是为什么使用maven,既然目前掌握的东西已经可以完成一些项目了,
那为什么还要学习maven呢? 为什么是maven而不是ant等其他构建工具? 带着这个问题我们再往下走。
这里就不再展开 ant && 新秀gradle 等
2.目前存在的问题
1)一个项目只是一个工程
如果项目非常庞大,模块众多,使用package进行划分也不便于管理,最好是一个模块对应一个工程,便于分工及管理等。
2)使用的jar包必须手动复制——粘贴到WEB-INF/lib目录下
同样的jar包重复出现在不同工程中,继浪费空间,又导致项目臃肿。
使用maven将可以把jar包保存在‘仓库’中,工程只需要进行引用。
3)jar包需要自己准备(官网下载等)
各大官网提供的下载是五花八门的,导致下载不便(当然,去一些英文网站下载由于英语水平也导致困难/笑哭)
而且,一些第三方提供的下载(CSDN等等)下载的内容难以保证是否正规
当然,也有一些是直接提供maven下载的
4)各jar包的依赖管理需要手动管理
比如fileupload依赖于io包,如果依赖信息越来越多,手动管理将十分复杂!
maven就会帮我们进行依赖管理
3.项目构建
既然maven作为一款项目构建和依赖管理的工具,那什么叫项目构建呢
以Java源文件、框架配置文件、JSP、HTML、图片等等的资源这些“原材料”,去“生产”一个可以运行的Java程序的过程
包含 编译、部署、搭建等过程
这里我们需要特别注意的是工程目录编译前后的关系:
//像我们访问webContent下某个文件时是无需写此目录的。build是编译后的classes
想要查看编译后的项目目录信息,可以安装插件直接browse deployment location再找到项目文件夹(当然这一步可以手动)
为了清晰地看清结构呢,可以复制项目(到tomcat中复制项目)到eclipse任意一个工程中展开查看,例如:
//可以看到,和webContent是没有关系的(当然,编译结果是在build目录下,可以搜索navigator视图查看)
//项目运行的不是我们编写的动态WEB工程,而是“编译”后的结果
//像rt等一些运行时环境是不在目录结构中的,只是引用
构建的步骤:
清理:将以前编译的旧的字节码文件删除
编译:将源程序编译成字节码文件
测试:关键点的自动测试,自动调用我们准备好的jUnit
报告:测试的结果就是测试报告
打包:动态Web工程打的是war包,Java工程打的是jar包
安装:将打包得到的文件复制到仓库中的指定位置
部署:将动态Web工程生成的war包复制到servlet容器目录的指定位置
二、如何使用maven
安装maven核心程序
1)检查:
由于maven也是java编写的,安装之前需要检查JAVA_HOME是否正确配置
Echo %JAVA_HOME%:输出JAVA_HOME路径
Java -version:查看JDK版本
2)解压:
之后我们解压核心程序:apache-maven-3.5.0-bin.zip (版本自由选择),解压好后放在一个非中文、无空格目录下
(我这里放到F:/maven目录下)
3)配置:
对maven的环境变量进行配置
a.配置MAVEN_HOME或M2_HOME(向下兼容)
b.配置Path
新建系统变量 MAVEN_HOME(M2_HOME亦可) 变量值:F:\maven\apache-maven-3.2.2
编辑系统变量 Path 添加变量值: ;%MAVEN_HOME%\bin
//当然,其实自己的电脑是可以配用户变量的(据网友回答:
如果设置的是用户环境变量,还需要注销再登陆才生效;path中加上 C:\Windows\System32)
//settings的配置见下文补充(位置与内容)
4)验证:运行dos命令 mvn -v;正常显示版本信息则成功。
5)更新
Maven的更新
在Windows上更新Maven非常简便,只需要下载新的Maven安装文件,解压至本地目录,然后更新M2_HOME环境变量便可。
更新注意修改的地方:环境变量的更换的配置,settings.xml中本地仓库的设置,jdk版本的设置,仓库镜像的设置,eclipse中的设置
【更新】:我们可以将conf目录下的settings.xml文件拷贝一份到Maven本地仓库的位置(之后更换版本时就无需重复指定了),之后在eclipse中只需指定一次配置文件位置即可!
Linux下安装可以参考:https://blog.csdn.net/mynameissls/article/details/54140176
三、maven的核心概念
1.概念
1.约定目录结构
2.POM
3.坐标
4.依赖
5.仓库
6.生命周期/插件/目标
7.继承
8.聚合
//以上重要程度按颜色区分,以下将逐一解释介绍这些概念
聚合、继承将在day02讲解
2.第一个maven工程
我们通过第一个maven工程来感性认识一下以上的概念
①目录结构
Hello
|---src
|---|---main
|---|---|---java
|---|---|---resources
|---|---test
|---|---|---java
|---|---|---resources
|---pom.xml
1)创建约定目录结构
根目录——工程名
src目录——源码
main——主程序
test——测试程序
java——java源文件
resources——框架或其他工具的配置文件等
pom.xml文件——maven的核心配置文件
2)为什么要遵循约定目录结构
maven作为自动化构建工具,比如它要编译,它就需要知道编译的路径,按照约定,maven才能智能地为我们服务
要想让maven知道我们自定义的结构,我们可以:
使用配置文件
遵循约定
一般情况下:约定优于配置
接下来我们来建立这个maven工程
在WORKPLACE下新建Hello文件夹
在Hello文件夹下新建src文件夹和pom.xml配置文件
配置文件这里暂时不展开,后续补充:
<?xml version="1.0" ?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.atguigu.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version> <name>Hello</name> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
在src下建立main和test
在man和test下建立 java 和 resources文件夹
在src/main/java/com/atguigu/maven目录下新建文件Hello.java,内容如下:
package com.atguigu.maven;
public class Hello {
public String sayHello(String name){
return "Hello "+name+"!";
}
}
在/src/test/java/com/atguigu/maven目录下新建测试文件HelloTest.java:
package com.atguigu.maven;
import org.junit.Test;
import static junit.framework.Assert.*;
public class HelloTest {
@Test
public void testHello(){
Hello hello = new Hello();
String results = hello.sayHello("litingwei");
assertEquals("Hello litingwei!",results);
}
}
运行maven的常用命令:
mvn compile 编译
mvn clean 清理
mvn test 测试
mvn package 打包
mvn install 安装(能做得事情最多,从清理开始进行,所以比较常用)
※注意:运行Maven命令时一定要进入pom.xml文件所在的目录!
如何进入目录?:
(其实不用每次重开cmd,再转换路径。直接在要用的路径下按住shift,右键点击弹出的菜单中就可以直接打开一个cmd窗口且路径指向)
//清屏:cls
联网问题:执行maven命令需要插件时会先在本地仓库查找【当前用户家目录:C\用户\用户名 这个目录,可以看到.m2文件夹】,
未找到时,会自动连接外网到中央仓库下载,也就是这里的downloading...(第二次运行时不会重复下载)
修改本地仓库路径:
当然,在c盘我们是不太乐意的,我们希望把它改为自定义的本地仓库目录
找到maven解压目录:conf\settings.xml
找到 localRepository 标签 (当然,这里是注释的,直接改无效)
把它从注释里放出来,改为我们准备好的目录即可:
测试几个常用的mvn命令可以看到目录下生成的对应的文件:(target是maven生成的目标文件夹,包含编译好的class文件)
//包含一些类似的打包文件等
如何更换maven国内镜像,解决Maven下载慢的问题请参见:http://blog.csdn.net/a992036795/article/details/53161344
慕课网友推荐的:
<mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror>
3.pom的概念
什么是pom?
POM(Project Object Model) 是Maven的基础。它是一个XML文件,包含了Maven用来build项目所需要的项目配置的信息。
pom部分的展开请分别参见网友博文:
http://blog.csdn.net/zhuxinhua/article/details/5788546
http://www.cnblogs.com/sharpest/p/5969566.html
4.坐标的概念
什么是坐标?
数学中坐标的概念:使用(x,y)或(x,y,z)可以定义平面或空间中的唯一一个点
maven中坐标的概念:使用以下三个向量定位唯一的一个工程:
groupId:团体,公司,小组,组织,项目,或者其它团体。团体标识的约定是,
它以创建这个项目的组织名称的逆向域名(reverse domain name)开头+项目名
公司域名逆序+项目名
(其它博友的说法:通常是 包名)
artifactId:在groupId下的表示一个单独项目的唯一标识符。也就是一个模块名称。
version:
<groupId>com.atguigu.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
以连接起来的字符串作为目录结构到仓库中查找:
com/atguigu/maven/Hello/0.0.1-SNAPSHOT/Hello-0.0.1SNAPSHOT.jar
这里就不用文字来进行描述了(也不方便描述),就是g/a/v/a-v.jar (只有版本号中的.不用变 / )
【更新】大致为:groupId/artifactId/version/artifactId-version.packaging
5.仓库的概念
本地仓库:当前电脑上部署的仓库,为当前电脑上的所有maven工程服务
远程仓库:
私服:搭建在局域网环境中,为局域网中的maven工程服务。(我们所说的私服通常是Nexus)
//先在私服上找,找不到会帮你去中央仓库等找再保存在私服(解决maven联网等一些问题)
中央仓库:架设在Internet上,为全网所有的maven工程服务
中央仓库的镜像:为了分担中央仓库的流量,减轻中央仓库的压力,提升访问速度
仓库中保存的内容:maven工程
1)maven工程所需要的插件
2)第三方框架或工具的jar包
3)我们自己开发的工程
在介绍最重要的依赖之前,我们先来建立我们的第二个maven工程,一方面是强化我们对maven工程目录结构的理解,一方面是引出依赖的概念
(仓库的配置见上文中修改本地仓库的描述)
6.第二个maven工程
①工程名:HelloFriend (依旧是在WROKPLACE下建立)
②目录结构与第一个Maven工程相同
③POM文件
<?xml version="1.0" ?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.atguigu.maven</groupId>
<artifactId>HelloFriend</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>HelloFriend</name> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
</dependency> <dependency>
<groupId>com.atguigu.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency> </dependencies>
</project>
这里添加了对Hello工程的依赖
//后面会贴出所有工程的操作指南
could not found 异常:
对于我们自己开发的maven工程,执行install命令后,工程就会进入仓库,其它工程对它的依赖才能生效
mvn install 安装
此时安装完成后,HelloFriend对Hello的依赖就能正常编译了
7.依赖的概念
依赖的范围(pom中scope的范围),我们常用的三个:
主要是用于依赖对三种 classpath (编译、测试、运行)的控制:
compile(默认):
对主程序是否有效 (main):有效
对测试程序是否有效 (test):有效
是否参与打包:参与
是否参与部署:参与
(典型应用:spring-core)
test:
对主程序是否有效:无效
对测试程序是否有效:有效
是否参与打包:不参与
是否参与部署:不参与
(典型应用是jUnit)
provided:
对主程序是否有效:有效
对测试程序是否有效:有效
是否参与打包:不参与
是否参与部署:不参与
(只在开发阶段,典型例子是servletAPI,服务器上存在,实际跑时不需要部署)
8.生命周期的概念
什么是生命周期?
各个构建环节执行的顺序不能打乱,必须按照既定的顺序,这个顺序就是maven的生命周期
maven的核心程序中定义了抽象的生命周期,生命周期的各个阶段的具体任务是由插件来完成的
详细的生命周期可以参见网友博客:http://www.cnblogs.com/luotaoyeah/p/3819001.html
不论执行哪个阶段,都会从头开始执行,这也是为了更好的实现自动化构建。
例如:执行打包时,会从编译等开始一直执行到打包。
插件等信息也可以参见上述博文。
四、在eclipse中使用maven插件
一般eclipse中都自带了maven插件,无需安装
当然了,还有如下两个地方需要我们配置后才能正常使用:
installatons:maven核心程序的位置(使用我们自己下载解压的)
我们点击 add ,进行添加:
//添加完成后勾选我们添加的maven即可
usersettings: 指定conf/settings.xml的位置,进而获取本地仓库的位置
这样,点击 apply ,点击ok,就完成了。
【更新】:如何下载关联源码:
maven第一天——入门与基本概念的更多相关文章
- Ajax第一天——入门与基本概念
什么是Ajax Ajax被认为是(Asynchronous JavaScript and XML的缩写).异步的js和xml 异步和同步:同步->类似打电话,接完一个再接下一个:异步:-> ...
- Flink入门-第一篇:Flink基础概念以及竞品对比
Flink入门-第一篇:Flink基础概念以及竞品对比 Flink介绍 截止2021年10月Flink最新的稳定版本已经发展到1.14.0 Flink起源于一个名为Stratosphere的研究项目主 ...
- .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9977862.html 写在前面 千呼万唤始出来,首先,请允许我长吸一口气!真没想到一份来自28岁老程序员 ...
- net core体系-web应用程序-4asp.net core2.0 项目实战(CMS)-第一章 入门篇-开篇及总体规划
.NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划 原文地址:https://www.cnblogs.com/yilezhu/p/9977862.html 写在前面 千呼万唤始出来 ...
- 第一篇 入门必备 (Android学习笔记)
第一篇 入门必备 第1章 初识Android 第2章 搭建你的开发环境 第3章 创建第一个程序--HelloWorld 第4章 使用Android工具 ●Android之父 Android安迪·罗 ...
- idea---搭建maven,tomcat入门
这篇随笔讲讲idea工具的安装和使用和在idea中搭建maven的分享. 一.概念 1.IntelliJ IDEA是什么? DEA 全称 IntelliJ IDEA,是java编程语言开发的集成环境. ...
- 学会Git玩转GitHub(第一篇) 入门详解 - 精简归纳
学会Git玩转GitHub(第一篇) 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 9 / 25 转载请注明出处!️ 目录 学会Git玩转GitHub(第一篇) 入门详解 - 精简归纳 ...
- Maven使用--基本入门
maven学习(上)- 基本入门用法 转载自:https://www.cnblogs.com/yjmyzz/p/3495762.html 参考: http://www.cnblogs.com/dave ...
- PRML读书会第一章 Introduction(机器学习基本概念、学习理论、模型选择、维灾等)
主讲人 常象宇 大家好,我是likrain,本来我和网神说的是我可以作为机动,大家不想讲哪里我可以试试,结果大家不想讲第一章.估计都是大神觉得第一章比较简单,所以就由我来吧.我的背景是统计与数学,稍懂 ...
随机推荐
- Mac下驱动BCM20702A0 USB蓝牙
偶然高了一个USB蓝牙,查到Mac下能识别,无法驱动,就去找了一下.方法很简单,就是把蓝牙的PID和VID加入到驱动里边去,具体方法和步骤如下: 1. 进入到/System/Libary/Extens ...
- linux ubuntu 本地镜像 软件源 制作方法
1.配置当前软件源,镜像非常大,所以首先要配置一下载速度快的软件源http://fffo.blog.163.com/blog/static/2119130682014322104136601/2.安装 ...
- 使用 Azure CLI 创建和管理 Linux VM
Azure 虚拟机提供完全可配置的灵活计算环境. 本教程介绍 Azure 虚拟机的基本部署项目,例如选择 VM 大小.选择 VM 映像和部署 VM. 你将学习如何执行以下操作: 创建并连接到 VM 选 ...
- sql server 查询ntext字段长度
DATALENGTH 返回任何表达式所占用的字节数. 语法 DATALENGTH ( expression ) 参数 expression 任何类型的表达式. 返回类型 int 注释 DATALENG ...
- Flask的数据库连接池 DBUtils
Flask是没有ORM的操作的,如果在flask中连接数据库有两种方式 一.pymysql 二.SQLAlchemy 是python操作数据库的以一个库,能够进行orm映射官网文档 sqlchemy ...
- UNIX高级环境编程(3)Files And Directories - stat函数,文件类型,和各种ID
在前面的两篇,我们了解了IO操作的一些基本操作函数,包括open.read和write. 在本篇我们来学习一下文件系统的其他特性和一个文件的属性,涉及的函数功能包括: 查看文件的所有属性: 改变文件所 ...
- Alpha 冲刺报告(3/10)
Alpha 冲刺报告 队名:洛基小队 峻雄(组长) 已完成:开始编写角色的移动脚本 明日计划:继续学习并进行脚本编写 剩余任务:物品背包交互代码 困难:如何把各个模块的脚本整合起来 --------- ...
- javascript 的MD5代码备份,跟java互通
var MD5 = function (string) { function RotateLeft(lValue, iShiftBits) { ...
- 小白学svn
该博客是本人第一次在自己的电脑中部署svnserver后的一些心得,希望对小白们有所帮助.尽管本人之前有使用svn开发的经验,可是那都是使用百度开发人员平台的,我一直以为在自己的电脑中弄svnserv ...
- ubuntu18.04 mariadb start失败
在Ubuntu 安装mariadb 再restart 后出现错误 journalctl -xe 发现 apparmor权限问题 AppArmor 是一款与SeLinux类似的安全框架/工具,其主要作用 ...