一、常用标签及属性
1. maven 依赖属性:groupId、artifactId、version
groupId、artifactId、version,当使用该插件时会从本地仓库中搜索,如果没有即从远程仓库下载
2.插件执行: execution,id ,phase,goals,configuration
execution 配置包含一组指示插件如何执行的属性:
id : 执行器命名
phase:在什么阶段执行
phase执行是有顺序的,如果执行mvn verify,则会顺序执行validate,compile,test和package。
- validate – 用来验证项目是否正确或者项目所需要的信息是否可用。
- compile – 用来编译项目代码
- test – 执行代码中的单元测试
- package – 将编译后的代码进行打包,打包可有很多种方式,比如:jar,war等
- verify – 执行集成测试
- install – 将项目安装到本地仓库中,供有依赖关系的其他项目使用
- deploy – 将项目部署到远程仓库,以便共享给其他的用户
goals:执行一组什么目标或功能,定义在maven中的plugin中的,可以包含在Phases里面执行,也可以单独用命令执行。
configuration:执行目标所需的配置文件
3.聚合: <modules>
指将多个模块整合在一起,统一构建,避免一个一个的构建。聚合需要个父工程,然后使用
4.可选依赖:<optional>
可选依赖表示这个依赖不是必须的。
5.排除依赖:<exclusions>
即排除指定的间接依赖。通过配置 <exclusions> 配置排除指定组件
6.依赖范围 : <scope>, <systemPath>
像junit 这个组件我们只有在运行测试用例的时候去要用到,这就没有必要在打包的时候把junit.jar包过构建进去,可以通过Mave的依赖范围配置<scope>来达到这种目的。maven总共支持以下四种依赖范围:
compile(默认): 编译范围,编译和打包都会依赖。
provided:提供范围,编译时依赖,但不会打包进去。如:servlet-api.jar
runtime:运行时范围,打包时依赖,编译不会。如:mysql-connector-java.jar
test:测试范围,编译运行测试用例依赖,不会打包进去。如:junit.jar
system:表示由系统中CLASSPATH指定。编译时依赖,不会打包进去。配合<systemPath> 一起使用。
注:system除了可以用于引入系统classpath中包,也可以用于引入系统非maven收录的第三方Jar,做法是将第三方Jar放置在项目的 lib 目录下,然后配置相对路径,但因system不会打包进去所以需要配合maven-dependency-plugin插件配合使用。
7.依赖管理:<dependencyManagement>
通过继承的特性,子工程是可以间接依赖父工程的依赖,但多个子工程依赖有时并不一至,这时就可以在父工程中加入
通过 <dependencyManagement> 可实现在在外面的父pom 中统一管理所有依赖的版本。
<!-- 父工程中声明 junit 4.12 --> <dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies> </dependencyManagement> <!-- 子工程中引入 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency>
8.项目属性: <properties>
9.maven 依赖引用属性:type
maven引入依赖,默认使用的type属性为 jar 类型。当需要引用很多依赖并进行统一管理时,则需要在dependencyManagement中声明引用的依赖版本。maven提供了引用类型type为pom类型的依赖,这种依赖可以直接使用该依赖中声明的所有jar的依赖管理。如spring-boot,spring-cloud都提供了这样的依赖支持:
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.2.2.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
子pom使用父pom依赖,则可以直接使用,因为其在上面的pom内部已经声明了引用的版本等信息:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
10.maven 默认的属性
${basedir} 项目根目录 ${version} 表示项目版本; ${project.basedir} 同${basedir}; ${project.version} 表示项目版本,与${version}相同; ${project.build.directory} 构建目录,缺省为target ${project.build.sourceEncoding} 表示主源码的编码格式; ${project.build.sourceDirectory} 表示主源码路径; ${project.build.finalName} 表示输出文件名称; ${project.build.outputDirectory} 构建过程输出目录,缺省为target/classes
二、常用的maven plugin:maven-dependency-plugin和maven-jar-plugin。
maven-dependency-plugin:
maven中的依赖jar包是存放在maven的本地仓库中的,如果项目中依赖了某些jar包,在部署的时候还需要这些依赖的jar包拷贝出来,非常不方便,有了maven-dependency-plugin,则可以借用它的copy-dependencies来将项目的依赖jar包拷贝出来,如下所示:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>3.1.2</version> <executions> <execution> <id>copy</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory> ${project.build.directory}/lib </outputDirectory> </configuration> </execution> </executions>
</plugin>
goals是和相应的phase相关联的,在上面的例子中,我们将copy-dependencies和package相关联,则在我们执行mvn package的时候就会自动执行copy-dependencies,从配置文件可以知道,我们将会把项目的依赖jar包拷贝到项目的build目录的lib目录下。
maven-jar-plugin:
有了依赖的lib,可以将main程序打包成为一个可执行的jar包。这时候我们就需要使用到maven-jar-plugin。
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.2.0</version> <configuration> <archive> <manifest> <mainClass>com.flydean.MavenClass</mainClass> </manifest> </archive> </configuration> </plugin>
为了生成可执行的jar包,我们需要在MANIFEST.MF文件中添加mainClass文件的路径,这样在执行jar包的时候,无需额外的参数即可运行。
遗憾的是,如果我们的class文件用到了外部jar包的依赖时候,jar包直接运行会出错,因为找不到所依赖的jar包。
在介绍maven-dependency-plugin的时候,我们已经把所用到的lib拷贝出来了,这里我们可以直接使用:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.2.0</version> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <mainClass>com.flydean.MavenClass</mainClass> </manifest> </archive> </configuration> </plugin>