Maven
一、 引言
项目中jar包资源越来越多,jar包的管理越来越繁琐。
1> 要为每个项目手动导入所需的jar,需要搜集全部jar -- 繁琐
2> 项目中的jar如果需要版本升级,就需要再重新搜集jar -- 复杂
3> 相同的jar在不同的项目中保存了多份 -- 存储冗余,散乱
java项目需要一个统一的便捷的管理方案。
二、 介绍
Maven这个单词来自于意第绪语(犹太语),意为知识的积累.
Maven是一个基于项目对象模型(POM)的概念的纯java开发的开源的项目管理工具。主要用来管
理java项目,进行依赖管理(jar包依赖管理)和项目构建(项目编译、打包、测试、部署)。此外还能
分块开发,提高开发效率。
项目构建就是将我们工程中的Java源文件,框架的配置文件,jsp,HTML,css,js,图片等静态
资源作为原材料,去组织生产出一个可以运行的项目的过程。之前都是idea工具帮助我们干这些
事情,现在看看maven该如何做这些事情。
三、 Maven安装
3.1 下载maven
下载maven
http://us.mirrors.quenda.co/apache/maven/maven-3/3.5.4/binaries/
3.2 Maven安装
3.2.1 解压
注意: 解压文件尽量不要放在含有中文或者特殊字符的目录下。
解压后,有如下目录:
`bin:含有mvn运行的脚本`
`boot:含有plexus-classworlds类加载器框架,Maven 使用该框架加载自己的类库。`
`conf:含有settings.xml配置文件`
`lib:含有Maven运行时所需要的java类库`
3.2.2 环境变量
maven依赖java环境,所以要确保java环境已配置好 (maven-3.3+ 需要jdk7+)
maven本身有2个环境变量要配置:
`MAVEN_HOME = maven的安装目录`
`PATH = maven的安装目录下的bin目录`
四、 maven配置
4.1 本地仓库
maven的conf目录中有 settings.xml ,是maven的配置文件,做如下配置:
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd">
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
<!-- 选择一个磁盘目录,作为本地仓库 -->
<localRepository>D:\Program Files\maven\myrepository</localRepository>
4.2 JDK配置
在 <profiles> 标签中 增加 一个 <profile> 标签,限定maven项目默认的jdk版本.
内容如下:
<profiles>
<!-- 在已有的profiles标签中添加profile标签 -->
<profile>
<id>myjdk</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>
</properties>
</profile>
</profiles>
<!-- 让增加的 profile生效 -->
<activeProfiles>
<activeProfile>myjdk</activeProfile>
</activeProfiles>
4.3 Maven的常用命令
mvn compile:编译
mvn clean:清理
mvn test:测试(要遵循测试类命名规范)
mvn package:打包(打成jar包)
mvn install:安装(把打成的jar包放到本地仓库这种)
mvn -version 查看maven版本号
五、 仓库
存储依赖的地方。
仓库中不仅存放依赖,而且每个依赖都有唯一标识(坐标),供java项目索取。
5.1 仓库分类
仓库分类如下:
当需要依赖时,会从仓库中取查找,优先顺序为:
本地仓库 > 私服(如果配置了的话) > 公共仓库(如果配置了的话) > 中央仓库
5.2 本地仓库
即在 settings.xml 中配置的目录。
使用过了的依赖都会自动存储在本地仓库中,后续可以复用。
5.3 远程仓库
5.3.1 中央仓库
Maven 中央仓库是由 Maven 社区提供的仓库,不用任何配置,maven中内置了中央仓库的地址。
其中包含了绝大多数流行的开源Java构件。
https://mvnrepository.com/ 可以搜索需要的依赖的相关信息(仓库搜索服务) (重点)
http://repo.maven.apache.org/maven2/ 中央仓库地址
5.3.2 公共仓库 (重点)
除中央仓库之外,还有其他远程仓库。
比如aliyun仓库( http://maven.aliyun.com/nexus/content/groups/public/ )
中央仓库在国外,下载依赖速度过慢,所以都会配置一个国内的公共仓库替代中央仓库。
<!--setting.xml中添加如下配置-->
<mirrors>
<mirror>
<id>aliyun</id>
<!-- 中心仓库的 mirror(镜像) -->
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<!-- aliyun仓库地址 以后所有要指向中心仓库的请求,都会指向aliyun仓库-->
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
5.3.3 私服(了解)
公司范围内共享的仓库,不对外开放。
可以通过 nexus来创建、管理一个私服。
六、 idea-maven
6.1 在idea中关联maven
在idea中关联本地安装的maven,后续就可以通过idea使用maven,管理项目。
6.2 创建Maven项目
6.2.1 新建项目
新建项目,要选择 “maven” 选项
如下选项
设置项目名
6.2.2 指定项目名
6.2.3 项目位置
项目位置如下
6.2.4 项目结构
1> src/main/java 存放源代码,建包,放项目中代码(service,dao,User,....)
2> src/main/resources 书写配置文件,项目中的配置文件(jdbc.properties)
3> src/test/java 书写测试代码,项目中测试案例代码
4> src/test/resources 书写测试案例相关配置文件
5> 项目根/pom.xml (project object model) maven项目核心文件,其中定义项目构建方式,声明依
赖等
注意:项目中的建包,建类,执行,都和普通项目无差异
6.2.5 项目类型
根据项目类型,在 pom.xml 中做出对应配置,添加配置: <packaging>war/jar</packaging>
<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.qf</groupId>
<artifactId>test01</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 打包方式,如果是java项目则用 jar,
如果是web项目则用war -->
<!--<packaging>war</packaging>-->
<packaging>jar</packaging>
</project>
6.3 导入依赖jar
建好项目后,需要导入需要的jar,要通过【坐标】
1. 每个构件都有自己的坐标(标识) = groupId + artifactId + version = 项目标识 + 项目名 + 版本号
2. 在maven项目中只需要配置坐标,maven便会自动加载对应依赖。删除坐标则会移除依赖
6.3.1 查找依赖
依赖查找服务: https://mvnrepository.com/ ,获得依赖的坐标,在maven项目中导入。
查找依赖坐标
6.3.2 导入依赖
在项目的pom.xml文件添加依赖
6.3.3 同步依赖
引入坐标后,同步依赖,确认导入。
窗口右下角弹窗,刷新依赖,使新加的配置被maven加载
6.4 创建web项目
6.4.1 打包方式
pom.xml中设置 <packaging>war</packaging>
web项目打包方式为: war
6.4.2 web依赖
导入 JSP 和 Servlet 和 JSTL 依赖,使项目具有web编译环境
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
...
<packaging>war</packaging>
<!-- 导入JSP 和 Servlet 和 JSTL 依赖 -->
<dependencies>
<dependency>
<!-- jstl 支持 -->
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<!-- servlet编译环境 -->
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<!-- jsp编译环境 -->
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
6.4.3 webapp目录
按照maven规范,新建web项目特有目录
新建如下目录和文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- 这是一个空白的web.xml文件模板 -->
</web-app>
6.4.4 定义Servlet和Jsp
6.5 部署web项目
6.5.1 新增Tomcat
新增Tomcat
6.5.2 部署web项目
部署web项目
war: 这是先打成war包,再发布,正常的发布就是用的这种。
工程target目录下会生成war包, 并且解压后的war包会被部署到tomcat的webapp 目录下。
注意:如果application-context 设置为 /, tomcat目录下不会有解压后的war文件,只有指定文件
目录,才会生成文件夹,这个文件夹作为项目的根目录
war exploded : 模式是直接把文件夹、jsp页面 、classes等等移到Tomcat 部署文件夹里面,进行
加载部署。因此这种方式支持热部署,一般在开发的时候也是用这种方式。
启动Tomcat
6.5.3 启动Tomcat
6.6 利用Maven插件运行Web项目
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<!-- 热部署 -->
<contextReloadable>true</contextReloadable>
<port>8080</port> <!-- 端口号 -->
<path>/</path> <!-- 发布的项目路径 -->
</configuration>
</plugin>
</plugins>
</build>
6.7 依赖生命周期
项目中导入的依赖可以做生命周期的管理
maven有生命周期如下:
compile(默认值):缺省值,适用于所有阶段(测试,编译,运行,打包),会随着项目一起发
布(被打包)
provided:类似compile,期望JDK、容器或使用者会提供这个依赖。如servlet-api.jar
参与测试,编译,不会被打包
runtime:只在运行时使用,如 mysql-connector-java驱动jar,适用运行和测试阶段,会被一
起发布
test:只在测试时使用,用于编译和运行测试代码,如 junit.jar,不会随项目发布
system:类似provided,但Maven不会在Repository中查找它,要在本地磁盘目录中查找
参与编译,测试,打包,运行。
七、 maven指令
7.1 命令行
通过idea打开 cmd ,然后执行maven指令
7.2 maven面板
idea中有maven面板,其中可以快速执行maven指令
maven面板
八、细节注意
8.1 mvn test 不执行单元测试
mvn test 使用的是surefire插件,它按照指定格式的类名来查找匹配的测试类
默认包含的测试类:
*/Test.java
*/Test.java
*/TestCase.java