欢迎来到信息岛!
adminAdmin  2024-10-10 09:58 信息岛 显示边栏 |   抢沙发  30 
文章评分 1 次,平均分 5.0

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打包

「点点赞赏,手留余香」

还没有人赞赏,快来当第一个赞赏的人吧!

admin给Admin打赏
×
予人玫瑰,手有余香
  • 2
  • 5
  • 10
  • 20
  • 50
2
支付

声明:本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

admin
Admin 关注:0    粉丝:0
这个人很懒,什么都没写

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享