本文采用appassembler-maven-plugin插件来配置打包并生成脚本,Application Assembler插件是一个Maven插件,用于生成用于启动Java应用程序的脚本。项目本身的所有依赖关系和工件都放置在已生成的Maven存储库中的已定义汇编目录中。所有工件(依赖关系+项目中的工件)都将添加到生成的bin脚本中的类路径中。官网介绍

我们先来看下打包后最终目录结构:

1.目录结构介绍

app 是我们指定的打包文件生成的根目录,可以在项目的pom中修改配置
app/bin 启动脚本存放目录
app/conf 项目配置文件存放目录
app/lib 项目所有依赖包存放目录
app/logs 日志存放目录
app/tmp 临时文件存放目录

classes 是我们项目正常编译输出地址
classes/cn java文件编译目录
classes/conf 是我们指定的配置文件编译存放目录,由于我这里*.yml配置文件中存在变量引用所以最终打包配置文件信息从这个目录来copy

2.修改pom文件配置

完整配置如下

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <artifactId>yunmo-server</artifactId>
        <groupId>cn.org.yunmo</groupId>
        <version>1.0</version>
    </parent>
    <artifactId>yunmo-biz-demo</artifactId>
    <version>1.0</version>
    <name>yunmo-biz-demo</name>
    <description>业务测试demo</description>
    <packaging>jar</packaging>
    <dependencies>
        <!--基础实体类映射模块-->
        <dependency>
            <groupId>cn.org.yunmo</groupId>
            <artifactId>yunmo-base-entity</artifactId>
            <version>${yunmo.version}</version>
        </dependency>
        <!--基础dao接口模块-->
        <dependency>
            <groupId>cn.org.yunmo</groupId>
            <artifactId>yunmo-base-dao</artifactId>
            <version>${yunmo.version}</version>
        </dependency>
        <!--基础mapper文件模块-->
        <dependency>
            <groupId>cn.org.yunmo</groupId>
            <artifactId>yunmo-base-mapper</artifactId>
            <version>${yunmo.version}</version>
        </dependency>
        <!--基础服务类模块-->
        <dependency>
            <groupId>cn.org.yunmo</groupId>
            <artifactId>yunmo-base-service</artifactId>
            <version>${yunmo.version}</version>
        </dependency>
        <dependency>
            <groupId>cn.org.yunmo</groupId>
            <artifactId>yunmo-util</artifactId>
            <version>${yunmo.version}</version>
        </dependency>
        <dependency>
            <groupId>cn.org.yunmo</groupId>
            <artifactId>yunmo-exception</artifactId>
            <version>${yunmo.version}</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
    <properties>
        <!-- 文件拷贝时的编码 -->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <!-- 编译时的编码 -->
        <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
    </properties>
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
                <!--指定配置文件编译的目标地址,当前项目配置编译地址为:target/classes/conf-->
                <targetPath>conf</targetPath>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <!-- Apache Maven编译器插件 -->
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>11</source>
                    <target>11</target>
                    <encoding>UTF-8</encoding>
                    <!-- 必须添加compilerArgument配置,才能使用JFinal的Controller方法带参数的功能 -->
                    <compilerArgument>-parameters</compilerArgument>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>appassembler-maven-plugin</artifactId>
                <version>1.10</version>
                <configuration>
                    <!-- 文件生成的根目录 -->
                    <assembleDirectory>${project.build.directory}/app</assembleDirectory>
                    <!-- 打包的jar,以及maven依赖的jar放到这个目录里面 -->
                    <repositoryName>lib</repositoryName>
                    <!-- 可执行脚本的目录 -->
                    <binFolder>bin</binFolder>
                    <!-- 配置文件的目标目录 -->
                    <configurationDirectory>conf</configurationDirectory>
                    <!-- 拷贝配置文件到上面的目录中 -->
                    <copyConfigurationDirectory>true</copyConfigurationDirectory>
                    <!-- 从哪里拷贝配置文件 (默认src/main/config) -->
                    <!--这里由于配置文件*.yml中存在变量引用,copy时使用编译后的配置文件-->
                    <configurationSourceDirectory>target\classes\conf</configurationSourceDirectory>
                    <!--在目标文件的开头包含目标配置目录bin脚本中的类路径声明-->
                    <includeConfigurationDirectoryInClasspath>true</includeConfigurationDirectoryInClasspath>
                    <!-- lib目录中jar的存放规则,默认是${groupId}/${artifactId}的目录格式,flat表示直接把jar放到lib目录 -->
                    <repositoryLayout>flat</repositoryLayout>
                    <!--解决windows脚本classpath引用jar包路径过长导致无法启动-->
                    <useWildcardClassPath>true</useWildcardClassPath>
                    <encoding>UTF-8</encoding>
                    <logsDirectory>logs</logsDirectory>
                    <tempDirectory>tmp</tempDirectory>
                    <!-- 生成linux, windows两种平台的执行脚本 -->
                    <platforms>
                        <platform>windows</platform>
                        <platform>unix</platform>
                    </platforms>
                    <programs>
                        <!-- 程序打包:mvn package appassembler:assemble 可以配置多个program-->
                        <program>
                            <!-- 生成的脚本文件的名称 -->
                            <id>${project.name}</id>
                            <mainClass>cn.org.yunmo.bizdemo.YunmoBizDemoApplication</mainClass>
                        </program>
                    </programs>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

