文章目录
maven
项目管理工具
下载。配置环境变量
目录结构:
bin目录:存放执行文件,是一些命令,IDEA直接集成Maven
config目录:Maven核心配置文件 settings.xml
lib、boot目录:放启动用的jar包
Maven仓库
Maven仓库是基于 简单文件系统存储的,集中化管理Java API资源(构件)的 一个 服务。
仓库中的任何一个构件(jar包的集合)都有其唯一的坐标
,根据这个坐标可以定义其在仓库中的唯一存储路径。
Maven可以在某个位置统一存储所有的Maven项目共享的构件,这个统一的位置就是仓库(仓库分为:远程仓库、本地仓库);项目构件完毕后生成的构件也可以安装或者部署到仓库中,供其他项目使用。比如说:B项目要引用A项目,直接在B项目的pom.xml添加A项目的坐标,通过这个坐标就可以访问到A项目。
在项目配置了 坐标
之后,就会去 远程仓库
里找坐标对应的jar包,然后下载到本地仓库
,项目会读取本地仓库对应的jar包使用
远程仓库
不在本机中的一切仓库,都是远程仓库:分为中央仓库和本地私服仓库。
远程仓库指通过各种协议如 file:// 和 http:// 访问的仓库。这些仓库可以是第三方搭建的真实的远程仓库,用来提供构件的下载。 这些“远程”也可以是公司建立在文件或者HTTP服务器上的内部仓库(公司的私服,在局域网搭建的Maven仓库),用来 开发团队间 共享私有构件和管理。
默认的远程仓库是Apache提供的中央仓库
本地仓库
-
存储远程仓库下载jar
-
自己项目的jar(尚未发布的临时构件)也会存储
仓库配置
config目录 settings.xml
- 配置本地仓库的位置
<!--写自己的!-->
<localRepository>E:\javaMvn</localRepository>
- 配置阿里镜像
<!--<mirrors>标签里配置:-->
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
仓库优先级别
JDK的配置
当idea中有多个jdk时,需要值定 编译和运行的jdk
<!--<profiles>标签里配置:-->
<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>
到此,settings.xml中:配置了三个信息:
- 本地仓库
- 镜像仓库
- JDK
Maven工程
可以使用 <packaging>pom</packaging>
来指定工程类型。
- POM工程
POM工程是逻辑工程,用在 父级工程 或 聚合工程中。用来做jar包的版本控制。
父工程:父工程定义通用jar包,设置好版本,子工程继承父工程即可使用父工程通用jar包。
聚合工程:一个父工程 管理N个具体的工程。
- JAR工程
将会打包成jar,用作jar包使用。即常见的本地工程 ——>Java Project。
- WAR工程
将会打成war,发布在服务器上的工程。
Idea中创建Maven工程
标准的maven工程目录结构
--MavenDemo项目名
--.idea 项目的配置,自动生成,无需关注
--src
--mian 实际开发内容
--java 写 包 和 java代码,此文件默认只编译.java文件
--resource 所有配置文件。最终编译把配置文件放入到classpath中
--test 测试包,可以写测试的内容,新建resource测试包、mapper测试包 等
--java 写测试类
--mapper测试包 等等
--target 存放 编译后的内容(.class文件)
pom.xml 整个maven项目所有配置内容
新建maven项目可以执行 maven下的install生成target目录
POM模式 Maven工程关系
Maven工具基于POM(Project Object Model 项目对象模型)模式实现。Maven中每个项目相当于一个对象,项目间的关系:依赖、继承、聚合。Maven项目可以更加方便的实现导jar包、拆分项目等效果。
依赖
【1】
A工程运行、开发过程中需要B工程提供支持:A工程依赖B工程。
这种情况下,需要在A项目的pom.xml中增加 配置B的坐标。
通俗理解:导jar包。
B工程可以是 自己的项目打包后的jar包,也可以是 中央仓库的jar包。
【2】如何注入依赖?
在pom.xml文件 配置坐标。dependencies标签可以配置N个dependence元素以声明依赖。每个依赖dependence标签都应该包含一下元素:groupId
、artifactId
、version
(依赖的基本坐标),对于任何一个依赖来说,基本坐标是最重要的,Maven根据坐标才能找到需要的依赖。
【3】好处:
省去手动添加jar包的操作。
可以帮我们解决jar包冲突问题。
依赖的传递性
Since Maven2.0。假设你的项目依赖于一个库A,而这个库又依赖于其他库,你不必自己去找出所有这些依赖,你只需添加直接依赖的库A,Maven会隐式的把这些间接依赖的库也加入到你的项目中。这个特性是靠解析从远程仓库中获取的 依赖库的项目文件 实现的。一般的,这些项目的所有依赖都会加入到项目中,或者从父项目继承,或者通过传递性依赖。
如果A依赖了B,那么C依赖A时,会自动把A和B都导入进来:
案例【1】:
项目A中导入
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
即项目A依赖了mybatis-plus的内容。
案例【2】:
将项目A打包为jar包——>重新打包(因为可能做了修改)——>IDEA maven Lifecycle clean 、install
让项目B依赖项目A。
在项目B的pom.xml里导入
<!--将A的坐标注入-->
<dependencies>
<dependency>
<artifactId>study</artifactId>
<groupId>A</groupId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
会发现项目B不仅导入了项目A,而且把项目A依赖的mybatis-plus的内容也导入了。
两个原则
【1】第一原则:最短路径优先
项目依赖关系树中 路径最短的版本会被使用。
例如:有以下依赖关系: A—依赖于—>B——>C——>D(2.0版本) 和 A——>E——>D(1.0版本)。那么D(1.0版本)会被使用。因为A通过E到D的路径最短。
【2】第二原则:最先声明
依赖路径长度是一样的时候,第一原则不能解决问题。最先声明原则:在路径长度相等的情况下,在pom中依赖声明的顺序决定了谁会被解析使用,先声明的会被使用。
例如:有以下依赖关系: A—依赖于—>B——>D(2.0版本) 和 A——>E——>D(1.0版本)。依赖关系树中 路径都是2。那么D(2.0版本)会被使用。
排除依赖
A项目依赖了mybatis-plus,让项目B依赖项目A,但是B不需要mybatis-plus的内容,使用、标签进行排除依赖
<dependencies>
<dependency>
<artifactId>study</artifactId>
<groupId>A</groupId>
<version>1.0-SNAPSHOT</version>
<!--排除依赖,可以排除多个-->
<exclusions>
<exclusion>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
依赖范围
依赖范围决定了依赖的坐标 在什么情况下有效,什么情况下无效。标签。
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.5</version>
<scope>compile</scope>
</dependency>
compile
默认范围。范围:表示该依赖在 **编译和运行**时都生效。
provided
已提供 依赖范围。范围:编译和测试 时生效。
典型例子:servlet-api,编译和测试项目的时候需要该依赖,但是在运行项目时,由于Tomcat容器已经提供,就不需要Maven重复地引入一遍,不然会出错。
runtime
范围:编译时不需要生效,只在 运行 时生效。
典型例子:JDBC驱动实现,项目主代码的编译只需要JDK提供的JDBC接口,只有在测试或者运行项目时才需要实现上述接口的具体JDBC驱动。
system
必须通过 标签 显示指定一个 本地系统路径的Jar。范围:在 各个阶段 都生效。
当不想使用本地仓库的,不想使用远程仓库的,不想使用镜像库的依赖时,目标依赖在本机的某个位置。
test
范围:在 编译测试代码 和 运行**测试**代码 时生效。
典型例子:Junit 在测试时才需要,导出项目时没必要把junit的东西导出。
import
范围:只能在 的 生效。
指定的POM工程(逻辑工程)必须使用部分的依赖。
案例:
定义一个父工程(POM工程):
定义一个子工程:
把父工程打打成一个jar包 ——>IDEA maven Lifecycle install
继承
本质上:就是POM的继承。
如果A工程继承B工程,则代表A工程默认依赖 B工程依赖的所有资源,且可以应用B工程中定义的所有资源信息。
被继承的(B)工程只能是POM工程。
聚合
当我们开发的工程拥有2个以上模块的时候,每一个模块都是一个独立的功能集合。 比如某大学系统中有搜索平台、学习平台、考试品台等。开发的时候每个平台都可以独立编译、测试、运行。这个时候我们就需要一个聚合工程。
聚合时多个项目的本质还是一个项目。这些项目被一个大的父项目包含,且父项目类型为POM类型,同时在父项目的pom.xml中出现****表示包含的所有子模块。
案例:
父工程为POM工程:
具体模块:
常见插件
编译器插件
在pom.xml中添加:
<!-- 配置maven的编译插件 -->
<build>
<plugins>
<!-- JDK编译插件 -->
<plugin>
<!-- 插件坐标 -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<!-- 源代码使用JDK版本 -->
<source>11</source>
<!-- 源代码编译为class文件的版本,要保持跟上面版本一直 -->
<target>11</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
资源拷贝插件
Maven在打包的时候默认只将src/main/resource里的配置文件(非.java文件)打包编译到 target/classes里。
配置文件一般放在src/main/resource 下
打包后的配置文件就会在target/classes下:
把非resource的配置文件也打包到classes下:
需要在pom.xml配置:
<build>
<resources>
<!-- 把 非resources下 的配置文件打包到classes -->
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<!-- 把 resources下 的配置文件打包到classes -->
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
</build>
Tomcat插件
如果我们创建war项目,必然要部署在服务器上,方式:
【1】、部署在远程服务器上
【2】、将IDEA和外部tomcat产生关联,然后将项目部署在tomcat上
本节的方式:maven提供的tomcat插件。
创建一个war项目(web项目):
在pom.xml添加tomcat插件:
<build>
<plugins>
<!-- tomcat插件控制 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!--端口控制-->
<port>888</port>
<!--项目路径控制意味着http://localhost:888/abc-->
<path>/abc</path>
<!--编码-->
<uriEncoding>UTF-8</uriEncoding>
</configuration>
</plugin>
</plugins>
</build>
启动命令:
访问http://localhost:888/abc
Maven常见命令
install
本地安装。包含 编译,打包,安装到本地仓库。
编译 命令: -javac
打包 命令: -jar ,将java代码打包为jar文件
安装到本地仓库 将打包的jar文件,保存到本地仓库目录中
clean
清除已编译信息。
删除工程中的target目录。
compile
只编译。 命令: -javac
package
打包。包含编译,打包。
install 和 package 的区别:
package 命令完成了项目 编译、单元测试、打包 功能,但没有把打包好的可执行的jar包(war包等)部署到本地maven仓库和maven私服仓库。
</plugins>
```
启动命令:
[外链图片转存中…(img-Mq4beDWL-1618734819619)]
访问http://localhost:888/abc
Maven常见命令
[外链图片转存中…(img-rSax1rFe-1618734819621)]
install
本地安装。包含 编译,打包,安装到本地仓库。
编译 命令: -javac
打包 命令: -jar ,将java代码打包为jar文件
安装到本地仓库 将打包的jar文件,保存到本地仓库目录中
clean
清除已编译信息。
删除工程中的target目录。
compile
只编译。 命令: -javac
package
打包。包含编译,打包。
install 和 package 的区别:
package 命令完成了项目 编译、单元测试、打包 功能,但没有把打包好的可执行的jar包(war包等)部署到本地maven仓库和maven私服仓库。
install 命令完成了项目 编译、单元测试、打包 功能,同时把打包好的可执行的jar包(war包等)部署到本地maven仓库,但没有部署到远程maven私服仓库(可以用deploy命令)。