帐户系统交付件瘦身解决方案

痛点:

fs-uas-act,fs-uas-job,fs-uas-mng,fs-uas-top,fs-uas-uap这五个服务在自己的Lib目录下分为三个目录,分别是kuas_lib/koca_lib/other_lib,other_lib是间接依赖的三方依赖,量比较大,总体大小为160M左右,现在5个服务就有5个other_lib,会有很多重复的三方依赖,导致制作的交付件比较大,在1.2G左右。

优化思路:

把三方间接依赖包other_lib放到一个指定的公共目录common,common放5个服务间接三方依赖合集,服务启动时根据每个服务根据三方依赖清单从common中拷贝需要的依赖到自己的lib/other_lib目录下。这种方案最后的交付件大小在565M,总体来说减少了600多M。

改造流程

1、修改fs-uas-act,fs-uas-job,fs-uas-mng,fs-uas-top,fs-uas-uap的pom.xml,如下图

2、生成三方依赖清单

添加执行器:

<execution>
  <id>list-dependencies</id>
  <phase>package</phase>
  <goals>
    <goal>list</goal>
  </goals>
  <configuration>
    <excludeGroupIds>
      com.szkingdom.kuas,
      com.szkingdom.koca,
      com.szkingdom.fs
    </excludeGroupIds>
    <outputFile>${project.build.directory}/dependencies.list</outputFile>
    <includeScope>runtime</includeScope>
  </configuration>
</execution>

三方依赖清单会在target目录下如图:

3、在打包时需要把dependencies.list拷贝到同级目录fs-uas-act中

在assembly.xml添加如下内容

<fileSet>
    <directory>${project.build.directory}</directory>
    <outputDirectory>./</outputDirectory>
    <includes>
        <include>dependencies.list</include>
    </includes>
</fileSet>

4、在bin目录中添加脚本,在服务启动前需要进行三方依赖拷贝,按照三方依赖清单,把三方依赖从common目录拷贝到服务的lib/other_lib目录下。

#!/bin/bash

# 假设common目录与当前脚本同级
COMMON_DIR="../../common"
OTHER_LIB_DIR="../lib/other_lib"

# 确保目标目录存在
mkdir -p "$OTHER_LIB_DIR"

while IFS=: read -r group artifact jar version _; do
    # 检查groupId和artifactId是否都存在
    if [ -n "$group" ] && [ -n "$artifact" ]; then
        jar_file="${artifact}-${version}.jar"
        echo ${jar_file}
        # 构建完整的源文件路径
        source_path="${COMMON_DIR}/${jar_file}"

        # 检查源文件是否存在,然后拷贝
        if [ -f "$source_path" ]; then
            cp "$source_path" "$OTHER_LIB_DIR"
            echo "Copied ${jar_file} to other_lib directory."
        else
            echo "File ${source_path} not found, skipping copy."
        fi
    fi
done < ../dependencies.list

5、最后交付件的目录结构:

6、部署

在部署的时候需要先执行copyotherlib.sh,然后再执行startup.sh

最后交付件的大小