注意事项:

1.配置文件编译输出路径

如果你把配置文件编译目录的的targetPath修改了记得一定要把configurationSourceDirectory的路径也做对应修改保证copy的配置文件路径是你项目配置文件编译后输出地址

······
<resources>
    <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
        <!--指定配置文件编译的目标地址,当前项目配置编译地址为:target/classes/conf-->
        <targetPath>你的编译文件夹名称</targetPath>
    </resource>
</resources>
······
<configuration>
    ······
    <!-- 从哪里拷贝配置文件 (默认src/main/config) -->
    <!--这里由于配置文件*.yml中存在变量引用,copy时使用编译后的配置文件-->
    <configurationSourceDirectory>target\classes\你的编译文件夹名称</configurationSourceDirectory>
    ······
</configuration>
······

2.配置启动函数类

修改mainClass标签的启动类为你项目的启动类路径
如:cn.org.yunmo.bizdemo.YunmoBizDemoApplication

······
<programs>
    <!-- 程序打包:mvn package appassembler:assemble 可以配置多个program-->
    <program>
        <!-- 生成的脚本文件的名称 -->
        <id>${project.name}</id>
        <mainClass>你的启动函数类路径</mainClass>
    </program>
</programs>
······

你使用时候只需要把上面<build>...</build>标签中的内容复制到你的项目中的pom中,把主程序启动函数<mainClass>...</mainClass>地址修改为你的springboot启动类路径就可以啦

3.maven打包

有两种方式来打包

1、idea配置打包(建议)

首先我们来配置个maven启动项,点击点击启动项后面的倒三角

然后我们点击Edit Configurations...

点击左上方 + 号 找到maven然后点击

选择你的maven项目(1、2),输入打包命令(3),第4步可以选择你打包需要使用的配置文件填写对应的后缀名我这里就用-dev使用dev配置文件,点击apply(5),最后点击ok(6)保存配置

随后你就会看到上面启动项中多了刚才添加的maven打包配置,选择刚才配置的maven启动项,点击run执行(建议打包前先执行一次maven clean,防止有其他编译文件影响打包内容)

成功执行后控制台会输出 BUILD SUCCESS,点开target目录你就会发现目录下多了个我们开头介绍的app文件夹,这就是我们打包后的文件夹

注意: 如果你修改了pom中打包根目录配置<assembleDirectory>${project.build.directory}/app</assembleDirectory> 那么这个文件夹位置名称会跟着发生改变

2、使用命令行命令打包 (需要配置maven环境变量)

首先查看是否已经配置maven环境变量

mvn -v

如果已经配置会输出类似如下结果:路径版本号等,如果没有配置则需配置maven环境变量这里不再演示

进入项目根目录,并输入打包命令

cd D:\IProject\yunmo\yunmo-server\yunmo-biz-demo

mvn package appassembler:assemble


打包成功一样会在控制台输出 BUILD SUCCESS 和一些打包信息。
如copy了几个配置文件到哪里,耗时多久等信息,并会生成对应打包目录app

4.启动项目

找到打包后的文件夹targer/app,我们点开bin目录会有两个文件.bat结尾的是windows启动脚本,另一个是linux启动脚本

windows启动

  1. 直接双击bat脚本启动
  2. 通过命令行或idea终端(Terminal)进入到当前bin目录路径,输入你的脚本名称.bat,回车
cd target\app\bin

yunmo-biz-demo.bat

cmd

idea

linux启动

./app/bin/yunmo-biz-demo

5.服务验证

从启动的控制台找到你的端口和content path(springboot项目默认为'')

打开浏览器输入你的项目地址, ip:端口/content path,我这里content path为空可以不填,出现下面这个界面就表示成功了

localhost:9101

localhost:9101/customerMessage/aboutMe

🌈 以上就是全部步骤啦,有问题欢迎在下方给我留言~