Maven
一、Maven加载原理
二、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> <groupId>com.gsy</groupId> <artifactId>mybatis-study</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> </project>
其中:
<project>
是根标签,必须得有的。
<modelVersion>
自动生成,指定pom默认版本。对于Maven 2.x、Maven 3.x中modelVersion必须是4.0.0。
<groupId>
、<artifactId>
、<version>
表示当前项目的坐标,里面信息都是在新建项目时填写的信息。
<packaging>是打包方式,默认为jar,如果是web项目应该指定war
四、Maven编译项目
执行comlpile(编译)后
会将编译后的项目输出到target目录,此时会存在一个问题:在src下的java包中java文件被编译成了字节码文件,但是存放一些其他类型的文件 例如xml文件并没有输出到target目录,
而在resources目录中的xml文件被输出到target目录中了且resources文件夹消失了。
这是由于Maven对于src中的java中只编译java文件,若需要编译输出其他类型文件,需要配置 深度资源拷贝 插件
<build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.txt</include> </includes> <filtering>true</filtering> </resource> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build>

<build> <!-- 只要配置资源拷贝插件必须得配置的标签,里面可以有多个resource标签 --> <!-- 每个resource希望编译哪个目录--> <resources> <resource> <!-- 希望编译的目录 --> <directory>src/main/java</directory> <!-- Maven在这个目录原有功能不变,额外再添加其他的类型 --> <includes> <!-- 告诉Maven还需要编译什么类型的文件 --> <!-- ** 目录及目录,理解成任意子目录--> <!-- *.txt 中 * 任意名称文件,.txt 扩展名类型--> <include>**/*.txt</include> <!-- 如果还希望编译其他类型时再写个include标签 --> <!-- <include>**/*.xml</include>--> </includes> <!-- 是否在编译文件过程中,对文件内容进行过滤处理。是否对文件中内容进行操作 --> <filtering>true</filtering> </resource> <!-- 如果不配置,resources中内容不再进行编译 --> <!-- 只要配置上,把原有约定生效--> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build>
<directory>
配置的目录。
<includes>
标签明确配置哪些文件也需要被编译。**/*.txt
中**
表示任意目录及子目录。*.txt
表示任意名称的txt文件。如果希望编译其他类型的文件,例如xml文件,需要在<includes>
里面再配置<include>**/*.xml</include>
就可以了。
<filtering>
五、Maven项目类型
1.项目类型介绍
jar:相当于我们之前使用idea创建的java项目。打包主要打包.class文件。
war:web项目类型。打包时除了src中内容,还会包含webapp目录,要比jar类型文件打包的内容更多。
pom:
2.修改项目类型
pom.xml中默认没有配置
<packaging>
标签。当没有配置<packaging>
时等效于<packging>jar<packaging>
六、pom模型中的几种关系
Maven基于POM模型的项目管理工具,所以这三种关系在Maven中都存在。
只要依赖的项目(可以是自己的项目,也可以是开源项目)存在于本地仓库,就可以通过pom.xml的<dependency>
1.1 依赖的传递性
假设项目A依赖项目B,项目B依赖项目C,这时会发现项目A中包含了项目C的依赖,这就是依赖的传递性。
1.2 重复依赖问题
当项目中依赖内容比较多时,可能出现重复依赖的问题,尤其依赖传递性导致的重复依赖。
2.继承关系
<packing></packing>
的选项:
-
pom:往往是作为父项目的角色,在父项目的pom.xml中统一管理子项目的依赖,插件,并不会将代码放到pom工程中。
-
jar:jar就是我们经常引入的jar包或引入的依赖,本质就是java项目中字节码文件,我们是调用它里面的类,一般的jar包只包含类,配置文件,依赖,插件,不会存在静态资源等。
-
war:本质就是web项目,跟jar不同的是它可以有静态资源的存在,比如Html,css,图片等等。
-
如果想要使用另一个项目的类,这种关系在Maven中叫做依赖。
-
2.1 依赖和插件管理
在父项目中可以通过<pluginManagement>
管理父项目中的插件,子项目则可以选择继承哪些插件。
<mysql-version>
名称是自定义的,里面的8.0.27是自己填写的。
可以在<dependency>
标签的<version>
好处是:项目中依赖特别多时,还需要由父项目进行版本管理。可以把所有依赖的版本号都定义到
<properties>
里面,以后想要修改某个依赖版本时,找起来比较方便。因为很多开源项目中涉及到父项目进行版本管理时,都使用的是
<properties>
聚合主要用在分布式架构或微服务架构的项目,对于单体架构项目来说很少使用聚合项目。
聚合项目最大的好处:在一个父项目中创建多个模块,所有的模块都是独立的,可以独立运行。且父项目不需要install
-
Clean Lifecycle:做一些清理工作;
-
Default Lifecycle:构建的核心部分、编译、测试、打包、部署等;
-
Site Lifecycle:生成项目报告、站点、发布站点;
其中Default Lifecycle包含如下阶段:
-
validate
- 验证项目是否正确并且所有必要的信息都可用 -
compile
- 编译项目的源代码 -
test
- 使用合适的单元测试框架测试编译的源代码。这些测试不应该要求打包或部署代码 -
package
- 将编译后的代码打包成可分发的格式,例如 JAR。 -
verify
- 对集成测试的结果进行任何检查,以确保满足质量标准 -
install
- 将包安装到本地存储库中,作为本地其他项目的依赖项 -
deploy
生命周期的每个阶段必须按照严格的执行顺序,当然我们可以执行任意一个阶段,但是每个阶段都会从第一个阶段开始执行。
八、scope (面)
1.scope介绍
取值 | 解释 |
---|---|
compile | 默认值,不配置scope时的取值,表示依赖参与整个项目的编译、打包、测试、发布。也就是说:编译时需要使用、测试时需要使用、最终打包时会包含。属于一种强依赖。 |
provided | 仅编译时生效,项目最终被打包时不会包含该依赖。常见servlet的依赖时需要配置。 |
runtime | 运行时生效。表示编译时不参与,但是参与项目的测试、打包。该依赖被打包时会被包含。 |
test | 仅测试时生效,这个包中的类只能在src/main/test中使用。常用在junit依赖时需要被配置。 |
system |
使用:
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency> </dependencies>
2.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律