我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源代码是由maven- compiler-plugin完成的。进一步说,每个任务对应了一个插件目标(goal),每个插件会有一个或者多个目标,例如maven- compiler-plugin的compile目标用来编译位于src/main/java/目录下的主源码,testCompile目标用来编译位于src/test/java/目录下的测试源码。
负责将源码和依赖、以及springboot loader相关内容打成一个包。保证打出的包能独立运行。后续有具体打包示例。
仅负责将源码打成jar包,不能独立运行。另外,可以根据你的设置,将依赖jar包路径和程序的主入口定义在所打jar包中的 MANIFEST.MF 文件里。这里只会对当前的主项目打出包,其主项目依赖的jar包则不管,常见配置如下;
- <plugin>
- <groupId>org.apache.maven.pluginsgroupId>
- <artifactId>maven-jar-pluginartifactId>
- <version>3.2.0version>
- <configuration>
-
- <includes>
- <include>
- **/com/**
- include>
- includes>
-
- <archive>
- <manifest>
-
- <addClasspath>trueaddClasspath>
- <classpathPrefix>lib/classpathPrefix>
- <useUniqueVersions>falseuseUniqueVersions>
-
- <mainClass>com.ccccit.springdockerserver.SpringDockerServerApplicationmainClass>
- manifest>
- <manifestEntries>
-
- <Class-Path>resources/Class-Path>
- manifestEntries>
- archive>
-
- <outputDirectory>${project.build.directory}/pack/outputDirectory>
- configuration>
- plugin>
负责将各种依赖打包。也可以根据你的设置,将所打的依赖jar包输出到指定位置。maven-dependency-plugin最大的用途是帮助分析项目依赖,dependency:list能够列出项目最终解析到的依赖列表,dependency:tree能进一步的描绘项目依赖树。maven-dependency-plugin还有很多目标帮助你操作依赖文件,例如dependency:copy-dependencies能将项目依赖从本地Maven仓库复制到某个特定的文件夹下面。
通常maven-dependency-plugin与maven-jar-plugin一块使用,可以打出当前项目包及其依赖包,但是要配置maven-dependency-plugin的输出路径,否则target无法看到依赖包。
常见配置如下:
- <plugin>
- <groupId>org.apache.maven.pluginsgroupId>
- <artifactId>maven-dependency-pluginartifactId>
- <version>3.2.0version>
-
- <executions>
- <execution>
-
- <id>copy-dependenciesid>
- <phase>packagephase>
- <goals>
- <goal>copy-dependenciesgoal>
- goals>
- <configuration>
-
- <outputDirectory>${project.build.directory}/pack/liboutputDirectory>
- configuration>
- execution>
- executions>
- plugin>
负责将正式与测试用到的资源文件导出到指定位置。还负责用资源文件中的参数替换pom文件中对应的占位符,常用配置如下:
- <plugin>
- <groupId>org.apache.maven.pluginsgroupId>
- <artifactId>maven-resources-pluginartifactId>
- <version>3.2.0version>
- <configuration>
- <encoding>UTF-8encoding>
-
- <useDefaultDelimiters>trueuseDefaultDelimiters>
- configuration>
-
- <executions>
- <execution>
- <id>copy-resourcesid>
- <phase>packagephase>
- <goals>
- <goal>copy-resourcesgoal>
- goals>
- <configuration>
- <resources>
- <resource>
-
- <directory>src/main/resourcesdirectory>
- resource>
- resources>
-
- <outputDirectory>${project.build.directory}/pack/resourcesoutputDirectory>
- configuration>
- execution>
- <execution>
- <id>copy-binid>
- <phase>packagephase>
- <goals>
- <goal>copy-resourcesgoal>
- goals>
- <configuration>
- <resources>
- <resource>
-
- <directory>src/main/bindirectory>
- resource>
- resources>
-
- <outputDirectory>${project.build.directory}/pack/binoutputDirectory>
- configuration>
- execution>
- executions>
- plugin>
负责打包。但是至少要指定需要打哪些内容,这个插件才能正常干活儿。
此处直接在start.spring.io上面配置一个spring-web项目,里面引入一个额外的jar包commons-lang来举例说明,代码如下:
- package com.example.demo;
-
- import org.apache.commons.lang3.StringUtils;
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import org.springframework.web.bind.annotation.GetMapping;
- import org.springframework.web.bind.annotation.ResponseBody;
- import org.springframework.web.bind.annotation.RestController;
-
- @SpringBootApplication
- @RestController
- public class DemoApplication {
-
- public static void main(String[] args) {
- SpringApplication.run(DemoApplication.class, args);
- }
-
- @ResponseBody
- @GetMapping("/getInfo")
- public String getInfo() {
- StringUtils.isNotBlank("```");
- return "555666";
- }
-
- }
maven配置如下:
打包结果如下图:

后缀.jar的包是可执行的完整jar包,较大;
后缀.original的包只包含当前项目jar,不包含依赖的commons-lang3的jar包。
maven-dependency-plugin、maven-jar-plugin组合,打出主项目及依赖包,如果涉及resource可使用maven-resource-plugin。
参考来源: