Maven
Maven是什么,Maven的作用是什么?
Maven是一种统一管理jar包的工程结构。因为使用普通java工程需要的jar包不稳定且出现许多并发问题。
所以Maven的中央仓库提供统一获取。
会导致如下的问题:
1. 包会出现大量的冗余,每个项目或模块都需要导入这些jar包,会有很多重复的包。
2. 在团队开发中,不同团队成员如果使用了同一个jar包,比如:mybatis包,但使用的版本不同,会导致包的冲突。
3. 如果使用了一个jar包,这个jar包依赖了哪些包,我们并不知道。
Maven的下载安装及使用
http://maven.apache.org/download.cgi
使用步骤:
下载完成后,指定文件夹进行解压。不要有中文目录,目录层次不要太深
Maven目录介绍
目录名 | 功能说明 |
---|---|
bin | 可执行文件所在的目录,其中mvn.cmd是它核心执行文件 |
boot | 第三方类加载器 |
conf | maven的配置文件所在的目录,其中settings.xml是maven的核心配置文件 |
lib | 因为maven是使用java写的,这是它的依赖jar包 |
配置环境变量
在进行配置前在doc窗口中先确定javac的命令是否可用。若不可用先把JDK的环境重新配置好。
我的电脑—属性—高级设置—环境变量—新建MAVEN_HOME和path路径
MAVEN_HOME=安装目录
Path=%MAVEN_HOME%\bin
验证是否配置成功 查看安装目录,JDK目录,GBK编码
Maven的仓库
Maven通过pom.xml对各种依赖包进行管理。通过pom中的设置找到对应的仓库进行获取。
有三个库的概念
本地仓库 自行从中央或者私服中下载完成后存放在本地当中的仓库
私服仓库 一般是公司中的仓库 所有人在此仓库中获取 私服没有对应jar包就从中央仓库进行获取
中央仓库 由maven公司所有 所有的jar包都从这里获取 中央仓库的地址:https://repo1.maven.org/maven2/
(镜像仓库 由于中央仓库在国外,下载速度异常缓慢,故由国内的团队提供的镜像仓库,镜像的中央仓库)
配置本地仓库
-
创建一个空repository文件夹 最好是在Maven的安装目录 便于查找
-
配置本地仓库,当查找jar包的时候可以优先在本地仓库中查找
修改maven的安装目录中conf/settings.xml文件,在53行配置本地仓库为上面的目录。默认是注释掉的。
此处的所有都是默认被注释掉的,复制出来,修改好,使未被注释。
<localRepository>创建的repository空文件夹路径</localRepository>
-
修改settings.xml文件,159行指定中央仓库的镜像。这里使用的是阿里云的中央仓库,速度比官方的快很多。注:mirrors 是容器
<mirrors> <mirror> <id>nexus-aliyun</id> <mirrorOf>*</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror> <mirror> <id>nexus-osc</id> <mirrorOf>*</mirrorOf> <name>Nexus osc</name> <url>http://maven.oschina.net/content/groups/public/</url> </mirror> </mirrors>
-
修改maven使用JDK的版本,200行。如果不配置就需要在idea中配置。maven默认使用的是JDK1.5的版本,这里使用1.8的版本。
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</profile>
至此Maven的运行环境已经配置完成,接下来要开始配置Idea中的运行环境。
Maven的坐标
坐标是获取jar包存在的准确地址的唯一途径。通过这个坐标找到每个jar包。
例如:要引入junit的jar包,只需要在pom.xml配置文件中配置引入junit的坐标即可
坐标元素定义的主要标签
在pom.xml文件中,通过以下三个元素来定义坐标
元素名称 | 说明 |
---|---|
groupId | 仓库中的一级目录 如:org.mybatis 此名字由中央仓库定义 |
artifactId | 仓库二级目录 包名 如:mybatis |
version | 要使用的包的版本 |
在定义maven项目的时候也需要定义这三个标签元素
一般遵从以下原则:
- groupId:表示一个公司,组织,团体反过来的域名
- artifactId:表示项目名或模块名
- version:每个版本号
图片示例各个标签的作用
此处的scope是属于其他标签,作用是包的依赖。后面统一表述。
如何在线去查询jar包坐标
通常以后开发过程中所有项目依赖的jar包的配置,不需要自己一个个去输入。
由项目小组长来提供,所有成员使用统一的依赖包,坐标都提供好了,我们直接使用就可以了。
如果需要自己找一个jar包的坐标如何去找?
步骤
1.输入这个网站:https://mvnrepository.com 用于在线查询jar包坐标网站
2.在文本框中输入,要找的jar包,按照使用次数进行粘贴,避免踩雷。
Idea中的环境配置
1)在全局配置中进行配置,否则每个maven项目都需要进行设置。
2)指定idea中,Maven路径,配置文件,本地仓库。勾上override勾选框。
-
选择Build,Execution,Deployment–>Build Tools -->Maven–>Runner(也可以直接搜索runner),设置Maven启动虚拟机的选项:VMOption,设置所有资源先从本地仓库查找,如果本地仓库中没有才去互联网找。
-
可选,如果测试中汉字没有乱码则不用设置,Maven控制台输出中文如果出现乱码,则进行如下设置。
VMoptions: -Dfile.encoding=GBK 或者 -Dfile.encoding=UTF-8
VMOptions配置多个参数需要使用空格隔开(最好不要配置)
创建Maven工程
1) 创建新工程 使用骨架直接创建 要使用maven-webapp 不是上方的22-webapp
2)点击下一步之后的 本项目坐标设置 可根据上述提到的坐标命名规则进行设置
3)继续点击下一步,直到创建完成工程。到达主页面,左下角有自动导入提示,必须选择不然每次导入依赖包都需要在右边的Maven控制图鉴中进行更新操作。
4)创建好之后工程之后会默认存在一个模块。名字为之前设置的坐标名。此时是一个不完整的Maven工程
5)在main下新建java和Resources包(创建目录) 如果需要用到test文件夹进行测试,那么在main的同级目录下也要创建一个
创建好了之后,在Maven控制台中更新,使其变色。
Jar和War的区别
在使用打包package功能的时候,如果在本项目坐标处没有设置打包类型,默认是jar包
jar包主要用于 三方使用 如 框架,源代码等
war包主要用于项目上线
指定打包的类型:
如果是java工程:打包成jar
如果是web工程: 打包成war
<groupId>GroupProject</groupId>
<artifactId>webapp</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging> 指定打包类型
Tomcat7插件的使用
Maven官方目前只有tomcat7插件,没有提供tomcat8的版本。
-
将下面的代码复制成plugins的子元素。这时刷新Maven Projects不会出现任何变化。可以修改端口号和访问地址。 放在dependencies元素的后面
![Tomcat7插件显示](D:\Java总结文档\图解\Maven\Tomcat7插件显示.png)<build>
<plugins>
<!--Tomcat7插件-->
<plugin>
<!--插件在仓库中的坐标-->
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<!--插件配置dependencies-->
<configuration>
<!--端口号-->
<port>8080</port> 此处可以指定端口号
<!--项目的访问地址-->
<path>/</path>
<!--默认编码-->
<uriEncoding>UTF-8</uriEncoding>
<!--服务器名-->
<server>tomcat7</server>
</configuration>
</plugin>
</plugins>
</build>
2)使用插件后,在Maven控制栏中更新一下。
使用插件的好处是不需要自己进行配置,找到tomcat7 下方的tomcat7run 双击就自动运行,右键有debug。
如果不用插件,就自行配置即可。
Maven中包的依赖
依赖配置
每个项目有多个jar包 但是每个jar包在内部是存在多个依赖关系的,比如 要使用mybatis的jar包就需要其他的jar包来共同使用
依赖指的就是一个jar包需要多个其他jar包一起使用才会生效。
注:不要写错,如果写错在仓库中就找不到这个jar包,但本地仓库中又会生成一个错误的目录结构
有可能导致以后正确地址的jar包也下载不了,解决方法就是去本地仓库中找到这个错误的目录结构删除了
依赖传递
下图中,紫色人物直接依赖 第一级 ,间接依赖后面的所有,因为第一级使用了后面的jar包
下图中,第一级和第二级jar包冲突,使用第一级的jar包
同级jar包冲突,谁加载在前使用谁。
可选依赖
主动设置,不让其他人看到我所使用的jar包。所以也就不可使用
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<optional>true</optional> 主要是使用该标签进行隐藏,不让其他人看见该包
</dependency>
排除依赖
主动切断,不使用其他jar包中的依赖。被排除的包 无需指定版本标签。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<exclusions>
<exclusion> 使用该标签实现切断
<groupId>org.hamcrest</groupId> Junit依赖该包, 但是该模块要去除该包,重新导入其他类型的包代替
<artifactId>hamcrest-core</artifactId>
</exclusion>
</exclusions>
</dependency>
注意:可选依赖和排除依赖都是可以不使用jar包 但是本质上可以理解为
一个是上对下的设置不可继承,一个是下对上的主动切断拒绝继承。
范围依赖
常用依赖范围
-
什么是依赖范围:选取上面三种类路径中一种或多种
-
通过标签:<scope>标签指定jar包的依赖范围
-
默认是:如果不指定默认是三种类路径下都可以使用,三种类路径起名:compile
依赖范围
依赖范围 | 编译类路径 | 测试类路径 | 运行时类路径 |
---|---|---|---|
compile | Y | Y | Y |
provided | Y | Y | - |
runtime | - | Y | Y |
test | - | Y | - |
注意: 新建的项目 会自动创建Junit的依赖包 并且附上test的依赖,导致只能在test文件中使用Junit
Maven的生命周期
什么是生命周期:项目从立项开始到项目开发结束的整个过程,maven将一些开发过程中标准操作设置成一个个命令,可以使用这些命令来简化这些操作。
clean命令
命令作用:用于清除target目录,类似于清除缓存 。target目录是项目在执行期间自动生成的,类似于以前的out目录。
test命令
命令作用:执行test目录下所有的测试类和测试方法,注:类名和方法名必须以test开头,这是代码的规范。
compile命令
命令作用:编译main目录下所的Java源代码,生成字节码文件。不会去编译test目录下东西
package命令
命令作用:用于把项目打包,如果是java工程,打包成jar。如果是web工程,打包成war,前提是在pom.xml文件中已经配置。
将整个项目打包到target目录下,以后要使用就可以从target目录下复制出来。会重新执行生命周期前面的命令,如果前面的命令执行失败,则打包也失败。
install命令
命令作用:会执行上面所有的命令,先清除,再编译,再执行测试,再打包,安装到本地仓库中去。安装完毕后,在本地仓库中可以找到当前项目创建的war包信息
在使用任何一个操作,都会将该操作以上的所有操作都执行一次。