这学期搞主攻算法去了,web的知识都快忘了。开始复习学习了。
文章目录
- maven介绍
- 功能介绍
- maven安装
- jar包搜索
- 仓库
- pom文件
- 项目介绍
- 父工程
- 依赖管理
- 属性控制
- 可选依赖
- 构建
- 依赖管理
- 依赖的传递
- 排除依赖
- 可选依赖
- maven生命周期
- 分模块开发
- 模块聚合
- 继承
- 属性管理
- 资源配置
- 多环境
maven介绍
功能介绍
maven是一个软件项目管理及自动构建工具。
作用:
-
依赖管理
方便的解决项目依赖,不用在去官方一个个的下载jar包了
只需要修改配置信息就会自动导入。 -
统一的项目结构
项目结构都是一样的,统一结构。
-
项目构建
构建流程一样
maven安装
写过了windows下maven更新/安装
jar包搜索
- 在idea的pom文件的dependency的artifactId输入需要的jar包名字,可以自动搜索。
- 不过上面这种方法第一次使用的jar一般是搜索不到的。去浏览器搜索maven + jar名字,如下面,一般第一个就是,如果不是也可以点进去maven里面搜
仓库
maven对jar包管理,主要就是存放在仓库里面。如在安装文档提到过,修改本地仓库的位置。那个设置的位置就是本地的仓库。我们在idea的pom文件中自动联想主要的就是依靠本地仓库,如果没有就会自动联网到中央仓库(全球唯一)下载到本地来。
私服:由于中央仓库在国外,连接会比较慢,所以需要私服来加快速度。如配置镜像仓库的时候设置的阿里云就是的。
pom文件
pom.xml文件是maven项目的核心配置文件
这里介绍主要使用的标签。
项目介绍
最开始是本次项目的基础介绍
<!-- 表明是pom.xml文件 -->
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- 模型版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- 公司或者组织的唯一标志,并且配置时生成的路径也是由此生成,maven会将该项目打成的jar包放本地路径: -->
<groupId>c</groupId>
<!-- 项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 -->
<artifactId>project</artifactId>
<!-- 版本号 -->
<version>1.0</version>
<!--项目产生的构件类型,例如jar、war、ear、pom。插件可以创建他们自己的构件类型,所以前面列的不是全部构件类型
这里补充一点,pom是项目聚合的root模块所使用的
jar包括java类资源等等
war包括javaweb所需要的应用,包括静态等,可以交给服务器启动如tomcat
但是springboot使用jar和war都可以,因为里面内置tomcat
ear包括多个jar和web程序的集合 -->
<packaging>jar</packaging>
<!--项目的名称, Maven产生的文档用 -->
<name>banseon-maven</name>
<!--项目主页的URL, Maven产生的文档用 -->
<url>http://www.baidu.com/banseon</url>
</project>
父工程
在建springboot项目的时候,其有一个spring-boot-parent的父工程
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-parent</artifactId>
<version></version>
<!-- 父项目的pom.xml文件的相对路径。相对路径允许你选择一个不同的路径。默认值是../pom.xml。Maven首先在构建当前项目的地方寻找父项
目的pom,其次在文件系统的这个位置(relativePath位置),然后在本地仓库,最后在远程仓库寻找父项目的pom。 -->
<relativePath />
</parent>
依赖管理
这个是用的最多的。
在dependencies标签中使用dependency代表每一个依赖项目
<dependencies>
<dependency>
<!--依赖的group ID -->
<groupId>org.springframework.boot</groupId>
<!--依赖的artifact ID -->
<artifactId>spring-boot-starter-web</artifactId>
<!--依赖的版本号。 在Maven 2里, 也可以配置成版本号的范围。 -->
<version></version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version></version>
<!-- 依赖类型,默认类型是jar。它通常表示依赖的文件的扩展名,
但也有例外。一个类型可以被映射成另外一个扩展名或分类器。类型经常和使用的打包方式对应, -->
<type>jar</type>
<!--依赖范围。在项目发布过程中,帮助决定哪些构件被包括进来。
- compile :默认范围,用于编译 log4j
- provided:类似于编译,但支持你期待jdk或者容器提供,servlet-api
- runtime: 在执行时需要使用 jdbc驱动
- test: 用于test任务时使用 junit
-->
<scope></scope>
<!-- 依赖的分类器。分类器可以区分属于同一个POM,但不同构建方式的构件。分类器名被附加到文件名的版本号后面。例如,如果你想要构建两个单独的构件成
JAR,一个使用Java 1.4编译器,另一个使用Java 6编译器,你就可以使用分类器来生成两个单独的JAR构件。 -->
<classifier></classifier>
<!--当计算传递依赖时, 从依赖构件列表里,列出被排除的依赖构件集。即告诉maven你只依赖指定的项目,不依赖项目的依赖。此元素主要用于解决版本冲突问题
这里后面会详细讲-->
<exclusions>
<exclusion>
<artifactId></artifactId>
<groupId></groupId>
</exclusion>
</exclusions>
<!--可选依赖,如果你在项目B中把C依赖声明为可选,你就需要在依赖于B的项目(例如项目A)中显式的引用对C的依赖。可选依赖阻断依赖的传递性。
这里也会讲,这个和exclusions一样作用于依赖传递 -->
<optional>true</optional>
</dependency>
</dependencies>
属性控制
相当于变量
常见一个name的常数值为value,如下。
<properties>
<name>value</name>
</properties>
这个一般用于版本控制如,取值使用${name}既可以了
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<djl.version>0.11.0</djl.version>
</properties>
<dependency>
<groupId>ai.djl.pytorch</groupId>
<artifactId>pytorch-model-zoo</artifactId>
<version>${djl.version}</version>
</dependency>
<dependency>
<groupId>ai.djl.pytorch</groupId>
<artifactId>pytorch-engine</artifactId>
<version>${djl.version}</version>
<scope>runtime</scope>
</dependency>
除了版本控制这里记录一下常见的属性
<properties>
<--maven编译版本-->
<maven.compiler.source>17</maven.compiler.source>
<--maven发行版本-->
<maven.compiler.target>17</maven.compiler.target>
<--编码设置-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
可选依赖
<!-- 继承自该项目的所有子项目的默认依赖信息。
这部分的依赖信息不会被立即解析,而是当子项目声明一个依赖,
-->
<dependencyManagement>
<dependencies>
<!--参见dependencies/dependency元素 -->
<dependency>
</dependency>
</dependencies>
</dependencyManagement>
构建
<build>
<!--该元素设置了项目源码目录,当构建项目的时候,构建系统会编译目录里的源码。该路径是相对于pom.xml的相对路径。 -->
<sourceDirectory />
<!--该元素设置了项目脚本源码目录,该目录和源码目录不同:绝大多数情况下,该目录下的内容 会被拷贝到输出目录(因为脚本是被解释的,而不是被编译的)。 -->
<scriptSourceDirectory />
<!--该元素设置了项目单元测试使用的源码目录,当测试项目的时候,构建系统会编译目录里的源码。该路径是相对于pom.xml的相对路径。 -->
<testSourceDirectory />
<!--被编译过的应用程序class文件存放的目录。 -->
<outputDirectory />
<!--被编译过的测试class文件存放的目录。 -->
<testOutputDirectory />
<!--使用来自该项目的一系列构建扩展 -->
<extensions>
<!--描述使用到的构建扩展。 -->
<extension>
<!--构建扩展的groupId -->
<groupId />
<!--构建扩展的artifactId -->
<artifactId />
<!--构建扩展的版本 -->
<version />
</extension>
</extensions>
<!--当项目没有规定目标(Maven2 叫做阶段)时的默认值 -->
<defaultGoal />
<!--这个元素描述了项目相关的所有资源路径列表,例如和项目相关的属性文件,这些资源被包含在最终的打包文件里。 -->
<resources>
<!--这个元素描述了项目相关或测试相关的所有资源路径 -->
<resource>
<!-- 描述了资源的目标路径。该路径相对target/classes目录(例如${project.build.outputDirectory})。举个例
子,如果你想资源在特定的包里(org.apache.maven.messages),你就必须该元素设置为org/apache/maven /messages。然而,如果你只是想把资源放到源码目录结构里,就不需要该配置。 -->
<targetPath />
<!--是否使用参数值代替参数名。参数值取自properties元素或者文件里配置的属性,文件在filters元素里列出。 -->
<filtering />
<!--描述存放资源的目录,该路径相对POM路径 -->
<directory />
<!--包含的模式列表,例如**/*.xml. -->
<includes />
<!--排除的模式列表,例如**/*.xml -->
<excludes />
</resource>
</resources>
<!--这个元素描述了单元测试相关的所有资源路径,例如和单元测试相关的属性文件。 -->
<testResources>
<!--这个元素描述了测试相关的所有资源路径,参见build/resources/resource元素的说明 -->
<testResource>
<targetPath />
<filtering />
<directory />
<includes />
<excludes />
</testResource>
</testResources>
<!--构建产生的所有文件存放的目录 -->
<directory />
<!--产生的构件的文件名,默认值是${artifactId}-${version}。 -->
<finalName />
<!--当filtering开关打开时,使用到的过滤器属性文件列表 -->
<filters />
<!--子项目可以引用的默认插件信息。该插件配置项直到被引用时才会被解析或绑定到生命周期。给定插件的任何本地配置都会覆盖这里的配置 -->
<pluginManagement>
<!--使用的插件列表 。 -->
<plugins>
<!--plugin元素包含描述插件所需要的信息。 -->
<plugin>
</plugin>
</plugins>
</pluginManagement>
<!--使用的插件列表 -->
<plugins>
<!--参见build/pluginManagement/plugins/plugin元素 -->
<plugin>
<groupId />
<artifactId />
<version />
<extensions />
</plugin>
</plugins>
</build>
依赖管理
在pom文件的依赖管理介绍的依赖的使用,这里在具体展开聊聊
依赖的传递
如果a依赖于b,b依赖于c,即使在a项目中没有添加c的依赖,也会自动导入进来的。
在idea的显示图可以直观的看到依赖的传递
排除依赖
在pom文件中介绍了一个叫exclusions。
就上面的例子如果a不想依赖于b中的c,那么我们可以使用这个属性来排除掉c,断开依赖的传递。
不需要版本,排除所有。
<exclusions>
<exclusion>
<artifactId></artifactId>
<groupId></groupId>
</exclusion>
</exclusions>
可选依赖
依赖用于该项目是否允许该依赖进行传递,如果设置为true,则不会进行依赖传递
<optional>true</optional>
maven生命周期
在介绍的构建流程里面我们说了maven提供了统一的项目构建的流程。
在idea点击maven打开生命周期可以看到。
在maven生命周期中,在同一个生命周期我们运行后面的阶段前面的也会运行。
生命周期
- clean
- default(或 build):项目部署的处理
- site:项目站点文档创建的处理
- clean清理
清理掉maven残留 - compile
执行项目的编译 - test
进行项目所有的单元测试,但是有时候我们需要跳过这个阶段。
可以在idea中点击跳过
也可以命令行跳过
mvn clean install -DskipTests
mvn clean install -Dmaven.test.skip=true
- DskipTests,不执行测试用例,但编译测试用例类生成相应的class文件至target/test-classes下
- Dmaven.test.skip=true,不执行测试用例,也不编译测试用例类
- package
创建JAR/WAR包如在 pom.xml 中定义提及的包 - install
安装打包的项目到本地仓库,以供其他项目使用 - deploy
拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程
分模块开发
这个差不多是为每一个maven做一个工作
原理就是做一个就安装到本地上,然后其他模块需要用就去加相关的依赖
模块聚合
新建一个模块用于专门的管理。只包括pom.xml文件
在pom文件的packaging属性的值设置为pom
定义当前模块进行构建操作时候关联的其他模块的名称
modules每一个模块用module代表
<modules>
<module>../demo1</module>
<module>../demo2</module>
<module>../demo3</module>
</modules>
定义好后,每一会根据依赖顺序来进行构建如a->b->c
就会先c->b->a
如果是复杂的就和module定义的顺序有关了
继承
通过继承实现在子工程中使用父工程的配置
类似springboot的继承
<parent>
...
<relativePath>填写父工程的pom
</parent>
父工程依赖管理
<dependcyManagement/>
子使用的时候就可以使用里面的依赖而不选取版本了
插件也是这样
<pluginManagement/>
继承的不仅仅只是这一点还包括下面的
属性管理
在pom里面介绍的时候提到过属性控制,主要是自定义属性,这里在来系统的看看。
属性类别
- 自定义属性
讲过了 - 内置属性
maven内置属性如${project.version} project可以省略 - setting属性
maven的setting.xml属性 - java系统属性
java
System.getProperties()
里面的属性就可以了
或者命令行
mvn help:system
- 环境变量属性
资源配置
这部分功能我,我觉得不是很重要,因为配置中心会比这个更好用,而且这个用起来比较繁琐
pom文件中定义属性value,也就是maven中定义属性的地方
在pom设定配置文件路径
<resoureces>
<resource>
<diretory>配置文件的路径</>
<filtering>true</>
</resource>
</resoureces>
使用就在配置文件中用${属性}
多环境
每一个profile就是一个环境,环境配置包括
<profiles>
<profile>
<!--不同环境Profile的唯一id-->
<id>dev</id>
<properties>
<!--profiles.active是自定义的字段(名字随便起),自定义字段可以有多个-->
<profiles.active>dev</profiles.active>
<!--默认配置-->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</properties>
</profile>
<profile></>
</profiles>
多环境启动
mvn clean package -P然后是环境的id