Maven学习(十)POM深入与强化

POM深入与强化

  • 一、重新认识Maven
    • 1.Maven的完整功能
    • 2.项目管理功能的具体体现
  • 二、POM的四个层次
    • 1.超级POM
    • 2.父POM
    • 3.有效POM
      • ①概念
      • ②查看有效POM
    • 4.小结
  • 三、属性的声明与引用
    • 1.help插件的各个目标
    • 2.使用help:evaluate 查看属性值
      • ①定义属性
      • ②运行命令
      • ③运行结果
    • 3.通过Maven访问系统属性
      • ①Java系统属性一览
      • ②使用Maven访问系统属性
    • 4.访问环境变量
    • 5.访问project属性
      • ①含义
      • ②访问一级标签
      • ③访问子标签
      • ④访问列表标签
    • 6.访问settings全局配置
    • 7.用途

一、重新认识Maven

1.Maven的完整功能

在最开始学习Maven的时候,介绍说Maven是一款构建管理和依赖管理的工具。但事实上,这只是Maven的一部分功能。Maven本身的产品定位是一款项目管理工具

2.项目管理功能的具体体现

下面是spring-boot-starter的POM文件,可以看到,除了我们熟悉的坐标系,dependencies标签,还有description、url、organization、licenses、developers、scm、issueManagement等这些描述项目信息的标签。

  <modelVersion>4.0.0modelVersion>
  <groupId>org.springframework.bootgroupId>
  <artifactId>spring-boot-starterartifactId>
  <version>2.3.6.RELEASEversion>
  <name>spring-boot-startername>
  <description>Core starter, including auto-configuration support, logging and YAMLdescription>
  <url>url>
  <organization>
    <name>Pivotal Software, Inc.name>
    <url>url>
  organization>
  <licenses>
    <license>
      <name>Apache License, Version 2.0name>
      <url>url>
    license>
  licenses>
  <developers>
    <developer>
      <name>Pivotalname>
      <email>[email protected]email>
      <organization>Pivotal Software, Inc.organization>
      <organizationUrl>organizationUrl>
    developer>
  developers>
  <scm>
    <connection>scm:git:git://github.com/spring-projects/spring-boot.gitconnection>
    <developerConnection>scm:git:ssh://[email protected]/spring-projects/spring-boot.gitdeveloperConnection>
    <url>url>
  scm>
  <issueManagement>
    <system>GitHubsystem>
    <url>******url>
  issueManagement>

所以从【项目管理】的角度来看,Maven提供了如下功能:

  • 项目对象模型(POM):将整个项目本身抽象、封装为应用程序中的一个对象,以便于管理和操作
  • 全局性构建逻辑重用:Maven将整个构建过程进行封装之后,程序员只需要指定配置信息即可完成构建。让构建过程从Ant的【编程式】升级到了Maven的【声明式】
  • 构建的标准集合:在Maven提供的标准框架体系内,所有的构建都可以按照统一的规范生成和使用
  • 构建关系定义:Maven定义了构件之间的三种基本关系,让大型应用系统可以使用Maven进行管理
    • 继承关系:通过从上到下的继承关系,将各个子构件中的重复信息提取到父构件中统一管理
    • 聚合关系:将多个构件聚合为一个整体,便于统一操作
    • 依赖关系:Maven定义了依赖的范围、依赖的传递、依赖的排除、版本仲裁机制等一系列规范和标准,让大型项目可以有序容纳数百甚至更多依赖。
  • 插件目标系统:Maven核心程序定义抽象的生命周期,然后将插件的目标绑定到生命周期中的特定阶段,实现了标准和具体实现解耦合,让Maven极具扩展性。
  • 项目描述信息的维护:我们不仅可以在POM中声明描述信息,更可以将整个项目相关信息收集起来生成HTML页面组成的一个可以直接访问的站点。这些项目信息包括:
    • 公司或组织信息
    • 项目许可证
    • 开发成员信息
    • issue信息
    • SCM信息

二、POM的四个层次

1.超级POM

经过我们前面的学习,我们看到Maven的构建过程中有很多默认的设定。例如:源文件存放的目录、测试源文件存放的目录、构建的输出目录等等。但是其实这些要素也是被Maven定义过的,定义的位置就是超级POM。
关于超级POM,Maven的官网的介绍是:
Maven学习(十)POM深入与强化_第1张图片
所以我们自己的POM即时没有明确指定一个父工程(父POM),其实也默认继承了超级POM。就好比JAVA类继承Object类一样。
关于超级POM,我们可以打开 安装目录查看:
Maven学习(十)POM深入与强化_第2张图片
超级POM源文件


