maven工程pom.xml配置相关

一、什么是 pom?

POMProject 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模块,不能加这个,否则会提示找不到程序包。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章