maven工程pom.xml配置相关
一、什么是 pom?
POM
是 Project Object Model
的缩写,即项目对象模型。
pom.xml
就是 maven
的配置文件,用以描述项目的各种信息。
<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>
<!-- The Basics -->
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<packaging>...</packaging>
<dependencies>...</dependencies>
<parent>...</parent>
<dependencyManagement>...</dependencyManagement>
<modules>...</modules>
<properties>...</properties>
<!-- Build Settings -->
<build>...</build>
<reporting>...</reporting>
<!-- More Project Information -->
<name>...</name>
<description>...</description>
<url>...</url>
<inceptionYear>...</inceptionYear>
<licenses>...</licenses>
<organization>...</organization>
<developers>...</developers>
<contributors>...</contributors>
<!-- Environment Settings -->
<issueManagement>...</issueManagement>
<ciManagement>...</ciManagement>
<mailingLists>...</mailingLists>
<scm>...</scm>
<prerequisites>...</prerequisites>
<repositories>...</repositories>
<pluginRepositories>...</pluginRepositories>
<distributionManagement>...</distributionManagement>
<profiles>...</profiles>
</project>
1. relativePath
默认值为../pom.xml
查找顺序:relativePath
元素中的地址→本地仓库→远程仓库
设定一个空值将始终从仓库中获取,不从本地路径获取。
如:
<relativePath/>
2. dependencyManagerment
首先,该标签里面的依赖不会被子模块直接继承。若是不加这个标签,则父pom
里面的 所有依赖 都会被子模块直接继承过去,若子模块不需要使用全部的依赖,你却强制给子模块,子模块打包时会因为多余的jar
包显得很臃肿。
一般做法是:
在父pom
的<dependencyManagerment>
标签里面声明所有的依赖及其版本号,可以用<properties>
标签进一步对版本号进行集中管理。子模块若想使用父pom
中声明的依赖,需要在自己的模块中声明一下,但不用写版本号(当子模块继承了父pom
后,会默认向上找父pom
中<dependencyManagerment>
标签中依赖声明的版本号;若子模块中写了版本号,就优先使用自己的版本号)。这样子模块用什么依赖就取什么依赖即可,父pom
也可以对所有的依赖进行统一的管理。
3.
二、Maven依赖中scope详解
scope元素的作用:控制 dependency 元素的使用范围。通俗的讲,就是控制 Jar 包在哪些范围被加载和使用。
scope的默认值是compile。
compile
默认就是compile,什么都不配置也就是意味着compile。compile表示被依赖项目需要参与当前项目的编译,当然后续的测试,运行周期也参与其中,是一个比较强的依赖。打包的时候通常需要包含进去。
test
scope为test表示依赖项目仅仅参与测试相关的工作,包括测试代码的编译,执行。比较典型的如junit。
runntime
runntime表示被依赖项目无需参与项目的编译,不过后期的测试和运行周期需要其参与。与compile相比,跳过编译而已,说实话在终端的项目(非开源,企业内部系统)中,和compile区别不是很大。比较常见的如JSR×××的实现,对应的API jar是compile的,具体实现是runtime的,compile只需要知道接口就足够了。oracle jdbc驱动架包就是一个很好的例子,一般scope为runntime。另外runntime的依赖通常和optional搭配使用,optional为true。我可以用A实现,也可以用B实现。
provided
provided意味着打包的时候可以不用包进去,别的设施(Web Container)会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。相当于compile,但是在打包阶段做了exclude的动作。
system
从参与度来说,也provided相同,不过被依赖项不会从maven仓库抓,而是从本地文件系统拿,一定需要配合systemPath属性使用。
scope的依赖传递
A–>B–>C。当前项目为A,A依赖于B,B依赖于C。知道B在A项目中的scope,那么怎么知道C在A中的scope呢?答案是:
当C是test或者provided时,C直接被丢弃,A不依赖C;
否则A依赖C,C的scope继承于B的scope。
三、spring-boot- maven-plugin插件作用
spring-boot-maven-plugin
这个插件是专门为springBoot
项目服务的。
作用是打包时,对mvn package
打包后的结果进行二次打包,目的是将当前项目所有的依赖也打包进来(会自动的找到启动类作为main class
),官方解释此时的jar
包叫fat.jar
。若不加这个插件,就只打包当前项目中的东西,依赖不会被打包进来。
注意:
spring-boot-maven-plugin
打成的jar
包可以运行,但是不能被其他工程依赖。所以被其他模块依赖的模块如common
模块,不能加这个,否则会提示找不到程序包。