maven是一款(构建管理)和(依赖管理)的工具。
Maven本身定位是一款(项目管理工具)

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

运行有效pom的命令:

mvn help:effective-pom

我们使用和配置的POM其实大致是由四个层次组成的:

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

POM的声明和引用:

使用help:evalute查看属性值
定义属性
<properties><com.atguigu.hello>good morning maven</com.atguigu.hello>
</properties>

运行命令:

mvn help:evalute

通过Maven访问系统属性
1、java系统属性一览

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

运行结果:

java.runtime.name=Java(TM) SE Runtime Environmentsun.boot.library.path=C:\Program Files\Java\jdk1.8.0_131\jre\binjava.vm.version=25.131-b11java.vm.vendor=Oracle Corporationjava.vendor.url=http://java.oracle.com/path.separator=;java.vm.name=Java HotSpot(TM) 64-Bit Server VMfile.encoding.pkg=sun.iouser.country=CNuser.script=sun.java.launcher=SUN_STANDARDsun.os.patch.level=java.vm.specification.name=Java Virtual Machine Specificationuser.dir=E:\workplace\demo1java.runtime.version=1.8.0_131-b11java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironmentjava.endorsed.dirs=C:\Program Files\Java\jdk1.8.0_131\jre\lib\endorsedos.arch=amd64java.io.tmpdir=C:\WINDOWS\TEMP\line.separator=java.vm.specification.vendor=Oracle Corporationuser.variant=os.name=Windows 10sun.jnu.encoding=GBKjava.library.path=C:\Program Files\Java\jdk1.8.0_131\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;F:\硬件开发工具\vmware\bin\;C:\ProgramData\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;C:\Program Files\Java\jdk1.8.0_131\bin;C:\Program Files\Java\jdk1.8.0_131\jre\bin;C:\Program Files\Git\cmd;F:\开发工具\apache-maven-3.5.2\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;F:\开发工具\py3.9\;F:\开发工具\py3.9\Scripts\;C:\Program Files\Graphviz\bin;F:\开发工具\node.js\;F:\filnk_package\hadoop-2.10.1\bin;F:\开发工具\py3.9\Scripts\;F:\开发工具\py3.9\;F:\硬件开发工具\ffmpeg-N-101988-g988f2e9eb0-win64-gpl-shared\bin;C:\ProgramData\Anaconda3\Scripts;C:\Program Files\Graphviz\bin;C:\Users\思尔\AppData\Roaming\npm;F:\Flink需要的软件包\SSHSecureShellClient-3.2.9\install;.java.specification.name=Java Platform API Specificationjava.class.version=52.0sun.management.compiler=HotSpot 64-Bit Tiered Compilersos.version=10.0user.home=C:\Users\思尔user.timezone=java.awt.printerjob=sun.awt.windows.WPrinterJobfile.encoding=UTF-8java.specification.version=1.8java.class.path=C:\Program Files\Java\jdk1.8.0_131\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\rt.jar;E:\workplace\demo1\target\classes;C:\Users\思尔\.m2\repository\org\springframework\boot\spring-boot-starter-web\2.6.6\spring-boot-starter-web-2.6.6.jar;C:\Users\思尔\.m2\repository\org\springframework\boot\spring-boot-starter\2.6.6\spring-boot-starter-2.6.6.jar;C:\Users\思尔\.m2\repository\org\springframework\boot\spring-boot\2.6.6\spring-boot-2.6.6.jar;C:\Users\思尔\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\2.6.6\spring-boot-autoconfigure-2.6.6.jar;C:\Users\思尔\.m2\repository\org\springframework\boot\spring-boot-starter-logging\2.6.6\spring-boot-starter-logging-2.6.6.jar;C:\Users\思尔\.m2\repository\ch\qos\logback\logback-classic\1.2.11\logback-classic-1.2.11.jar;C:\Users\思尔\.m2\repository\ch\qos\logback\logback-core\1.2.11\logback-core-1.2.11.jar;C:\Users\思尔\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.17.2\log4j-to-slf4j-2.17.2.jar;C:\Users\思尔\.m2\repository\org\apache\logging\log4j\log4j-api\2.17.2\log4j-api-2.17.2.jar;C:\Users\思尔\.m2\repository\org\slf4j\jul-to-slf4j\1.7.36\jul-to-slf4j-1.7.36.jar;C:\Users\思尔\.m2\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;C:\Users\思尔\.m2\repository\org\yaml\snakeyaml\1.29\snakeyaml-1.29.jar;C:\Users\思尔\.m2\repository\org\springframework\boot\spring-boot-starter-json\2.6.6\spring-boot-starter-json-2.6.6.jar;C:\Users\思尔\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.13.2.2\jackson-databind-2.13.2.2.jar;C:\Users\思尔\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.13.2\jackson-annotations-2.13.2.jar;C:\Users\思尔\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.13.2\jackson-core-2.13.2.jar;C:\Users\思尔\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.13.2\jackson-datatype-jdk8-2.13.2.jar;C:\Users\思尔\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.13.2\jackson-datatype-jsr310-2.13.2.jar;C:\Users\思尔\.m2\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.13.2\jackson-module-parameter-names-2.13.2.jar;C:\Users\思尔\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\2.6.6\spring-boot-starter-tomcat-2.6.6.jar;C:\Users\思尔\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.60\tomcat-embed-core-9.0.60.jar;C:\Users\思尔\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\9.0.60\tomcat-embed-el-9.0.60.jar;C:\Users\思尔\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.60\tomcat-embed-websocket-9.0.60.jar;C:\Users\思尔\.m2\repository\org\springframework\spring-web\5.3.18\spring-web-5.3.18.jar;C:\Users\思尔\.m2\repository\org\springframework\spring-beans\5.3.18\spring-beans-5.3.18.jar;C:\Users\思尔\.m2\repository\org\springframework\spring-webmvc\5.3.18\spring-webmvc-5.3.18.jar;C:\Users\思尔\.m2\repository\org\springframework\spring-aop\5.3.18\spring-aop-5.3.18.jar;C:\Users\思尔\.m2\repository\org\springframework\spring-context\5.3.18\spring-context-5.3.18.jar;C:\Users\思尔\.m2\repository\org\springframework\spring-expression\5.3.18\spring-expression-5.3.18.jar;C:\Users\思尔\.m2\repository\org\slf4j\slf4j-api\1.7.36\slf4j-api-1.7.36.jar;C:\Users\思尔\.m2\repository\org\springframework\spring-core\5.3.18\spring-core-5.3.18.jar;C:\Users\思尔\.m2\repository\org\springframework\spring-jcl\5.3.18\spring-jcl-5.3.18.jar;F:\开发工具\idea\IntelliJ IDEA 2017.2.6\lib\idea_rt.jaruser.name=思尔java.vm.specification.version=1.8sun.java.command=com.example.demo1.cetajava.home=C:\Program Files\Java\jdk1.8.0_131\jresun.arch.data.model=64user.language=zhjava.specification.vendor=Oracle Corporationawt.toolkit=sun.awt.windows.WToolkitjava.vm.info=mixed modejava.version=1.8.0_131java.ext.dirs=C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext;C:\WINDOWS\Sun\Java\lib\extsun.boot.class.path=C:\Program Files\Java\jdk1.8.0_131\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\rt.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\sunrsasign.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_131\jre\classesjava.vendor=Oracle Corporationfile.separator=\java.vendor.url.bug=http://bugreport.sun.com/bugreport/sun.io.unicode.encoding=UnicodeLittlesun.cpu.endian=littlesun.desktop=windowssun.cpu.isalist=amd64

 2、maven访问系统属性