<project>
  <modelVersion>4.0.0modelVersion>
		
  <repositories>
    <repository>
      <id>centralid>
      <name>Central Repositoryname>
      <url>https://repo.maven.apache.org/maven2url>
      <layout>defaultlayout>
      <snapshots>
        <enabled>falseenabled>
      snapshots>
    repository>
  repositories>
	
  <pluginRepositories>
    <pluginRepository>
      <id>centralid>
      <name>Central Repositoryname>
      <url>https://repo.maven.apache.org/maven2url>
      <layout>defaultlayout>
      <snapshots>
        <enabled>falseenabled>
      snapshots>
      <releases>
        <updatePolicy>neverupdatePolicy>
      releases>
    pluginRepository>
  pluginRepositories>
	
  <build>
    <directory>${project.basedir}/targetdirectory>
    <outputDirectory>${project.build.directory}/classesoutputDirectory>
    <finalName>${project.artifactId}-${project.version}finalName>
    <testOutputDirectory>${project.build.directory}/test-classestestOutputDirectory>
    <sourceDirectory>${project.basedir}/src/main/javasourceDirectory>
    <scriptSourceDirectory>${project.basedir}/src/main/scriptsscriptSourceDirectory>
    <testSourceDirectory>${project.basedir}/src/test/javatestSourceDirectory>
    <resources>
      <resource>
        <directory>${project.basedir}/src/main/resourcesdirectory>
      resource>
    resources>
    <testResources>
      <testResource>
        <directory>${project.basedir}/src/test/resourcesdirectory>
      testResource>
    testResources>
    <pluginManagement>
      
      
      <plugins>
        <plugin>
          <artifactId>maven-antrun-pluginartifactId>
          <version>1.3version>
        plugin>
        <plugin>
          <artifactId>maven-assembly-pluginartifactId>
          <version>2.2-beta-5version>
        plugin>
        <plugin>
          <artifactId>maven-dependency-pluginartifactId>
          <version>2.8version>
        plugin>
        <plugin>
          <artifactId>maven-release-pluginartifactId>
          <version>2.5.3version>
        plugin>
      plugins>
    pluginManagement>
  build>

  <reporting>
    <outputDirectory>${project.build.directory}/siteoutputDirectory>
  reporting>

  <profiles>
    
    <profile>
      <id>release-profileid>

      <activation>
        <property>
          <name>performReleasename>
          <value>truevalue>
        property>
      activation>

      <build>
        <plugins>
          <plugin>
            <inherited>trueinherited>
            <artifactId>maven-source-pluginartifactId>
            <executions>
              <execution>
                <id>attach-sourcesid>
                <goals>
                  <goal>jar-no-forkgoal>
                goals>
              execution>
            executions>
          plugin>
          <plugin>
            <inherited>trueinherited>
            <artifactId>maven-javadoc-pluginartifactId>
            <executions>
              <execution>
                <id>attach-javadocsid>
                <goals>
                  <goal>jargoal>
                goals>
              execution>
            executions>
          plugin>
          <plugin>
            <inherited>trueinherited>
            <artifactId>maven-deploy-pluginartifactId>
            <configuration>
              <updateReleaseInfo>trueupdateReleaseInfo>
            configuration>
          plugin>
        plugins>
      build>
    profile>
  profiles>

project>


2.父POM

和Java类一样,POM之间其实也是单继承的。如果我们给一个POM指定了父POM,那么继承关系如下所示。
Maven学习(十)POM深入与强化_第3张图片

3.有效POM

①概念

有效POM英文翻译为 effective POM,它的概念是这样-- 在POM的继承关系中,子POM可以覆盖父POM中的配置;如果子POM没有覆盖,那么父POM中的配置将会被继承。按照这个规则,继承关系中的所有POM叠加在一起,就得到一个最终生效的有效POM。显然Maven在实际运行过程中,执行构建操作就是按照这个最终生效的POM来运行的。这个最终生效的POM就是有效POM, effective POM;

②查看有效POM

mvn help:effective-pom

运行查看有效POM,太多了,不展示了,自己尝试吧

4.小结

综上所述,平时我们使用和配置POM其实大致是由四个层次组成的:

  • 超级POM:所有POM默认继承,只是有直接和间接之分
  • 父POM:这一层可能没有,可能有一层,也可能很多层
  • 当前pom.xml配置的POM:我们最多关注的是这一层
  • 有效POM:隐含的一层,但是实际上真正生效的一层

三、属性的声明与引用

1.help插件的各个目标

官网说明地址:(https://maven.apache.org/plugins/maven-help-plugin)

目标 说明
help:active-profiles 列出当前已激活的profile
help:all-profiles 列出当前工程所有可用的profile
help:describe 描述一个插件或Mojo的属性
help:effective-pom 以xml格式展示有效POM
help:effective-settings 为当前工程以XML格式展示计算得到的settings配置
help:evaluate 计算用户在交互模式下给出的Maven表达式
help:system 显示平台详细信息列表,如系统属性和环境变量

2.使用help:evaluate 查看属性值

①定义属性

    <properties>
        <com.sr.hello>hellocom.sr.hello>
    properties>

②运行命令

mvn help:evaluate

③运行结果

Maven学习(十)POM深入与强化_第4张图片

3.通过Maven访问系统属性

①Java系统属性一览

【1】Java代码

     Properties properties = System.getProperties();
        Set<Object> objects = properties.keySet();
        for (Object propName : objects){
            String propValue = properties.getProperty((String)propName);
            System.out.println(propName+" = "+propValue);
        }

【2】运行结果
Maven学习(十)POM深入与强化_第5张图片

②使用Maven访问系统属性

Maven学习(十)POM深入与强化_第6张图片

4.访问环境变量

Maven学习(十)POM深入与强化_第7张图片

5.访问project属性

①含义

使用表达式${project.xxx}可以访问当前pom中的元素值

②访问一级标签

Maven学习(十)POM深入与强化_第8张图片

③访问子标签

Maven学习(十)POM深入与强化_第9张图片

④访问列表标签

Maven学习(十)POM深入与强化_第10张图片

6.访问settings全局配置

Maven学习(十)POM深入与强化_第11张图片

7.用途

  • 在当前pom.xml中引用属性
  • 资源过滤功能,在非Maven配置文件中引用属性,由Maven在处理资源时将引用属性的表达式替换为属性值(不同环境使用不同的配置,一般用的不多)

你可能感兴趣的:(Maven,maven)