关于maven自定义打包结构

背景

为了方便实施运维同事的部署工作,以前项目都是直接构建一个jar包,现在需要将配置文件、相关说明文档等暴露出来,供实施同事修改。

方法

  • 首先使用maven-jar-plugin插件,可以把整个项目打成一个jar包;
  • 使用maven-dependency-plugin插件,可以把刚刚打的jar中的依赖jar包全部复制出来到我们自定义的文件夹中;
  • 最后使用maven-assembly-plugin插件,来自定义我们希望的文件结构即可。

maven配置

    <build>
        <defaultGoal>compile</defaultGoal>

        <finalName>${project.artifactId}</finalName>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <targetPath>${project.build.outputDirectory}</targetPath>
                <filtering>false</filtering>
            </resource>
        </resources>


        <plugins>
            <!-- 配置资源文件的打包路径 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <!-- 可选配置 -->
                <configuration>
                    <source>1.8</source>
                    <!-- 源代码使用的JDK版本 -->
                    <target>1.8</target>
                    <!-- 生成的目标class文件的JDK编译版本 -->
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <outputDirectory>${project.build.directory}/${project.artifactId}/</outputDirectory>
                    <!-- 排除不需要打进jar包的文件,也就是config目录中的文件 -->
                    <excludes>
                        <include>application.yml</include>
                        <include>application-dev.yml</include>
                        <include>application-sit.yml</include>
                        <include>application-prod.yml</include>
                        <include>logback.xml</include>
                    </excludes>
                    <archive>
                        <!-- 程序入口,即main函数 -->
                        <manifest>
                            <mainClass>com.tcm.syndrome.scale.TcmSyndromeScaleApplication</mainClass>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <useUniqueVersions>false</useUniqueVersions>
                        </manifest>
                        <manifestEntries>
                            <Class-Path>config/ .</Class-Path>
                        </manifestEntries>
                    </archive>
                </configuration>
            </plugin>

            <!-- 把jar复制到target目录下的lib目录下 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <!-- ${project.build.directory}就是我们通常看到的target目录 -->
                            <outputDirectory>${project.build.directory}/${project.artifactId}/lib</outputDirectory>
                            <excludeTransitive>false</excludeTransitive>
                            <stripVersion>false</stripVersion>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
                <version>3.0.0</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>jar-no-fork</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <!-- 跳过测试编译 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <skip>true</skip>
                </configuration>
            </plugin>

            <plugin>
                <!-- 添加MAVEN提供的ASSEMBLY插件,默认使用spring-boot-maven-plugin打包,将项目所有的依赖打入到项目的JAR包里-->
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.1.1</version>
                <configuration>
                    <descriptors>
                        <descriptor>assembly.xml</descriptor>
                    </descriptors>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <!--绑定到MAVEN的操作类型上-->
                        <phase>package</phase>
                        <!--仅仅运行一次-->
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

        </plugins>
    </build>

assembly配置

<assembly>
    <!--
        ID标签必须指定,ID会追加到打包的名字的末尾,项目名为:servicex-test-0.0.1-SNAPSHOT,
        打包后的名字为:servicex-test-0.0.1-SNAPSHOT-bin.tar.gz
     -->
    <id>bin</id>

    <!-- 打包文件的类型,如果要输出多个类型的打包文件,则定义多个 -->
    <formats>
        <format>tar.gz</format>
        <format>tar</format>
        <format>zip</format>
    </formats>
    <includeBaseDirectory>true</includeBaseDirectory>

    <!--文件复制与设置-->
    <fileSets>
        <!--
            0755: 即用户具有读/写/执行权限,组用户和其它用户具有读写权限;
            0644: 即用户具有读写权限,组用户和其它用户具有只读权限;
        -->
        <!-- 1. 将src/main/resources/bin目录下的所有文件输出到打包后的bin目录中 -->
        <fileSet>
            <directory>src/main/resources/bin</directory>
            <outputDirectory>bin</outputDirectory>
            <fileMode>0755</fileMode>
            <!--如果是执行脚本,一定要改为unix,否则当在windows上面时,脚本会出现dos编写问题-->
            <lineEnding>unix</lineEnding>
            <!-- 是否进行属性替换 -->
            <filtered>true</filtered>
        </fileSet>

        <!-- 2. 将src/main/assembly/sql目录下的所有文件输出到打包后的sql目录中 -->
        <fileSet>
            <directory>src/main/resources/sql</directory>
            <outputDirectory>sql</outputDirectory>
            <fileMode>0644</fileMode>
        </fileSet>

        <!-- 3. 将src/main/resources下配置文件打包到config目录 -->
        <fileSet>
            <directory>src/main/resources</directory>
            <outputDirectory>/config</outputDirectory>
            <includes>
                <include>*.yml</include>
                <include>*.xml</include>
            </includes>
            <!-- 是否进行属性替换 -->
            <filtered>true</filtered>
        </fileSet>

        <!-- 4. 将项目启动JAR打包到lib目录中 -->
        <fileSet>
            <directory>target/${project.artifactId}/lib</directory>
            <outputDirectory>lib</outputDirectory>
        </fileSet>

        <fileSet>
            <directory>target/${project.artifactId}</directory>
            <outputDirectory>.</outputDirectory>
                <includes>
                    <include>*.jar</include>
                </includes>
        </fileSet>

        <fileSet>
            <directory>/src/main/resources/doc</directory>
            <outputDirectory>/doc</outputDirectory>
            <includes>
                <include>*.md</include>
            </includes>
            <fileMode>0644</fileMode>
        </fileSet>

        <!-- 5. 将项目说明文档打包到doc目录中 -->
        <fileSet>
            <directory>.</directory>
            <outputDirectory>/doc</outputDirectory>
            <includes>
                <include>*.md</include>
            </includes>
            <fileMode>0644</fileMode>
        </fileSet>
    </fileSets>
</assembly>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Honey Ro

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值