访问project属性:

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

2、访问一级标签
${project.标签名}

访问系统环境变量: 

7、用途
在当前pom.xml文件中用用属性
资源过滤功能:在非Maven配置文件中引用属性,由Maven在处理资源时将引用属性表达式替换为属性值

build标签详解:
本质上来说:我们配置的build标签都是对超级POM的配置的叠加。我们为什么要在默认的基础上叠加呢?很简单在默认标签无法满足的时候定制构建过程。

build标签组成大概三个部分:
1、定义约定的目录结构

2、备用插件管理

pluginManagement标签存放着几个极少用到的插件:
maven-antrun-plugin
maven-assembly-plugin
maven-dependency-plugin
maven-release-plugin

被springboot-dependenciens管理的插件

<plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

子工程使用的插件管理:

<!--build 标签:用来配置对构建过程的定制-->
<build><!--plugins 标签:定制化构建过程中所使用到的插件--><plugins><!--plugin标签:一个具体插件--><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>

生命周期插件:

<plugin><artifactId>maven-cpmpiler-plugin</artifactId><version>3.1</version><executions><execution><id>default-compile</id><phase>compile</phase><goals><goal>compile</goal></goals></execution><execution><id>default-testCompile</id><phase>test-compile</phase><goals><goal>testCompile</goal></goals></execution></executions>
</plugin>

坐标部分

