Maven
Maven简介
- Maven 是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)
- POM(Project Object Model) :项目对象模型
Maven的作用
Maven基础概念
仓库:
用于存储资源,包含各种jar包
-
仓库分类:
- 本地仓库:自己电脑上存储资源的仓库,连接远程仓库获取资源
- 远程仓库:非自己电脑上的仓库,为本地仓库提供资源
- 中央仓库:Maven团队维护,存储所有资源的仓库
- 私服:部门、公司范围内存储资源的仓库,从中央仓库获取资源
-
私服的作用:
-
保存具有版权的资源,包含购买或自主研发的jar。中央仓库中的jar都是开源的,不能存储具有版权的资源
-
在一定范围内高速共享资源,仅对内部开放,不对外共享
-
坐标:
JAVA开发者必须记住的网址:https://mvnrepository.com/
Maven中的坐标用于描述仓库中资源的位置
-
Maven坐标主要组成
groupId(组织ID):定义当前Maven项目隶属组织名称(通常是域名反写,例如:org.mybatis)
artifactId(项目ID):定义当前Maven项目名称(通常是模块名称,例如CRM、SMS)
version(版本号):定义当前项目版本号
packaging:定义该项目的打包方式
-
Maven坐标的作用
使用唯一标识,唯一性定位资源位置,通过该标识可以将资源的识别与下载交由机器完成
这是JUnit的坐标
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
仓库配置
本地仓库配置
设置本地仓库位置
如设置到:D:\Maven\repository
- 找到Maven安装目录->conf->打开settings.xml
- 找到/path/to/local/repo
- 复制到下面的空白处,将中间的/path/to/local/repo改为D:\Maven\repository
- 保存退出
远程仓库配置
- 找到Maven安装目录->conf->打开settings.xml
- 找到
- 默认连接到的是国外的maven中央仓库,但是速度很慢,我们连接到国内的阿里云镜像仓库,将该代码粘贴
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
全局setting与用户setting区别
- 全局setting定义了当前计算机中Maven 的公共配置
- 用户setting定义了当前用户的配置(满足用户个性需求)
手动创建Maven项目
Maven项目构建命令
mvn compile 编译maven项目
mvn clean 清理
mvn test 测试
mvn package 打包源程序。做了compile testCompile test等操作
mvn install 安装到本地目录
Maven项目结构
project->src->1.main(主程序)->1.java(源文件)2.resources(配置文件)
2.test(测试程序) ->1.java2.resources
测试程序也有自己的配置文件,测试程序用自己专属的配置文件,这些配置文件不能在主程序中出现,所以会在test中单独创建
问题:如图,在编译Maven项目时,出现报错。
理论上是由于没有指定JAVA版本导致的。
解决方案
pom.xml
文件中增加maven编译的java.version
jdk版本设置,以及maven.compiler.source
资源编译jdk版本设置和maven.compiler.target
资源构建jdk版本设置
我的jdk版本为11,在pom.xml中添加以下代码,保存退出
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
<java.version>11</java.version>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
再次编译,成功的效果图:
问题:如图,test时,出现报错
原因:代码写错了,主程序Demo类中返回的是"hello"+name(也就是maven)
而测试程序中写代码,Assert预计值为"hello maven",与真实值"hellomaven“不一致
解决:删去预计值中的空格,或者在Demo中返回"hello "+name
插件创建Maven项目
- 创建工程
mvn archetype:generate
-DgroupId={project-packaging}
-DartifactId={project-name}
-DarchetypeArtifactId=maven-archetype-quickstart
-DinteractiveMode=false
- 创建java工程
mvn archetype:generate -DgroupId=com.itheima -DartifactId=java-project -DarchetypeArtifactId=maven-archetype-quickstart -Dversion=0.0.1-snapshot -DinteractiveMode=false
- 创建web工程
mvn archetype:generate -DgroupId=com.itheima -DartifactId=web-project -DarchetypeArtifactId=maven-archetype-webapp -Dversion=0.0.1-snapshot -DinteractiveMode=false
IDEA中创建MAVEN
ctrl+alt+shift+s快捷键打开Project Structure
java工程
web工程
右键src,添加test文件,右键test文件,添加java和resources文件,右键main,添加java文件。
选中main->java,点击Sources,选中test->java,点击Tests
选中main->resources,点击Resources,选中test->resources,点击Test Resources
运行web需要使用插件【tomcat7】
Maven Repository: org.apache.tomcat.maven » tomcat7-maven-plugin » 2.1 (mvnrepository.com)
在网页中复制Maven里的依赖,删去部分
<dependency>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
</dependency>
在pom.xml中添加 粘贴上面复制的依赖
<build>
<!--设置插件-->
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
</plugin>
</plugins>
<finalName>web-01</finalName>
</build>
依赖
什么是依赖?
如果一个 Maven 构建所产生的构件(例如 Jar 文件)被其他项目引用,那么该构件就是其他项目的依赖
获取依赖坐标
绝大部分依赖的 Maven 坐标都能在 https://mvnrepository.com/ 中获取。
依赖声明
Maven 坐标是依赖的前提,所有 Maven 项目必须明确定义自己的坐标,只有这样,它们才可能成为其他项目的依赖。当 Maven 项目需要声明某一个依赖时,通常只需要在其 POM 中配置该依赖的坐标信息,Maven 会根据坐标自动将依赖下载到项目中。
<dependencies>
<dependency>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
</dependency>
</dependencies>
依赖传递
依赖传递冲突问题
总结:越靠近根,优先级越高。
在同个pom中,后配置的覆盖前配置的
可选依赖(隐藏传递过来的依赖)
对外隐藏当前所依赖的资源,让别人看不到
<optional>true</optional>
排除依赖(不用传递过来的依赖)
排除依赖是主动去断开依赖的资源,就是说我不需要你啦。被排除的资源无需指定版本。
<exclusions>
<exclusion>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
</exclusion>
</exclusions>
依赖范围
依赖的jar默认情况可以在任何地方使用,通过scope标签设定其作用范围