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 Environment
sun.boot.library.path=C:\Program Files\Java\jdk1.8.0_131\jre\bin
java.vm.version=25.131-b11
java.vm.vendor=Oracle Corporation
java.vendor.url=http://java.oracle.com/
path.separator=;
java.vm.name=Java HotSpot(TM) 64-Bit Server VM
file.encoding.pkg=sun.io
user.country=CN
user.script=
sun.java.launcher=SUN_STANDARD
sun.os.patch.level=
java.vm.specification.name=Java Virtual Machine Specification
user.dir=E:\workplace\demo1
java.runtime.version=1.8.0_131-b11
java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment
java.endorsed.dirs=C:\Program Files\Java\jdk1.8.0_131\jre\lib\endorsed
os.arch=amd64
java.io.tmpdir=C:\WINDOWS\TEMP\
line.separator=
java.vm.specification.vendor=Oracle Corporation
user.variant=
os.name=Windows 10
sun.jnu.encoding=GBK
java.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 Specification
java.class.version=52.0
sun.management.compiler=HotSpot 64-Bit Tiered Compilers
os.version=10.0
user.home=C:\Users\思尔
user.timezone=
java.awt.printerjob=sun.awt.windows.WPrinterJob
file.encoding=UTF-8
java.specification.version=1.8
java.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.jar
user.name=思尔
java.vm.specification.version=1.8
sun.java.command=com.example.demo1.ceta
java.home=C:\Program Files\Java\jdk1.8.0_131\jre
sun.arch.data.model=64
user.language=zh
java.specification.vendor=Oracle Corporation
awt.toolkit=sun.awt.windows.WToolkit
java.vm.info=mixed mode
java.version=1.8.0_131
java.ext.dirs=C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext;C:\WINDOWS\Sun\Java\lib\ext
sun.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\classes
java.vendor=Oracle Corporation
file.separator=\
java.vendor.url.bug=http://bugreport.sun.com/bugreport/
sun.io.unicode.encoding=UnicodeLittle
sun.cpu.endian=little
sun.desktop=windows
sun.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>