artifactId和version标签定义了插件的坐标,作为Maven的自带插件这里省略了groupId

执行部分

executions标签内可以配置多个execution标签,executions标签内:
id:指定唯一标识
phase:关联生命周期阶段
goals/goal:关联指定生命周期的目标

可以配置多个goal标签,表示一个生命周期可以对应多个目标

 

build标签典型应用,指定jdk版本
我们子啊settings.xml中配置了JDK版本,那么将来把Maven工程部书到服务器上,脱离settings.xml配置,如何保证正常运行,我们的思路就是直接把JDK版本信息高速maven-compiler-plugin插件,让他在构建过程中,按照我们指定的信息工作。

我们先取消settings.xml配置

<!--build 标签:用来配置对构建过程的定制-->
<build><!--plugins 标签:定制化构建过程中所使用到的插件--><plugins><!--plugin标签:一个具体插件--><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><!--configuration标签:配置maven-compiler-plugin插件--><configuration><!--具体配置信息会因为插件不同、需求不同而有所差异--><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin></plugins></build> 

也可以通过peoperty来设定

<properties><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><java.version>8</java.version>
</properties>

build应用springboot定制化打包 :

需求:
很显然spring-boot-maven-plugin并不是Maven自带的插件,而是SpringBoot提供的,用来改变Maven默认时构建行为。具体来说是改变打包行为。
默认情况下Maven调用maven-jar-plugin插件的jar目标,生成普通的jar包。
普通的jar包没办法使用 java -jar xxx.jar这样的命令来启动、运行,但是SpringBoot设计理念就是每一个(为服务到处一个jar包,这个jar包可以使用java -jar xxx.jar这样的命令来直接启动运行)。这样一来,打包的方式肯定要进行调整。所以SpringBoot提供了spring-boot-maven-plugin这个插件来定制打包行为。

springboot打包插件: 

<!--plugins 标签:定制化构建过程中所使用到的插件-->
<plugins><!--plugin标签:一个具体插件--><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin>

</plugins>

七个插件目标:

我们所使用的就是spring-boot-repackage

build的另外一个列子就是mybatis的逆向工程:

<build><plugins><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.3.0</version><dependencies><!--逆向工程核心--><dependency><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-core</artifactId><version>1.3.2</version></dependency><!--数据库连接池--><dependency><groupId>com.mchange</groupId><artifactId>c3p0</artifactId><version>0.9.2</version></dependency><!--Mysql驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.8</version></dependency></dependencies></plugin></plugins>
</build>

 依赖配置补充:

import:
管理依赖最基本的办法就是继承父工程,但是和java类一样,maven也是单继承。如果不同体系的依赖信息封装在不同的POM中,没办法继承多个父工程杂么办?这时可以使用import依赖范围。

典型案例就是项目中引入SpringBoot、SpringCloud依赖:

<dependencyManagement><dependencies><!--springCloud的依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Hoxton.SR9</version><type>pom</type><scope>import</scope></dependency><!--SpringCloud Alibab 依赖导入--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2.2.6.RELEASE</version><type>pom</type><scope>import</scope></dependency>

import依赖范围使用要求:
打包类型必须是pom
必须放在dependencyManagement中

system
以Windows系统环境开发为例,假设现在D:tempare\huitao-test-1.0-SNAPSHOT.jar想要引入到我们的项目中,此时我们就可以将依赖配置为system范围:

<dependency>
<groupId>com.huitao.maven</groupId>
<artifactId>huitao-test</artifactId>
<version>1.0-SNAPSHOT</version>
<systemPath>D:tempare\huitao-test-1.0-SNAPSHOT.jar</systemPath>
<scope>system</scope>
</dependency>

这样引入不具备可移植性,不建议使用。

runtime
专门用于编译时不需要,但是运行时需要的jar包。比如:编译时我们根据接口调用的方法,但是实际运行时需要的是接口的实现类。典型案例是: 热部署依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>

 optional解释:可选的

 版本仲裁:

 自定义插件流程:

1、创建工程
2、设定打包方式
<packaging>maven-plugin</packaging>
3、引入依赖(二选一)

一、文档注释中使用注解

<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-pllugin-api</artifactId>
<version>3.5.2</version>
</dependency>

二、将来直接使用注解

<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-pllugin-annotations</artifactId>
<version>3.5.2</version>
</dependency> 

安装插件:
要在后续使用插件,就必须至少将插件安装到本地仓库

注册插件
我们需要将插件坐标中的groupId部分注册到settings.xml中

<pluginGroups><pluginGroup>com.huitao.spring</pluginGroup></pluginGroups> 

