Maven-配置文件说明

211 阅读3分钟

Maven-配置文件说明

Maven 是基于 POM(Project Object Model) 进行的,项目的所有配置都会放在 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.xx</groupId>
    <artifactId>MavenDemo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>MavenDemo</name>
</project>
  • 第一行是XML头,指定了该xml文档的版本和编码方式。
  • project 是根元素,声明了一些POM相关的命名空间及xsd元素
  • modelVersion指定了当前POM的版本,(Maven 3来说,值只能是4.0.0)
  • groupId定义了项目属于哪个组织,通常是组织域名的倒序,来定义
  • artifactId定义了项目在组织中的唯一ID
  • version指定了项目当前的版本,SNAPSHOT意为快照
  • name 项目名称。
  • groupId 、artifactId、version(当我们自己写项目提供给其它人使用Maven引,用时用来确定项目的唯一坐标)
<!—用于声明依赖,可包含多个dependency-->
<dependencies>
    <!—用于声明依赖-->
    <dependency>
        <groupId>项目属于哪个组织</groupId>
     <artifactId>项目在组织中的唯一ID</artifactId>
     <version>版本</version>
     <type>依赖类型默认jar</type>
     <scope>依赖范围</scope>
     <optional>依赖是否可选</optional>
     <!—主要用于排除传递性依赖-->
     <exclusions>
         <exclusion>
           <groupId>项目属于哪个组织</groupId>
          <artifactId>项目在组织中的唯一ID</artifactId>
       </exclusion>
     </exclusions>
  </dependency>
<dependencies>
  • dependencies 可以包含一个或者多个dependency元素,以声明一个或者多个项目依赖。
  • grounpId、artifactId和version 组成了依赖的基本坐标。
  • type 指定了依赖的类型,默认为 jar。
  • scope 指定了依赖的范围(详情见下面依赖范围部分)。
  • optional 标记了依赖是否是可选的(详情见下面依赖可选部分)。
  • exclusions 用来排除传递性依赖(详情见下面依赖排除部分)。

依赖范围有以下5种:

compile,默认的依赖范围,表示依赖需要参与当前项目的编译,后续的测试、运行周期也参与其中,是比较强的依赖。

  • test,表示依赖仅仅参与测试相关的工作,包括测试代码的编译和运行。比较典型的如 junit。
  • runntime,表示依赖无需参与到项目的编译,不过后期的测试和运行需要其参与其中。
  • provided,表示打包的时候可以不用包进去,别的容器会提供。和 compile 相当,但是在打包阶段做了排除的动作。
  • system,从参与程度上来说,和 provided 类似,但不通过 Maven 仓库解析,可能会造成构建的不可移植,要谨慎使用。
依赖范围编译测试运行
compile
test
provided
runtime
system

传递性依赖

比如一个项目A,A有一个compile范围的B依赖,B有一个compile范围的C依赖,那么C就会成为A的compile范围的依赖,C就是A的一个传递依赖。有了传递性依赖,就不用担心依赖缺失和多余,Maven会解析各个直接依赖的POM,将那些必要的间接依赖,以传递性依赖的形式引入到当前的项目中。

依赖可选

    项目中A依赖B,B依赖于C和D,如果所有这三个的范围都是compile的话,那么C和D就是A的compile范围的传递性依赖,但是如果我想X、Y不作为A的传递性依赖,不给它用的话,可以将dependency中的optional设置为true

依赖排除

    有时候你引入的依赖中包含你不想要的依赖包,你想引入自己想要的,这时候就要用到排除依赖了,比如下图中spring-boot-starter-web自带了logback这个日志包,我想引入log4j2的,所以我先排除掉logback的依赖包,再引入想要的包就行了。同时jar包冲突时部分问题可以采用依赖排除解决掉。

文章内容出自终于把项目构建神器Maven捋清楚了~ | Java 程序员进阶之路 (tobebetterjavaer.com)