Maven是啥
Maven是一个项目管理工具,用于构建和管理项目的依赖。它通过插件来扩展其功能,并提供了一种标准化的项目结构和构建方式。一个常见的用途是通过Maven来构建Java项目,它可以管理项目的依赖库、编译代码、运行测试、打包项目等。
如今我们构建一个项目需要用到很多第三方的类库,我们只需要告诉Maven需要哪些Jar 包,它会帮助我们下载所有的Jar,极大提升开发效率。
Maven规定的目录结构
- main/java 存放项目源代码
- resources 存放项目资源文件
- test/java 存放单元测试源代码
- test/resources 存放单元测试资源文件
- pom.xml maven项目的配置文件
- target 存放构建后的文件和目录,jar包,war包,编译后的class文件,都是maven构建时生成的
Maven基本命令
1.mvn -v 有信息,说明maven安装成功
2.compile 编译 将Java源代码编译成class文件
3.test 测试项目 执行test下的目录用例
4.package 打包 将项目打成jar包
5.clean 删除target文件夹
在Maven项目中,target目录是用来存放项目构建后的文件和目录,包括编译后的class文件、生成的jar包、war包等。这个目录是由Maven构建工具在项目构建过程中自动生成的。
6.install 安装 将当前项目放到maven本地仓库中,供其他项目使用
Maven仓库
Maven仓库用来存放Maven管理的所有Jar包。分为:本地仓库 和 中央仓库 和远程仓库。
本地仓库:自己计算机上的一个目录
中央仓库: Maven官方提供的远程仓库。
远程仓库(私服): 一般由公司团队搭建的私有仓库。
当项目编译时,Maven首先从本地仓库中寻找项目所需的Jar包,若本地仓库没有,再到Maven的中央仓库下载所需Jar包。
什么是“坐标”?
在Maven中,坐标是Jar包的唯一标识,Maven通过坐标在仓库中找到项目所需的Jar包。
- groupId:所需Jar包的项目名
- artifactId:所需Jar包的模块名
- version:所需Jar包的版本号
- scope :依赖范围
传递依赖 与 排除依赖
传递依赖:如果我们的项目引用了一个Jar包,而该Jar包又引用了其他Jar包,那么在默认情况下项目编译时,Maven会把直接引用和间接引用的Jar包都下载到本地。
排除依赖:如果我们只想下载直接引用的Jar包,那么需要在pom.xml中做如下配置:(将需要排除的Jar包的坐标写在中)
依赖范围scope
用于控制依赖项在不同构建环境下的可见性和使用方式。依赖范围可以帮助你管理项目中的依赖项,并确保它们在正确的环境中使用。
compile 编译 :默认依赖范围,所有阶段
provided 提供:依赖项由jdk或服务器提供,无需在编译或运行时包含在项目中
runtime 运行时:在运行时需要,但在编译时不需要。
如,数据库驱动程序就是一个运行时依赖项,因为在编译时你只需要数据库相关的接口,而不需要具体的驱动程序。
test 测试:仅在测试代码中需要使用,不会被打包到最终的构建结果中。
如,JUnit就是一个测试依赖项,因为它只在运行测试时需要。
system 系统:类似于provided,但是需要明确指定依赖项的路径。通常用于引入本地系统的jar文件,而不是从maven仓库中获取。
通过正确设置依赖范围,你可以确保项目在不同的构建环境中正常工作,并减少不必要的依赖项。这样可以提高构建效率并减少构建结果的大小。
依赖冲突
当多个依赖项引入了相同的类或资源时,就会发生依赖冲突。但Maven采用了两种避免冲突的策略,因此在Maven中是不存在依赖冲突的。
1.短路优先
本项目——>A.jar——>B.jar——>X.jar
本项目——>C.jar——>X.jar
若本项目引用了A.jar,A.jar又引用了B.jar,B.jar又引用了X.jar,并且C.jar也引用了X.jar。
在此时,Maven只会引用引用路径最短的Jar。
2.声明优先
若引用路径长度相同时,在pom.xml中谁先被声明,就使用谁。
聚合
1.什么是聚合
将多个项目同时运行就称为聚合。
2.如何实现聚合?
只需在pom中作如下配置即可实现聚合:
<modules>
<module>web-connection-pool</module>
<module>web-java-crawler</module>
</modules>
继承
1.什么是继承?
在聚合多个项目时,如果这些被聚合的项目中需要引入相同的jar,那么可以将这些jar写入父pom中,各个子项目继承该pom即可。
2.如何实现继承?
-
父pom配置:将需要继承的Jar包的坐标放入标签即可。
<dependencyManagement> <dependencies> <dependency> <groupId>cn.missbe.web.search</groupId> <artifactId>resource-search</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> </dependencyManagement>
- 子pom配置:
<parent>
<groupId>父pom所在项目的groupId</groupId>
<artifactId>父pom所在项目的artifactId</artifactId>
<version>父pom所在项目的版本号</version>
</parent>
<parent>
<groupId>cn.missbe.web.search</groupId>
<artifactId>resource-search</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
pom.xml详解
pom.xml是Maven项目的核心配置文件,它使用XML格式描述了项目的基本信息、依赖关系、构建配置等。
1.项目基本信息:包括项目的名称、版本、描述、开发者信息
<groupId>com.example</groupId>
<artifactId>my-project</artifactId>
<version>1.0.0</version> //版本
<name>My Project</name> //项目名称
<description>This is a sample Maven project</description> //描述
<developers> //开发者信息
<developer>
<name>John Doe</name>
<email>john.doe@example.com</email>
</developer>
</developers>
2.项目依赖:声明项目所依赖的外部库,插件等。依赖可以通过groupId、artifactId和version来指定。
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
</dependencies>
3.构建配置:包括项目的构建方式,插件配置等。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
4.仓库配置:指定maven远程仓库地址,用于下载项目依赖。
<repositories>
<repository>
<id>central</id>
<url>https://repo.maven.apache.org/maven2</url>
</repository>
</repositories>
5.插件管理:用于管理项目中使用的插件版本。
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
</plugin>
</plugins>
</pluginManagement>
原文链接:原文链接