自定义插件:

<!--配置使用自定义标签-->
<build><plugins><plugin><groupId>com.atguigu.maven</groupId><artifactId>hello-maven-plugin</artifactId><version>1.0-SNAPSHOT</version><executions><execution><id>hello-plugin</id><phase>validate</phase><goals><goal>SayHello</goal></goals></execution></executions></plugin></plugins>
</build>

maven之pom深入相关推荐

  1. maven的pom报plugins错误的解决方法.

    maven的pom报plugins错误的解决方法. 参考文章: (1)maven的pom报plugins错误的解决方法. (2)https://www.cnblogs.com/sjcq/p/61940 ...

  2. maven的pom.xml用<exclusion>解决版本问题

    maven的pom.xml用解决版本问题 参考文章: (1)maven的pom.xml用解决版本问题 (2)https://www.cnblogs.com/liu2-/p/9035922.html 备 ...

  3. maven的pom.xml中repositories的作用

    在maven中pom.xml是Maven进行工作的主要配置文件,它的作用包括:配置Maven项目中需要使用的远程仓库,Maven项目的资源依赖关系等.其中pom是Project Object Mode ...

  4. JavaFX maven工程pom文件完整内容

    JavaFX maven工程pom文件完整内容:打包fxml.css等静态资源文件 <project xmlns="http://maven.apache.org/POM/4.0.0& ...

  5. Maven 配置文件 POM 的常用插件配置代码

    Maven 配置文件 POM 的常用插件配置代码 普通 将 Maven 多模块依赖集成打进一个 JAR 包(方法 1) 将 Maven 多模块依赖集成打进一个 JAR 包(方法 2) 生成单入口类 J ...

  6. Maven 配置文件 POM 的常用依赖配置代码

    Maven 配置文件 POM 的常用依赖配置代码 Lombok 测试 Junit 5 日志 Log4j2 & SLF4J & Lombok Spring Bean Spring Boo ...

  7. maven打包pom.xml备忘

    打包生成可执行jar 包 POM.XML <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=" ...

  8. Maven的pom.xml文件详解------The Basics

    转载自  Maven的pom.xml文件详解------The Basics Maven坐标 GroupId.artifactId和version构成了Maven的坐标(groupId和version ...

  9. Maven的pom.xml文件详解------Environment Settings

    转载自  Maven的pom.xml文件详解------Environment Settings Issue Management 使用的缺陷跟踪系统(Bugzilla,TestTrack,Clear ...

  10. Maven的pom.xml文件详解------Build Settings

    转载自  Maven的pom.xml文件详解------Build Settings 根据POM 4.0.0 XSD,build元素概念性的划分为两个部分:BaseBuild(包含poject bui ...

最新文章

  1. git 查看公共commit_git使用点滴:如何查看commit的内容
  2. 20个必不可少的Python库
  3. xcart-子分类/语言不显示
  4. vue 出现Elements in iteration expect to have 'v-bind:key' directives
  5. istio回归「单体应用」对我们的启发
  6. 03-java学习-基本数据类型-运算符-键盘接收用户输入
  7. 正确注释@return让PHPstorm动态返回类
  8. crash工具解析_crash工具和x86-64汇编基础
  9. idhttp.post方式 调用datasnap rest 远程方法(转咏南兄)
  10. Eric Pement的单行awk命令收集
  11. Linux-lsof
  12. 重载函数sroot3次,让它返回整数、长整数、双精度数的二次方根
  13. 蓝桥杯 算法训练 调和数列问题
  14. java:comp/env 解释
  15. html在线人数统计代码,网页在线人数统计的代码
  16. 讯时O口MX8网关对接昆石软交换vos3000
  17. 我的一周re学习总结
  18. 联力L216装机心得
  19. WPARAM 与 LPARAM 参数的解析 [C#、WinAPI]
  20. 【原创】关于企业或组织实行OKR的心得

热门文章

  1. Jmeter(一)http接口添加header和cookie
  2. 【吴恩达机器学习】学习笔记——1.5无监督学习
  3. VMware10 安装centos6.7 设置NAT模式固定ip
  4. 使用Xshell登录AWS的EC2云服务器和开启EC2上允许root+密码方式登录
  5. 创建线程的两种方式:继承Thread类和实现Runnable接口
  6. 17110 Divisible(basic)
  7. iPod Touch也将支持运行Android系统
  8. java uuid 第三方_JAVA生成短8位UUID
  9. ajax获取session值_cookie和session基础知识学习
  10. java输出hello word,教你如何配置java环境输出"hello word!"?