maven使用
maven:是 Apache 下的一个纯 Java 开发的开源项目
用途:项目管理工具
目录
优势
管理 jar包;
编译代码,自动运行单元测试,打包,部署项目,生成 Web 站点;
解决了使用不同软件进行开发,文件目录不同的问题,改善了开发测试以及配置文件混乱,不易维护的问题。
安装
- 下载
Maven官网下载地址 - 安装
Maven使用java语言开发的,解压即可运行
注意:maven依赖 JAVA_HOME - 目录
bin:存放了 maven 的命令
boot:存放了一些 maven 本身的引导程序,如类加载器等
conf:存放了 maven 的一些配置文件,如 setting.xml 文件
lib:存放了 maven 本身运行所需的一些 jar 包 - 环境变量
MAVEN_HOME: maven安装目录
path: %MAVEN_HOME%\bin - 配置完毕了
mvn --version
核心功能
依赖管理
本地仓库
项目通过jar坐标,先从本地仓库找对应jar包,如果找不到会从远程仓库(互联网)去下载 jar
包,保存在本地仓库(在程序员的电脑上),第二次不需要从远程仓库去下载。
1.1本地仓库配置
将资料中的 repository.zip 解压到非中文及特殊符号目录下;
修改 maven的安装目录/conf/settings.xml 文件的标签
<localRepository>本地仓库地址</localRepository>
远程仓库
2.1 中央仓库
由专业团队(maven团队)统一维护。
中央仓库的地址:http://repo1.maven.org/maven2/
2.2 私服
架设在公司局域网内,提供给内部的人员使用。
2.3 第三方仓库
中央仓库只有一个国内使用非常慢,我们可以更换为:阿里云镜像
2.4 远程仓库设置
修改 maven 根目录下的 conf 文件夹中的 setting.xml 文件,在 mirrors 节点上,添加内容如下:
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
引入jar包的方式
项目构建
maven项目目录:
* java项目
java工程名(项目名)
|-- src目录
|-- main目录(主干代码)
|-- java目录(java代码)
|-- resources目录(配置文件)
|-- test目录(测试代码)
|-- java目录(java代码)
|-- resources目录(配置文件)
|-- pom.xml(maven工程核心配置文件)
|-- target目录(存放编译后的class文件.....)
* web项目【重点】
web工程名(项目名)
|-- src目录
|-- main目录(主干代码)
|-- java目录(java代码)
|-- resources目录(配置文件)
|-- webapp目录(页面资源)
|-- WEB-INF
|-- web.xml(web工程核心配置文件)
|-- index.jsp
|-- css、js、img..
|-- test目录(测试代码)
|-- java目录(java代码)
|-- resources目录(配置文件)
|-- pom.xml(maven工程核心配置文件)
|-- target目录(存放编译后的class文件.....)
maven指令
通过一系列的 maven 命令,来对我们的工程进行清理、编译、测试、打包(jar包或war包,打包成什么需要在pom.xml中设置,默认打包成jar包)、安装、部署。
idea创建maven工程
- IDEA配置本地Maven环境(全局…)
- 创建java项目
定maven环境的jdk版本和字符集
<build>
<plugins>
<!-- 设置编译版本为1.8 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
如何导入依赖jar包
maven的搜索仓库
- 创建web项目
idea创建web工程,需要我们安装一个插件:jbljavatoweb
- 发布web项目
① idea使用外置tomcat运行【重点】
② idea使用maven内置tomcat插件【了解】- Tomcat插件最新为Tomcat7,没有解决get请求的中文乱码问题;
- 需要配置pom.xml
<build>
<plugins>
<!-- 设置编译版本为1.8 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port>
<path>/</path>
<uriEncoding>utf-8</uriEncoding>
</configuration>
</plugin>
</plugins>
</build>
- 依赖范围
* compile
默认依赖范围,作用域在编译、测试、运行时都有效。比如mybatis
* test
作用域在测试时有效。编译和运行时不需要,比如:Junit。
* provided
作用域在编译、测试时有效。运行时不需要,比如: servlet api 被 tomcat 容器提供。
* runtime
作用域在测试、运行时有效。编译时不需要,比如:jdbc的驱动包。
maven的依赖传递
依赖传递与依赖冲突
*依赖传递
eg:web项目直接依赖了spring-webmvc,而spring-webmvc依赖了spingaop、spring-beans等。最终的结果就是在我们的web项目中间接依赖了spring-aop、spring-beans等。
- 依赖冲突
eg:spring-webmvc 依赖 spirng-beans-5.1.5,spring-aop 依赖 springbeans-5.1.6,但是发现 spirng-beans-5.1.5 加入到了工程中,而我们希望 spring-beans-5.1.6 加入工程。这就造成了依赖冲突。 - 解决依赖冲突的方法
- maven提供的:
1.1 第一声明者优先
在 pom 文件中定义依赖,以先声明的依赖为准。其实就是根据坐标导入的顺序来确定最终使用哪个传
递过来的依赖。
1.2 路径近者优先
直接依赖大于依赖传递 - 排除依赖
pom中使用exclusions标签将传递过来的依赖排除出去。
- 版本锁定
采用直接锁定版本的方法确定依赖jar包的版本,版本锁定后则不考虑依赖的声明顺序或依赖的路径,以
锁定的版本为准添加到工程中,此方法在企业开发中经常使用。
版本锁定的使用方式:
第一步:在dependencyManagement标签中锁定依赖的版本
第二步:在dependencies标签中声明需要导入的maven坐标
①在dependencyManagement标签中锁定依赖的版本
②在dependencies标签中声明需要导入的maven坐标
- 使用properties标签
<properties>
<spring.version>5.1.5.RELEASE</spring.version>
<springmvc.version>5.1.5.RELEASE</springmvc.version>
<mybatis.version>3.5.1</mybatis.version>
</properties>
<!--锁定jar版本-->
<dependencyManagement>
<dependencies>
<!-- Mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!-- springMVC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${springmvc.version}</version>
</dependency>
<!-- spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
maven聚合工程
分模块构建maven工程
- 第一种:按照业务模块进行拆分,每个模块拆分成一个maven工程,例如将一个项目分为用户模块,订
单模块,购物车模块等,每个模块对应就是一个maven工程 - 第二种:按照层进行拆分,例如持久层、业务层、表现层等,每个层对应就是一个maven工程
不管上面那种拆分方式,通常都会提供一个父工程,将一些公共的代码和配置提取到父工程中进行统一
管理和配置。
maven工程的继承
maven工程之间也可以继承,子工程继承父工程后,就可以使用在父工程中引入的依赖。继承的
目的是为了消除重复代码。
maven工程的聚合
在maven工程的pom.xml文件中可以使用标签将其他maven工程聚合到一起,聚合的目的是为了进行
统一操作。
例如拆分后的maven工程有多个,如果要进行打包,就需要针对每个工程分别执行打包命令,操作起来
非常繁琐。这时就可以使用标签将这些工程统一聚合到maven父工程中,需要打包的时候,只需要在此
工程中执行一次打包命令,其下被聚合的工程就都会被打包了。
分模块构建maven工程具体演示
工程整体结构如下:
1)maven_parent为父工程,其余工程为子工程,都继承父工程maven_parent
2)maven_parent工程将其子工程都进行了聚合
3)子工程之间存在依赖关系:
maven_dao依赖maven_domain
maven_service依赖maven_dao
maven_web依赖maven_service