maven(二) 构建配置
maven 构建配置
maven构建主要依赖各种插件,这插件有官方的,有第三方的;类似于npm 包的插件。在打包过程跟webpack一样,按照一定的生命周期去添加依赖,编译,移动资源改变输出目录。因此在打包过程中插件是一等公民
maven工作流程图 引用大佬们的图
1.maven提供了三套独立的生命周期,每套生命周期都有自己的作用,都是独立运行,执行顺序很重要
- clean:项目清理的处理 (常用)
- default(或 build):构建项目
- site:建立项目站点
2.生命周期主要是maven暴露给插件绑定执行时机的,也有利于理解maven的工作流程,也能理解插件如何工作的;
(1)clean 的生命周期,一般是直接清除,不会在插件中使用clean 的生命周期;
- pre-clean:执行一些需要在clean之前完成的工作
- clean:移除所有上一次构建生成的文件 (常用)
- post-clean:执行一些需要在clean之后立刻完成的工作
(2)default 的生命周期
validate(校验) 校验项目是否正确并且所有必要的信息可以完成项目的构建过程。
initialize(初始化) 初始化构建状态,比如设置属性值。
generate-sources(生成源代码) 生成包含在编译阶段中的任何源代码。
process-sources(处理源代码) 处理源代码,比如说,过滤任意值。
generate-resources(生成资源文件) 生成将会包含在项目包中的资源文件。
process-resources (处理资源文件) 复制和处理资源到目标目录,为打包阶段最好准备。
compile(编译) 编译项目的源代码。
process-classes(处理类文件) 处理编译生成的文件,比如说对Java class文件做字节码改善优化。
generate-test-sources(生成测试源代码) 生成包含在编译阶段中的任何测试源代码。
process-test-sources(处理测试源代码) 处理测试源代码,比如说,过滤任意值。
generate-test-resources(生成测试资源文件) 为测试创建资源文件。
process-test-resources(处理测试资源文件) 复制和处理测试资源到目标目录。
test-compile(编译测试源码) 编译测试源代码到测试目标目录.
process-test-classes(处理测试类文件) 处理测试源码编译生成的文件。
test(测试) 使用合适的单元测试框架运行测试(Juint是其中之一)。
prepare-package(准备打包) 在实际打包之前,执行任何的必要的操作为打包做准备。
package(打包) 将编译后的代码打包成可分发格式的文件,比如JAR、WAR或者EAR文件。
pre-integration-test(集成测试前) 在执行集成测试前进行必要的动作。比如说,搭建需要的环境。
integration-test(集成测试) 处理和部署项目到可以运行集成测试环境中。
post-integration-test(集成测试后) 在执行集成测试完成后进行必要的动作。比如说,清理集成测试环境。
verify (验证) 运行任意的检查来验证项目包有效且达到质量标准。
install(安装) 安装项目包到本地仓库,这样项目包可以用作其他本地项目的依赖。
deploy(部署) 将最终的项目包复制到远程仓库中与其他开发者和项目共享。
(3)site用来发布站点的(使用少)
pre-site:执行生成站点前的准备工作。
site:生成站点文档。
post-site:执行生成站点后需要收尾的工作。
site-deploy:将生成的站点发布到服务器上。
3.插件配置分为手动绑定时机、目标和自动绑定
maven的生命周期是给插件提供一个可执行的时机,在执行到生命周期时执行绑定对应周期的插件;maven 可以查看插件提供查看插件具体能做的事儿,插件的参数;这个能解决没有插件文档的问题
mvn help:describe -DgroupId=org.apache.maven.plugins -DartifactId=maven-jar-plugin -Ddetail=true
可以看到每个插件提供的功能goal ,已经每个goal的参数;
(1)插件中个性化配置例:将配置文件单独输出到指定的位置
(1.1)查看插件的goal mvn help:describe -DgroupId=org.apache.maven.plugins -DartifactId=maven-resources-plugin -Ddetail=true;看到部分参数
This plugin has 4 goals: //该插件有四个功能
resources:copy-resources //复制资源
Description: Copy resources of the configured plugin attribute resources
Implementation: org.apache.maven.plugins.resources.CopyResourcesMojo
Language: java
Available parameters:
addDefaultExcludes (Default: true) //默认排除文件
By default files like .gitignore, .cvsignore etc. are excluded which
means they will not being copied. If you need them for a particular
reason you can do that by settings this to false. This means all files
like the following will be copied.
- Misc: **/*~, **/#*#, **/.#*, **/%*%, **/._*
- CVS: **/CVS, **/CVS/**, **/.cvsignore
- RCS: **/RCS, **/RCS/**
- SCCS: **/SCCS, **/SCCS/**
- VSSercer: **/vssver.scc
- MKS: **/project.pj
(2)个性化配置,主要记住两个标签phase,goals 分部对应的maven 的执行周期也就是上述周期,goals是插件自己提供的功能;也就是将插件的功能绑定到maven 执行周期上,等待被调用。
jar:jar
Description: Build a JAR from the current project.
Implementation: org.apache.maven.plugins.jar.JarMojo
Language: java
Bound to phase: package //这个插件就自动绑定了执行时机,所以只需要给参数就能运行;
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
<executions>
<execution>
<id>copy_test</id>
<phase>validate</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${project.basedir}/target/conf3</outputDirectory>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
(1.3)上述是自定义配置,也可以使用默认配置;一个插件会有自己默认的周期和功能;这种是正对插件绑定了运行时机的;如果没有需要自己绑定
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<outputDirectory>${project.basedir}/target/conf3</outputDirectory>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</configuration>
</plugin>
3.插件使用总结
就是将插件绑定到对应的maven生命周期上,去做插件能做的事情(goal);就只有两点
- 1.maven的生命周期,
- 2.插件的功能,这个可以通过mvn help:Describe -DgroupId=org.apache.maven.plugins -DartifactId=maven-resources-plugin -Ddetail=true查看具体goal及参数
*3.插件自定义配置,手动绑定maven执行时机,插件的功能;需要executions -> execution -> phase 与executions -> execution -> goals,然后再配置参数
*4.插件默认配置,直接通过 configuration配置参数
*5.maven-jar-plugin 只会打包项目代码,不会处理依赖jar ,如果用这个打包需要用maven-dependency-plugin处理依赖
这个跟前端的webpack 类似但是不一样,webpack 插件周期绑定是写死的没有maven灵活;好在maven也提供开箱即用(maven 的最佳实践)
conf文件,依赖包全都打在一个jar中,如果需要拆分就需要自定义插件
附一个常用打包pom.xml
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>asd</groupId>
<artifactId>asd</artifactId>
<version>1.0-SNAPSHOT</version>
<name>lasd</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- Spring boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot</artifactId>
<version>2.0.4.RELEASE</version>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.6</version>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.4</version>
</dependency>
<!-- web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.0.4.RELEASE</version>
<scope>compile</scope>
</dependency>
<!--日志方案 slf4j + logback-->
<!--日志接口-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<!--日志实现-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<!--只会将项目代码打包成为jar不会帮你处理依赖 ,如果需要打胖包就要更使用maven-assembly-plugin 来解决了-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<archive>
<!--主类: 使用清单文件 -->
<manifest>
<addClasspath>true</addClasspath>
<mainClass>org.asdasd.cn.App</mainClass>
<classpathPrefix>lib/</classpathPrefix>
</manifest>
</archive>
</configuration>
</execution>
</executions>
</plugin>
<!-- 拷贝jar包 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<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>
</plugins>
</build></project>