Maven实战从入门到精通(全)
目录
- 前言
- 1. 安装及配置
- 2. 核心概念
- 2.1 约定的目录结构
- 2.2 编译执行
- 2.3 仓库
- 2.4 pom文件
- 2.5 常用命令
- 2.6 生命周期以及插件
- 2.7 单元测试junit
- 3. 结合idea
- 3.1 设置maven
- 3.2 新建javase项目
- 3.3 创建web工程
- 3.4 常用技巧
- 4. 其他细节信息
- 4.1 依赖范围
- 4.2 常用属性
- 4.3 资源插件
前言
了解Maven的具体概念、功能、具体执行步骤以及如何搭建等
本地仓库资源
Maven 具体功能:
maven 是自动化构建工具,可以部署项目;管理jar文件,自动下载jar、文档和源代码;管理jar直接的依赖以及版本;编译程序,把java编译为class;测试代码是否正确;打包文件,形成jar文件或者war文件
具体构建步骤:
构建是面向过程,主要步骤是
- 清理:把之前项目编译的东西删除掉,为新的编译代码做准备。
- 编译: 把程序源代码编译为执行代码, 把java编译成class文件且是批量的,maven可以同时把成千上百的文件编译为class。这与javac 不一样,javac一次编译一个文件。
- 测试: maven可以执行测试程序代码,验证你的功能是否正确。批量的,maven同时执行多个测试代码,同时测试很多功能。
- 报告: 生成测试结果的文件,具体文件是测试有无通过。
- 打包: 项目中所有的class文件,配置文件等所有资源放到一个压缩文件中。这个压缩文件就是项目的结果文件, 通常java程序,压缩文件是jar扩展名的。对于web应用,压缩文件扩展名是.war
- 安装: 把5中生成的文件jar,war安装到本机仓库
- 部署: 把程序安装好可以执行。
核心概念:
①POM :名称是pom.xml(项目对象模型)
maven把一个项目当做一个模型使用
控制maven构建项目的过程,管理jar依赖。
②约定的目录结构 : maven项目的目录和文件的位置都是规定的。
③坐标 : 是一个唯一的字符串,用来表示资源的。
④依赖管理 : 管理项目可以使用jar文件
⑤仓库管理(了解) :资源存放的位置
⑥生命周期 (了解) : maven工具构建项目的过程
⑦插件和目标(了解):执行maven构建的时候用的工具是插件
⑧继承
⑨聚合
1. 安装及配置
- 从maven的官网下载maven的安装包
- 解压安装包,解压到一个目录,非中文目录
- 子目录 bin :执行程序,主要是mvn.cmd
- conf :maven工具本身的配置文件 settings.xml
配置环境变量
在系统的环境变量中,指定一个M2_HOME的名称, 指定它的值是maven工具安装目录,bin之前的目录
再把M2_HOME加入到path之中,在所有路径之前加入 %M2_HOME%\bin;
验证,新的命令行中,执行mvn -v
注意:需要配置JAVA_HOME ,指定jdk路径
具体maven的配置可看我上一篇的文章进行了解
Maven详细配置(全)
2. 核心概念
2.1 约定的目录结构
每一个maven项目在磁盘中都是一个文件夹(项目-Hello)
Hello/
—/src
------/main #主程序java代码和配置文件
----------/java #程序包和包中的java文件
----------/resources #java程序中要使用的配置文件
------/test #测试程序代码和文件的(可以没有)
----------/java #测试程序包和包中的java文件
----------/resources #测试java程序中要使用的配置文件
—/pom.xml #maven的核心文件(maven项目必须有)
类似这样的目录结构,以树为结构
2.2 编译执行
- 在cmd命令行下运用
mvn compile
进行编译,编译src/main目录下的所有java文件的 - cmd下的命令行会出现多个下载文件
Downloading:https://repo.maven.apache.org/maven2/org/apache/maven/maven-plugin
等等是因为第一次mvn会下载多个插件,maven工具执行的操作本身需要很多插件(java类,以jar文件结尾)来完成,插件是完成某些具体功能,下载插件的网址涉及中央仓库,后续核心概念会讲到。 - 下载后的插件具体位置放于默认本地仓库中
C:\Users\86135\.m2
仓库具体的具体
编译成功之后会在项目的根目录下生成target
maven编译的java程序,最后的class文件都放在target目录中
2.3 仓库
仓库是存放maven使用的jar和我们项目使用的jar
仓库的分类可以分为本地仓库和远程仓库
本地仓库是个人计算机上的文件夹,存放各种jar
设置本机存放资源的目录位置(设置本机仓库):
- 修改maven的配置文件
/conf/settings.xml
, 先备份 settings.xml - 修改 localRepository 指定目录(不要使用中文目录)
远程仓库是在互联网上的,使用网络才能使用的仓库
远程仓库分为中央仓库、中央仓库的镜像和私服
中央仓库是共享一个集中仓库 。 https://repo.maven.apache.org :中央仓库的地址
中央仓库的镜像是中央仓库的备份, 在各大洲,重要的城市都是镜像
私服是用在局域网不对外公布
仓库的具体使用是不需要人为使用
具体如何运作仓库
比如需要使用mysql驱动,maven首先查本地仓库—>私服—>镜像—>中央仓库,如果某个阶段有,之后会类似递归一样返回调用
2.4 pom文件
- pom是Project Object Model 项目对象模型
- Maven 把一个项目的结构和内容抽象成一个模型,在 xml 文件中进行声明,以方便进行构建和描述,pom.xml 是 Maven 的灵魂
- 项目打包的类型packaging,可以是 jar、war、rar、ear、pom,默认是 jar
基本信息有坐标和依赖信息等
1.坐标是唯一值在互联网中唯一标识一个项目的
项目在仓库中的位置是由坐标来决定的:groupId、artifactId 和 version 决定项目在仓库中的路径,artifactId 和 version 决定 jar 包的名称
<groupId>公司域名的倒写</groupId>
<artifactId>自定义项目名称</artifactId>
<version>自定版本号</version>
具体搜索使用的中央仓库是
中央仓库地址
通过仓库搜索后的驱动配置(以jar包结尾)
2.packaging: 打包后压缩文件的扩展名,默认是jar ,web应用是war 。默认不写是jar包
3.依赖信息:项目中要使用的各种资源说明
dependencies 和dependency ,相当于是 java代码中import
<dependencies><!--依赖 java代码中 import --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.9</version></dependency>
</dependencies>
4.properties:设置属性
5.build : maven在进行项目的构建时, 配置信息,例如指定编译java代码使用的jdk的版本等
2.5 常用命令
通过命令,完成maven的生命周期的执行
maven可以使用命令,完成项目的清理,编译,测试等等
命令 | 功能 |
---|---|
mvn clean | 清理(会删除原来编译和测试的目录,即 target 目录,但是已经 install 到仓库里的包不会删除) |
mvn compile | 编译主程序(会在当前目录下生成一个 target,里边存放编译主程序之后生成的字节码文件) |
mvn test-compile | 编译测试程序(会在当前目录下生成一个 target,里边存放编译测试程序之后生成的字节码文件) |
mvn test | 测试(会生成一个目录surefire-reports,保存测试结果) |
mvn package | 打包主程序(会编译、编译测试、测试、并且按照 pom.xml 配置把主程序打包生成 jar 包或者 war 包) |
mvn install | 安装主程序(会把本工程打包,并且按照本工程的坐标保存到本地仓库中) |
mvn deploy | 部署主程序(会把本工程打包,按照本工程的坐标保存到本地库中,并且还会保存到私服仓库中。还会自动把项目部署到 web 容器中) |
2.6 生命周期以及插件
- lifecycle为生命周期
- plugins为插件
- dependencies为依赖信息
maven的生命周期:就是maven构建项目的过程,清理,编译,测试,报告,打包,安装,部署
maven的插件: maven命令执行时,真正完成功能的是插件,插件就是一些jar文件, 一些类。
编译插件的配置
<build>
<!-- 配置插件--><plugins> <!-- 配置具体插件--><plugin> <groupId>org.apache.maven.plugins</groupId> <!-- 插件名称--><artifactId>maven-compiler-plugin</artifactId> <!-- 插件版本--><version>3.8.1</version> <!-- 配置插件的信息--><configuration> <!-- 代码运行在jdk1.8上--><source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins>
</build>
2.7 单元测试junit
单元测试(测试方法):用的是junit, junit是一个专门测试的框架(工具)。
测试的是类中的方法,每一个方法都是独立测试的, 方法是测试的基本单位(单元)
== maven借助单元测试,批量的测试你类中的大量方法是否符合预期的==
具体的使用步骤是在pom.xml文件中加入单元测试
<!-- 单元测试 -->
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope>
</dependency>
推荐的创建类和方法的提示:
- 测试类的名称 是Test + 你要测试的类名
- 测试的方法名称 是:Test + 方法名称
例如要测试HelloMaven ,创建测试类 TestHelloMaven
@Testpublic void testAdd(){测试HelloMaven的add方法是否正确}
其中testAdd叫做测试方法,它的定义规则
1.方法是public的,必须的
2.方法没有返回值, 必须的
3.方法名称是自定义的,推荐是Test + 方法名称
4.在方法的上面加入 @Test
举个列子:
在main的函数中
public class HelloMaven {public int add(int n1,int n2){return n1+n2;}public static void main(String args[]){HelloMaven hello = new HelloMaven();int res = hello.add(10,20);System.out.println("10+20="+res);}
}
测试类应该这样书写
public class MyTest {@Testpublic void testAdd(){System.out.println("执行 HelloMaven 类 addNumber()方法");HelloMaven hello =new HelloMaven();int res = hello.add(n1,n2);// 期望值,实际值.如果两个值相等则为正确的,不等就会抛出异常,会出错Assert.assertEquals(30,res);} }
具体Assert.assertEquals
的参数设置可以查看我上一篇文章
java之Assert.assertEquals详细分析
3. 结合idea
3.1 设置maven
idea中内置了maven ,一般不使用内置的, 因为用内置修改maven的设置不方便。使用自个安装的maven,覆盖idea默认的设置,让idea指定maven的安装具体位置
- Maven Home path: maven的安装目录
- User Settings File : maven安装目录conf/setting.xml配置文件
- Local Repository : 本机仓库的目录位置
修改设置为自已安装的maven
在将Runner设置jre为1.8且在VM Options中设置一个参数,参数为-DarchetypeCatalog=internal
。新建的时候就回会比较快,是因为模式联网用maven的时候会下载一个7M的东西,添加参数会不下载且比较快。
配置以后的新工程设置都是maven的
在老版的idea中用file–other settings–Settings for New Project
在新版的idea中为
3.2 新建javase项目
具体idea版本不一样,界面稍微不太一样,不过大同小异
常用的目录结构已经创建好
使用模板创建maven项目,以下的模板没有resources
具体创建之后的目录结构为
蓝色为java文件,绿色为测试文件,添加后的resources需要设置为
讲解pom.xml的其他配置信息
以下为项目信息name以及通过网址访问的url项目,可用可不用
3.3 创建web工程
新建的项目默认目录是
需要新建一些java和resources的目录以及做一些标记
查看pom.xml下的文件
web下默认是war后缀的包
<groupId>org.example</groupId>
<artifactId>8.6ceshi</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
- 以下的name为项目名,url为访问项目的网站,暂时没用到可以删除
- 默认jdk为1.8,将其修改为1.8
以下build为插件的信息,即插件的管理。具体列出来与不列出来之后都会生成,主要是为了方便版本配置,可以删除
具体有清楚插件、资源插件、编译插件、生成报告插件、打包插件、安装插件、部署插件等
此时大概已经配置完毕
对比maven的好处:
以前写servlet的时候需要在dependencies中加入tomcat等信息
现在只需要用maven的管理即可,在pom.xml下加依赖信息即可
比如servlet和jsp的依赖信息
<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope>
</dependency>
<dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.1</version><scope>provided</scope>
</dependency>
3.4 常用技巧
1. 刷新pom.xml
pom文件加入依赖后,有下划线,代表还未更新到,需要刷新
可以通过点击pom.xml右键进行刷新
或者在maven的项目中进行刷新
2.更新目录文件为测试或者跟目录权限等
或者点击工程目录中的
3.导入一个存在的项目
如果本身项目有pom.xml,则需设置为maven
在设置中进行添加模块
导入的项目为maven
jdk设置为1.8
4. 其他细节信息
4.1 依赖范围
有无此功能 | compile | test | provided |
---|---|---|---|
对主程序是否有效 | 是 | 否 | 是 |
对测试程序是否有效 | 是 | 是 | 是 |
是否参与打包 | 是 | 否 | 否 |
是否参与部署 | 是 | 否 | 否 |
依赖范围:使用scope表示的
scope的值有 compile, test, provided ,默认是compile
使用的范围是在maven构建项目的那些阶段中起作用
maven构建项目 编译, 测试 ,打包, 安装 ,部署 过程(阶段)
比如
//该代码在test中才测试有效
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope>
</dependency>
如果是provided 则为提供者
代表编译测试用的jar包,但是项目进行打包安装的时候不需要这个jar包
比如下方的servlet包
<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version> <scope>provided</scope> </dependency>
4.2 常用属性
<properties>
设置maven的常用属性
在maven的全局变量中
可以自定义属性
- 在
<properties>
通过自定义标签声明变量(标签名就是变量名) - 在pom.xml文件中的其它位置,使用
${标签名}
使用变量的值
自定义全局变量一般是定义 依赖的版本号, 当你的项目中要使用多个相同的版本号,先使用全局变量定义, 在使用${变量名}
比如以下这行代码
<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target>
</properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency>
</dependencies>
将其修改为全局变量,如果版本号一致的有多个,可以统一一起修改而不繁琐
<junit.version>4.11</junit.version><version>${junit.version}</version>
完整代码演示:
<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><junit.version>4.11</junit.version>
</properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junit.version}</version><scope>test</scope></dependency>
</dependencies>
4.3 资源插件
- 默认没有使用resources的时候, maven执行编译代码时, 会把src/main/resource目录中的文件拷贝到target/classes目录中,对于src/main/java目录下的非java文件不处理,不拷贝到target/classes目录中
- 要想加入其他非java文件进行处理,需要添加以下代码,在build中加入其resources
把扩张名为xml和properties中都扫描到
并且之后生成都放到target/classes目录中
<build><resources><resource><directory>src/main/java</directory><!--所在的目录--><includes><!--包括目录下的.properties,.xml 文件都会扫描到--><include>**/*.properties</include><include>**/*.xml</include></includes><!—filtering 选项 false 不启用过滤器, *.property 已经起到过滤的作用了 --><filtering>false</filtering></resource></resources></build>
Maven实战从入门到精通(全)相关推荐
- 原型设计大师:Axure RP网站与APP设计从入门到精通(全彩) 中文pdf扫描版
原型设计大师:Axure RP网站与APP设计从入门到精通内容丰富且实用,由浅入深地传授了Axure 原型设计工具在网站和APP设计中的应用与技巧,并在文中贯穿了众多精彩实战案例.书中完整展现了多个鲜 ...
- 【Python】Python实战从入门到精通之七 -- 教你深入理解异常处理
本文是<Python实战从入门到精通>系列之第7篇 [Python]Python实战从入门到精通之一 -- 教你深入理解Python中的变量和数据类型 [Python]Python实战从入 ...
- 【Python】Python实战从入门到精通之六 -- 教你读取文件
本文是<Python实战从入门到精通>系列之第6篇 [Python]Python实战从入门到精通之一 -- 教你深入理解Python中的变量和数据类型 [Python]Python实战从入 ...
- 【Python】Python实战从入门到精通之五 -- 教你使用文件写入
本文是<Python实战从入门到精通>系列之第5篇 [Python]Python实战从入门到精通之一 -- 教你深入理解Python中的变量和数据类型 [Python]Python实战从入 ...
- 【Python】Python实战从入门到精通之四 -- 教你使用Python中字典
本文是Python实战–从入门到精通系列的第四篇文章: Python实战从入门到精通第一讲–Python中的变量和数据类型 Python实战从入门到精通第二讲–Python中列表操作详解 Python ...
- 【Python】Python实战从入门到精通之三 -- 教你使用Python中条件语句
本文是Python实战–从入门到精通系列的第三篇文章: Python实战从入门到精通第1讲–Python中的变量和数据类型 Python实战从入门到精通第2讲–Python中列表操作详解 Python ...
- 【Python】Python实战从入门到精通之一 -- 教你深入理解Python中的变量和数据类型
本文是Python实战–从入门到精通系列的第一篇文章: Python实战从入门到精通之一 – 教你深入理解Python中的变量和数据类型 文章目录 1.变量 1.1 变量命名规则 1.2 变量名称错误 ...
- 黑客零基础入门教程:「黑客攻防实战从入门到精通(第二版)」堪称黑客入门天花板
前言 您知道在每天上网时,有多少黑客正在浏览您计算机中的重要数据吗﹖黑客工具的肆意传播,使得即使是稍有点计算机基础的人,就可以使用简单的工具对网络中一些疏于防范的主机进行攻击,在入侵成功之后,对其中的 ...
- 视频教程-Word项目实战从入门到精通(兼容2007、2010、2013、2016)-Office/WPS
Word项目实战从入门到精通(兼容2007.2010.2013.2016) 有十年的开发经验和十年的培训经验,熟悉以下技术: 开源技术:struts2.hibernate.mybatis.spring ...
- Arduino从入门到精通全课时教程分享
Arduino从入门到精通全课时教程分享 欢迎使用Arduino全套教程下载 课程详细图片 链接:https://pan.baidu.com/s/1a2xMyWa6n5de1WlRulSmYQ 提取码 ...
最新文章
- Python多线程(3)——Queue模块
- 初步理解TCP/IP网络
- Linux命令之ln软链接
- UnitTest in .NET(Part 4)
- arch linux 入门,arch linux 从来就不是给新手入门用的
- android 3.0单元测试,Android Studio 3.0 gradle 3.0.0-beta2打破了Kotlin单元测试覆盖率?
- Java工作笔记-webService发布时通用的4个注解
- Spark Standalone架构设计要点分析
- 数据库SQL Server2012笔记(八)——Statement与PreparedStatement的区别,JDBC方式操作数据库...
- [转载] 全本张广泰——第一回 开篇聊闲天 青楼是非多
- xuperchain 区块最大大小 区块容量 maxblocksize
- 阿铭Linux第二章笔记
- 关于hive分区,你知道多少呢?
- centos7系统开启ftp服务器,centos7开启ftp服务器
- 利用SSA方法插值GRACE数据的空缺数据
- 信息化教学设计教案计算机,信息化教学设计模板
- 无线传感器网络作业题
- 无敌破坏王2口碑爆棚,从街游到手游你最爱哪款游戏呢?
- 制作可独立分发的Android模拟器
- Vue实战篇三十三:实现新闻的浏览历史
热门文章
- Java将视频文件、图片文件转Base64编码
- 记录解决Mac系统升级后三指取词、词典失效问题的过程
- PHP开发之留言板项目的一般流程,PHP留言板小项目(大作业)
- php去除文字格式,php如何清除html格式并去除文字中的空格然后截取文字
- layui官网地址(备份),layui文档地址(新)
- 为什么在 Windows 7系统下无法显示 STEP 7 MicroWin SP9的帮助文件?
- 2019美赛参赛获奖经验
- 低俗文章之傻傻分不清楚的IC和ID卡(手稿)
- u盘ios刻录_ISO to USB(ISO刻录到U盘)下载|ISO to USB(ISO刻录到U盘)官方下载-太平洋下载中心...
- 注册测绘师复习方法,注册测绘师考试心得