目录
1、maven的作用:
Maven 作为依赖管理工具,后期我们创建的项目会越来越复杂,会引入很多的jar包,我们手动引入加jar包的过程很繁琐,而且jar的来源千奇百怪,而使用maven的话可以帮助我们管理我们引入的jar包,使用这个工具的话就会很方便。maven是apache软件基金会组织维护的一款专门为Java项目提供依赖管理和构建的工具。
2、maven的下载与安装:
- 下载地址:
2.解压到本地:
这边的话,可以找一个专门的目录(没有中文名!!!),然后可以在同级目录下创建一个文件夹作为本地仓库。
3.修改配置文件D:\Maven\apache-maven-3.9.4\conf\settings.xml
指定本地仓库
刚刚创建的文件夹的目录
修改远程镜像仓库
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
一定要在mirrors标签里面!!!!
修改默认的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>
</properties>
</profile>
注意在profiles标签里面,如果默认的话是jdk1.5 ,我们现在设置的是jdk1.8
配置环境变量:
这里说一下,maven是依赖的jdk的,要想配置好,先要装jdk!!!
MAVEN_HOME
D:\Maven\apache-maven-3.9.4
结合自己下载的版本和存放的路径
配置Path:
%MAVEN_HOME%\bin
命令行下测试一下!mvn -v
3、maven仓库:
仓库:用于存储资源,包含各种jar包
仓库分类:
- 本地仓库:自己电脑上存储资源的仓库,连接远程仓库获取资源
- 远程仓库:非本机电脑上的仓库,为本地仓库提供资
-
中央仓库:Maven团队维护,存储所有资源的仓库。
-
私服:部门/公司范围内存储资源的仓库,从中央仓库获取资源
私服的作用:保存具有版权的资源,包含购买或自主研发的iar而中央仓库中的iar都是开源的,不能存储具有版权的资源一定范围内共享资源,仅对内部开放,不对外共享
4、maven的坐标:
这里说一下不是真的坐标,是我们在xml文件中引入依赖的一种确定方式!参数是 GroupId、ArtifactId、Version 用来指定现在使用jar包的坐标,使用唯一标识,唯一性定位资源位置,通过该标识可以将资源的识别与下载工作交由机器完成,举个例子!
<!-- https://mvnrepository.com/artifact/jakarta.xml.bind/jakarta.xml.bind-api -->
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>4.0.1</version>
</dependency>
通过这三个属性就可以确定要引入的jar包!
groupid是代表组织或者公司开发的某一个项目
artfactid代表项目下的某一模块
versionid代表的是版本号
引入jar包的话首先会在本地仓库找,如果没有会在我们配置的镜像的仓库找,如果我们配置的镜像的仓库也没有,回到官方的仓库找
<!--插件-->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<target>1.8</target><!--生成的字节码文件的版本-->
<source>17</source><!--编译的时候使用的-->
</configuration>
</plugin>
</plugins>
</build>
5、maven的依赖的性质:
依赖可以是jar包,可以是项目,依赖同时具有传递性,就比如说项目A中引入项目B,但是B里面又有很多的依赖,当A依赖B项目的时候,自然会引入B中的所有的依赖。通过传递过来的依赖可以叫做间接依赖。
依赖传递的冲突的问题:
那么怎么管理传递过程中的依赖呐!
可选依赖:
可选依赖是被传递的依赖可以选择自己依赖的资源进行隐藏,被隐藏后的资源在进行依赖传递的时候将不会被传递。
在引入的依赖的时候除啦基本的坐标之外,添加一个<optional>true</optional>标签的设置就可以把依赖进行隐藏!
那么问题来啦!不被隐藏的依赖就必须被传递吗?当然不是!依赖其他项目的项目在依赖传递的时候可以选择排除依赖。
排除依赖:
<dependency>
<groupId>com.itheima</groupId>
<artifactId>maven-projectB</artifactId>
<version>1.0-SNAPSHOT</version>
<!--排除依赖, 主动断开依赖的资源-->
<exclusions>
<exclusion>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
</exclusions>
</dependency>
虽然两个的作用都是排除依赖但是使用的的对象是不一样的,可选依赖是被依赖的项目。而排除依赖是依赖的项目。
6、依赖的范围:
依赖的jar包默认的是在任何地方都可以使用的。也可以通过<scope> ..... </scope>来设置jar包的作用范围:
主程序范围有效(main文件夹范围内)
测试程序范围有效(test文件夹范围内)
是否参与打包运行(package指令的范围内)
<dependency>
<groupId>com.itheima</groupId>
<artifactId>maven-projectB</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
补充的内容:使用maven创建web项目的时候我们会使用serlvet这个jar包,另外先说一下就是我们在创建的web项目的时候,如果是本地部署我们一般是选择tomcat服务器,如果是基于maven创建的项目可以是使用tomcat的插件。之间没有接触所以没有说这个点,后期写项目的话使用到就写出来,防止自己忘记:
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!-- 设置编码格式 -->
<uriEncoding>UTF-8</uriEncoding>
<!-- 控制 tomcat 端口号 -->
<port>8080</port>
<!-- 项目发布到 tomcat 后的名称 -->
<!-- 如果写 /,相当于项目发布后的名称为 ROOT -->
<!-- 如果写 /abc,相当于项目发布后的名称为 abc -->
<path></path>
</configuration>
</plugin>
</plugins>
</build>
为了后面好操作也可以编辑配置,添加这个插件到配置文件
然后我们在讲一下这个依赖范围的事情
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<!--如果不加这个依赖范围的话在后面运行访问servlert的时候会报错-->
<scope>provided</scope>
</dependency>
为什么加这个,因为web服务器中有这jar包如果在打包,两个jar包冲突就会报错!
compile:编译范围,指 A 在编译时依赖 B,此范围为默认依赖范围。编译范围的依赖会用在 编译、测试、运行,由于运行时需要所以编译范围的依赖会被打包。
provided:provided 依赖只有在当 JDK 或者一个容器已提供该依赖之后才使用, provided 依赖在编译和测试时需要,在运行时不需要,比如:servlet api 被 tomcat 容器提供。
runtime:runtime 依赖在运行和测试系统的时候需要,但在编译的时候不需要。比如:jdbc 的驱动包。由于运行时需要所以 runtime 范围的依赖会被打包。
test:test 范围依赖 在编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用, 比如:junit。由于运行时不需要所以 test范围依赖不会被打包。
system:system 范围依赖与 provided 类似,但是你必须显式的提供一个对于本地系统中 JAR 文件的路径,需要指定 systemPath 磁盘路径,system依赖不推荐使用。
scpoe的取值以及作用的范围:
scope值 | 主程序 | 测试程序 | 打包(运行) | 范例 |
---|---|---|---|---|
compile(默认) | Y | Y | Y | log4j |
test | - | Y | - | junit |
provided | Y | Y | - | servlet-api |
runtime | - | Y | Y | jdbc驱动 |
7、maven的生命周期:
maven中有三套独立的生命周期:
-
clean:清理工作
-
clean:移除上一次构建生成的文件
-
-
default:核心工作,如:编译,测试,打包,安装,部署等。(太多了)
-
compile:编译项目的源代码
-
test:使用合适的单元测试框架运行测试(junit)
-
package:将编译后的文件打包,比如jar,war等
-
install:安装项目到本地仓库
-
-
site:生成报告,发布站点等。
后面的阶段要依赖前面的阶段,也就是后面的的阶段要运行的话,只要是同一个生命周期的话,前面的所有的阶段都会运行。