美文网首页
maven工程pom.xml配置相关

maven工程pom.xml配置相关

作者: loongod | 来源:发表于2021-09-27 14:49 被阅读0次

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

    相关文章

      网友评论

          本文标题:maven工程pom.xml配置相关

          本文链接:https://www.haomeiwen.com/subject/cbvzgltx.html