Maven
maven - 内行,专家
POM:Project Object Model 项目对象模型,把整个项目抽象成一个对象,按面向对象的思想去处理项目中所有的元素,方便对项目的管理。
作用:
- 项目构建:提供标准的、跨平台的自动化项目构建方式
- 依赖管理:方便快捷方的管理项目依赖的资源(jar包),避免版本冲突
- 统一开发结构:提供标准的、统一的项目结构
1. 安装和配置
Java语言编写
解压
配置环境变量(不使用DOS窗口的话,可不用配置)
MAVEN_HOME=path\apache-maven-3.3.9
Path=%MAVEN_HOME%\bin
Maven目录介绍
目录名 | 功能说明 |
---|---|
bin | 可执行文件所在的目录,其中mvn.cmd是它核心执行文件 |
boot | 第三方类加载器 |
conf | maven的配置文件所在的目录,其中settings.xml是maven的核心配置文件 |
lib | 因为maven是使用java写的,这是它的依赖jar包 |
仓库
本地仓库
私服:保存具有版权的资源,包含购买或自主研发的jar,一定范围内共享资源
中央仓库:maven团队维护,其中所有jar都是开源的,不能存储具有版权的资源
坐标
- 描述资源在仓库中的唯一标识
- 创建每个项目或模块都需要指定一个坐标,这个坐标是指当前项目放在仓库中坐标,以后这个项目或模块可以被别人引用。
- 每个jar包放在仓库中都有一个唯一的坐标,坐标是jar包唯一标识,不会重复。通过这个坐标找到每个jar包。
groupId 通常是域名反写,表隶属组织
artifactId 项目或模块名称
version 版本
配置文件
1. 修改本地仓库
<localRepository>f:\develop\repository</localRepository>
要求本地仓库同级目录有setting.xml文件,作为个人设置,会覆盖全局设置
2. 设置中央仓库的镜像
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
3. JDK的全局配置
<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>
IDEA中的配置
Maven home directory 设置maven主目录
User setting file 配置文件路径
Local repository 配置本地仓库位置
Build, Execution, Deployment>Maven>Runner VM Options:
-DarchetypeCatalog=internal
所有资源先从本地仓库查找,如果本地仓库中没有才去互联网找。
-Dfile.encoding=GBK 或者 -Dfile.encoding=UTF-8
控制台乱码
如果在pom.xml中输入的jar包没有提示,可以手动更新本地仓库的索引
Build, Execution, Deployment -> Maven -> Repositories
pom.xml
<!-- 模型版本 -->
<modelVersion>4.0.0</modelVersion>
<groupId>javaee</groupId>
<artifactId>day29_maven</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 开发中版本 RELEASE表示完成版 -->
<packaging>war</packaging>
<!--
指定打包的类型:
如果是java工程:打包成jar
如果是web工程: 打包成war
-->
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</project>
https://mvnrepository.com 在线查找jar包的坐标
依赖传递
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4iru3I8G-1593828012321)(F:\develop\Z_JavaEE\level_2_Maven.assets\1593826825546.png)]
可选依赖:对外隐藏间接依赖
<dependency>添加字标签<optinal>true</optional>
排除依赖:主动断开依赖的资源,无论版本
<exclusions>
<exclusion>
<groupId></groupId>
<artifactId></artifactId>
<exclusion>
<exclusions>
2. Maven的生命周期
这些命令可以在工作目录(pom.xml)同级目录下执行 如:mvn clean
clean 用于清除target目录,类似于清除缓存
target目录是项目执行期间自动生成的,类似于out目录
test 执行test目录下所有的测试类和测试方法
compile 编译main目录下所的Java源代码,生成字节码文件。不会去编译test目录下东西
package 用于把项目打包,如果是java工程,打包成jar。如果是web工程,打包成war,在pom.xml文件中已经配置。将整个项目打包到target目录下,以后要使用就可以从target目录下复制出来。会重新执行生命周期前面的命令,如果前面的命令执行失败,则打包也失败。
install 会执行上面所有的命令,先清除,再编译,再执行测试,再打包,最后安装到本地仓库中去
插件的使用
Maven只提供了基本的项目处理能力和管理,它的功能主要是通过其它插件来实现的。就好比jQuery和jQuery插件的关系。每个Maven插件可以完成一些特定的功能。
tomcat7插件
<build>
<plugins>
<plugin>
<!--插件在仓库中的坐标-->
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<!--插件配置dependencies-->
<configuration>
<port>8081</port>
<!--项目的访问地址-->
<path>/test</path>
<uriEncoding>UTF-8</uriEncoding>
<!--服务器名-->
<server>tomcat7</server>
</configuration>
</plugin>
</plugins>
</build>
3. jar包的依赖范围
Maven在执行过程中有三种类路径,在运行时使用对应路径下的包来执行。
编译类路径(compile)
测试类路径(test)
运行时类路径(package)
依赖范围:
compile 默认,所有类路径都可以使用
provided 不参与打包(Servlet, Jsp)避免冲突
test 仅测试时使用(Junit)
runtime 编译期不使用(Mysql的驱动)