概述
Maven是为Java项目提供构建和依赖管理支持的工具
构建环节
清理clean
删除上一次构建的结果
编译compile
Java源程序编译成*.class字节码文件
测试test
运行提前准备好的测试程序,执行src/text/java下的junit测试用例
报告site
每次测试后用标准格式记录和显示测试结果
打包package
Java工程:jar包
web工程:war包
安装install
把一个Maven工程经过打包操作生成jar包或war包存入Maven仓库
部署deploy
部署jar包:把一个jar包部署到服务器上
部署war包:借助maven插件,将war包部署到tomcat服务器上
pom.xml
项目对象模型:将工程抽象为一个模型
<groupId>
公司或组织的id,即公司或组织域名的倒序,通常也会加上项目名称
<artifactId>
一个项目或者是项目中的一个模块的 id,即模块的名称,将来作为 Maven 工程的工程名
<version>
版本号
<scope>
依赖范围
compile:编译范围(默认依赖范围),编译范围的依赖会被打包
provided:当jdk或者一个容器提供该依赖后才使用。provided依赖在编译和测试时需要,运行时不需要(已经被容器提供了)
runtime:运行和测试时需要,编译时不需要,runtime范围的依赖会被打包
test:编译和运行时不需要,测试编译和测试运行时需要,不会被打包
system:一般不推荐使用,从系统路径引入项目
import:使用该依赖范围的dependency只能放在dependencyManagement中,且需要配合
<type>pom</type>
使用<type>pom</type>
指定该工程的打包方式为pom,即只作为管理管理子工程依赖的项目,不打包使用该import之后就能使子工程都能使用该dependency管理的依赖版本
示例代码:
<dependencyManagement> <dependencies> <!-- SpringCloud的jar包依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR1</version> <type>pom</type> <scope>import</scope> </dependency> <!-- SpringBoot的jar包依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>1.5.9.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
spring-cloud-dependencies
和spring-boot-dependencies
只是作为管理SpringCloud和SpringBoot依赖版本的父工程,在这里使用了import后,该工程的子工程都能免写SpringCloud和SpringBoot的依赖了
<exclude>
依赖排除,一般是为了避免jar包之间的冲突
代码示例:
<dependency>
<groupId>net.javatv.maven</groupId>
<artifactId>auth</artifactId>
<version>1.0.0</version>
<scope>compile</scope>
<!-- 使用excludes标签配置依赖的排除 -->
<exclusions>
<!-- 在exclude标签中配置一个具体的排除 -->
<exclusion>
<!-- 指定要排除的依赖的坐标(不需要写version) -->
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<module>
用于父工程指定子工程共有哪些,因为子工程一般是以模块的形式
示例:
<modules>
<module>demo-module</module>
</modules>
<parent>
用于子工程指定父工程为什么
示例:
<parent>
<artifactId>maven-demo-parent</artifactId>
<groupId>net.javatv.maven</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<dependencyManagement>
对依赖管理,实际上被管理的依赖没有真正被引入到工程
作用:帮助子工程对依赖的统一管理,子工程针对这些依赖可以省略版本号
子工程中引入该依赖时,被管理的依赖才被引入到工程
子工程也可以使用别的版本号来进行修改(一般是做升级)
<properties>
自定义属性,一般用自定义标签来维护版本数据
示例:
<properties>
<!-- 自定义标签,维护Spring版本数据 -->
<spring.version>5.3.19</spring.version>
</properties>
在需要的地方使用${}
来引用自定义的属性名,实现一处修改 处处生效
示例:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
<build>
子标签大致包含:定义约定的目录结构、备用插件管理、生命周期插件
约定的目录结构:
目录名 | 作用 |
---|---|
sourceDirectory | 主题源程序存放目录 |
scriptSourceDirectory | 脚本源程序存放目录 |
testSourceDirectory | 测试源程序存放目录 |
outputDirectory | 主体源程序编译结果输出目录 |
testOutputDirectory | 测试源程序编译结果输出目录 |
resources | 主体资源文件存放目录 |
testResources | 测试资源文件存放目录 |
directory | 构建结果输出目录 |
生命周期插件:
<plugin>
示例:
<plugin>
<artifactId>maven-compiler-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 标签
id:指定唯一标识
phase:关联的生命周期阶段
goals/goal:关联指定生命周期的目标
goals 标签中可以配置多个 goal 标签,表示一个生命周期环节可以对应当前插件的多个目标。
常用插件:
<build>
<plugins>
<!-- plugin 标签:这是我要指定的一个具体的插件 -->
<plugin>
<!-- 插件的坐标。此处引用的 maven-compiler-plugin 插件不是第三方的,是一个 Maven 自带的插件。 -->
<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>
<!--SpringBoot提供的用来改变Maven默认的打包行为-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.5.5</version>
</plugin>
</plugins>
</build>
<profile>
管理不同环境下的配置信息
没有在<profile>
标签中的为默认的profile
激活profile
POM 中没有在 profile 标签里的就是默认的 profile,当然默认被激活
基于环境信息激活:
环境信息包含:JDK 版本、操作系统参数、文件、属性等各个方面。一个 profile 一旦被激活,那么它定义的所有配置都会覆盖原来 POM 中对应层次的元素。可参考下面的标签结构:
<profile>
<id>dev</id>
<activation>
<!-- 配置是否默认激活 -->
<activeByDefault>false</activeByDefault>
<jdk>1.5</jdk>
<os>
<name>Windows XP</name>
<family>Windows</family>
<arch>x86</arch>
<version>5.1.2600</version>
</os>
<property>
<name>mavenVersion</name>
<value>2.0.5</value>
</property>
<file>
<exists>file2.properties</exists>
<missing>file1.properties</missing>
</file>
</activation>
</profile>
Maven 3.2.2 开始:各条件均需满足该配置才会被激活。
多环境管理
<build>
<!-- profile对资源的操作 -->
<resources>
<resource>
<directory>src/main/resources</directory>
<!-- 先排除所有环境相关的配置文件 -->
<excludes>
<exclude>application*.yml</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/resources</directory>
<!-- 是否替换@xx@表示的maven properties/yml属性值 -->
<!--通过开启 filtering,maven 会将properties/yml文件中的@xx@替换 profile 中定义的xx变量/属性-->
<filtering>true</filtering>
<includes>
<include>application.yml</include>
<include>application-${profileActive}.yml</include>
</includes>
</resource>
</resources>
</build>
<!--多环境文件配置-->
<profiles>
<!--开发环境-->
<profile>
<id>dev</id>
<activation>
<!--默认激活-->
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<profileActive>dev</profileActive>
</properties>
</profile>
<!--测试环境-->
<profile>
<id>test</id>
<properties>
<profileActive>test</profileActive>
</properties>
</profile>
<!--正式环境-->
<profile>
<id>prod</id>
<properties>
<profileActive>prod</profileActive>
</properties>
</profile>
</profiles>
在打包的时候可以选择打包其中一个环境的包(可以理解为选定某个profile为active)
SpringBoot 天然支持多环境配置,一般来说,application.yml
存放公共的配置,application-dev.yml
、application-test.yml
、application.prod.yml
分别存放三个环境的配置。
配置文件示例:
# 在这里当选定环境后就会将@profileActive@替换,例如dev
spring:
profiles:
active: '@profileActive@'