Maven打包插件
打包方式
Maven插件有着自己的一套命名规范。官方插件命名的格式为maven-xxx-plugin,非官方的插件命名为 xxx-maven-plugin
官方打包插件有如下三种:
- maven-jar-plugin,默认的打包插件,用来打普通的project JAR包;
- maven-shade-plugin,用来打可执行JAR包,也就是所谓的fat JAR包;
- maven-assembly-plugin,支持自定义的打包结构,也可以定制依赖项等
非官方打包插件有如下一种:
- spring-boot-maven-plugin 插件打包,在创建SpringBoot工程中,默认用的这个插件。
本文以spring-boot-maven-plugin和maven-assembly-plugin+appassembler-maven-plugin为示例,详细介绍一下这两个插件的使用方式。
使用SpringBoot插件打包
简介
创建 Spring Boot 应用,默认会添加 Maven 插件:spring-boot-maven-plugin。如果项目结构比较简单,可以不用额外配置,使用默认的编译打包就可以。
执行 maven 打包命令时会自动触发 spring-boot-maven-plugin 插件的 repackage 目标,完成后会在 target 目录下生成两个 jar 。
- *.jar:可执行 jar,包含 pom 中的所有依赖,可直接用 java -jar 命令执行。
- *.jar.original:是 Maven 在 Spring Boot 重新打包(repackage)之前创建的原始 jar文件,只有少量的用户类,不包含依赖。
流程:
1、执行打包命令
2、先创建普通 jar包,然后 spring boot repackage 将其重新命名为 *.jar.original 原始包
3、在原始包的基础上添加项目依赖和起动类,最后打成可执行的 jar包。
示例
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot-dependencies.version}</version>
<executions>
<execution>
<goals>
<!-- repackage 目标将用重新打包的包替换原始原包。 -->
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
goals
插件提供了6个maven goal:
- build-info:生成项目的构建信息文件 build-info.properties
- help:用于展示spring-boot-maven-plugin的帮助信息。使用命令行mvn spring-boot:help -Ddetail=true -Dgoal=
可展示goal的参数描述信息。 - repackage:可生成可执行的jar包或war包。插件的核心goal。
- run:运行 Spring Boot 应用
- start:在集成测试阶段,控制生命周期,启动 Spring 应用程序
- stop:在集成测试阶段,控制生命周期,停止已由 start 目标启动的 Spring 应用程序
排除provided类型的依赖
默认情况下,repackage命令所生成的包,会把项目中所有的依赖都打进去。
但其实在项目中scope为provided的依赖,比如 lombok、mybatis-plus等,只作用于编译阶段,编译完成就没用了。
若除去provided依赖,可以使用如下的配置:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
指定Mainclass类
如果未指定,main将使用找到的第一个包含方法的编译类。
也就是说如果只有一个main方法,那不需要去指定,如果你这个模块存在两个主类,那么就需要在插件中指定具体哪个启动类了。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>net.wanho.Application</mainClass>
<layout>ZIP</layout>
</configuration>
</plugin>
layout 属性用来指定打成 jar 还是war 文件,可用的值包括:ZIP 、JAR 、WAR、 NONE 。默认JAR
在使用spring-boot-maven-plugin的下生成普通的jar包
前面说了,如果使用该插件,那么打出来的包是一个可执行的jar包,这样的jar包,在被别的项目引用的时候,可能会出问题。
那如何打成一个普通的jar包。
当然你可以把这个插件注释掉,重新打包。不过也有简单方式。
解决办法
第一种:通过命令
mvn clean package -D spring-boot.repackage.skip=true
加上-Dspring-boot.repackage.skip=true参数即可,此时只会生成一个普通的jar包
第二种:通过配置
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
这两种方式打出来的包就是没有依赖jar的普通包了。
思考
用SpringBoot快速开发时,通常用spring-boot-maven-plugin插件将SpringBoot的应用程序打包成jar文件,然后通过java -jar运行,很方便。但是如果是部署到服务器上,每次更改代码后替换的包都比较大,至少30MB以上,依赖jar多的甚至超过100MB,传输效率就降低了,其实真正的代码jar是很小的,所以要想办法给jar瘦身,再来看看assmebly的方式吧。
appassembler-maven-plugin插件
官网介绍:
appassembler是一个 Maven 插件,用于将 Java 应用程序打包成可以在命令行中执行的独立应用程序。
它能将项目依赖jar能够打包目录中,并自动生成windows或unix启动脚本,生成相应的启动脚本和目录结构。
支持平台:
Unix-variants
Windows NT (Windows 9x is NOT supported)
Java Service Wrapper (JSW) 可以很方便得在各个平台(windows,linux,max os)管理Java进程,管理JVM,启动停止,开机启动,管理内存溢出的异常 标准版还可以发错误日志email,检测死锁。
pom.xml
<build>
<plugins>
<!-- spring-boot-maven-plugin插件与appassembler-maven-plugin插件不兼容,不要将spring-boot-maven-plugin插件引进来 -->
<!--
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
-->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>appassembler-maven-plugin</artifactId>
<version>2.1.0</version>
<configuration>
<!-- 生成linux, windows两种平台的执行脚本 -->
<platforms>
<platform>windows</platform>
<platform>unix</platform>
</platforms>
<!-- 针对不同平台生成不同类型的启动脚本 -->
<binFileExtensions>
<unix>.sh</unix>
<windows>.bat</windows>
</binFileExtensions>
<!--生成的项目的目录位置,这里的client是项目的名称,你可以根据你的需要自己随便命名-->
<assembleDirectory>${project.build.directory}/client</assembleDirectory>
<!-- flat与lib共同决定将项目用的的所有jar包复制到lib目录下 -->
<repositoryLayout>flat</repositoryLayout>
<repositoryName>lib</repositoryName>
<!-- 可执行脚本的目录 -->
<binFolder>bin</binFolder>
<!--配置文件存放在conf目录路径-->
<configurationDirectory>conf</configurationDirectory>
<!--是否copy配置文件-->
<copyConfigurationDirectory>true</copyConfigurationDirectory>
<!--从哪里copy配置文件-->
<configurationSourceDirectory>src/main/resources</configurationSourceDirectory>
<includeConfigurationDirectoryInClasspath>true</includeConfigurationDirectoryInClasspath>
<!-- 打包的jar,以及maven依赖的jar放到这个目录里面 -->
<repositoryName>lib</repositoryName>
<!--编码,日志-->
<encoding>UTF-8</encoding>
<logsDirectory>logs</logsDirectory>
<tempDirectory>tmp</tempDirectory>
<!--java启动参数-->
<extraJvmArguments>-Xms128m</extraJvmArguments>
<programs>
<program>
<!--指定主类,脚本名。会生成shell/bat两种类型,也可用platforms指定运行平台-->
<mainClass>net.wanho.zpan.service.Application</mainClass>
<!-- 生成的脚本文件的名称,比如start.sh,你也可以根据你的需要命名成其他名字 -->
<name>start</name>
</program>
</programs>
</configuration>
<!-- 如果不配置 generate-daemons,则打包命令为 mvn clean package appassembler:assemble -->
<!-- 如果配置了 generate-daemons,打包命令可以是 mvn clean package 也可以是 mvn clean package appassembler:assemble -->
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>assemble</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
执行下面的打包命令
mvn clean package appassembler:generate-daemons
打包后生成的目录
appassembler 插件打包后生成的资源统统放在 target/client目录下
assmebly简介
maven-assembly-plugin是maven中针对打包任务而提供的标准插件,可以实现自定义打包。
主要提供如下功能:
- 提供一个把工程依赖元素、模块、网站文档等其他文件存放到单个归档文件里
- 打包成指定格式分发包,支持各种主流的格式如zip、tar.gz、jar和war等,具体打包哪些文件是高度可控的
- 能够自定义包含/排除指定的目录或文件
上面的示例中appassembler-maven-plugin 可以为 Java 项目自动生成启动脚本,但是做不到将生成的资源打包成压缩包,需要配合插件 maven-assembly-plugin 才能做到。
pom.xml
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<!-- 压缩包名称 -->
<finalName>${project.artifactId}</finalName>
<descriptors>
<descriptor>src/main/assembly/assembly.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
src/main/assembly/assembly.xml
<?xml version="1.0" encoding="UTF-8"?>
<assembly>
<id>${project.version}</id>
<formats>
<format>tar.gz</format>
<format>zip</format>
</formats>
<includeBaseDirectory>true</includeBaseDirectory>
<fileSets>
<!-- 将appassembler插件生成的资源输出到压缩包的根目录下 -->
<fileSet>
<directory>${basedir}/target/client/</directory>
<outputDirectory>/</outputDirectory>
<fileMode>777</fileMode>
</fileSet>
</fileSets>
</assembly>
执行mvn clean package
打包
还没有人赞赏,快来当第一个赞赏的人吧!
- 2¥
- 5¥
- 10¥
- 20¥
- 50¥
声明:本文为原创文章,版权归信息岛所有,欢迎分享本文,转载请保留出处!