本文講訴如何把jar里的lib依賴包獨立出來,方便更新服務時,縮小jar的體積,下面以若依的system服務為例,配置中的路徑請酌情修改,主要提供大致配置邏輯
?
第一步:修改項目的pom.xml,調整build的配置
<build><finalName>${project.artifactId}</finalName><plugins><!--這是默認的打包方式-->
<!-- <plugin>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-maven-plugin</artifactId>-->
<!-- <version>${spring-boot.version}</version>-->
<!-- <executions>-->
<!-- <execution>-->
<!-- <goals>-->
<!-- <goal>repackage</goal>-->
<!-- </goals>-->
<!-- </execution>-->
<!-- </executions>-->
<!-- </plugin>--><!-- 以下是分離lib的打包方式 --><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><executable>true</executable><layout>ZIP</layout><!--解決windows命令行窗口中文亂碼--><jvmArguments>-Dfile.encoding=UTF-8</jvmArguments><!--這里是填寫需要包含進去的jar,必須項目中的某些模塊,會經常變動,那么就應該將其坐標寫進來如果沒有則nothing ,表示不打包依賴 --><includes><include><groupId>nothing</groupId><artifactId>nothing</artifactId></include></includes></configuration></plugin><!--拷貝依賴到jar外面的lib目錄--><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><executions><execution><id>copy</id><phase>package</phase><goals><goal>copy-dependencies</goal></goals><configuration><!--指定的依賴路徑--><outputDirectory>${project.build.directory}/lib</outputDirectory><excludeScope>provided</excludeScope></configuration></execution></executions></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><configuration><archive><manifest><!--指定啟動類--><mainClass>org.dromara.system.RuoYiSystemApplication</mainClass><addClasspath>true</addClasspath><classpathPrefix>lib/</classpathPrefix></manifest></archive></configuration></plugin></plugins></build>
打包后會得到分離的jar和lib
打開jar里的MANIFEST.MF,可看到指定了依賴包的路徑
第二步:構建dockerfile,不同的就是復制lib目錄到鏡像中
# 貝爾實驗室 Spring 官方推薦鏡像 JDK下載地址 https://bell-sw.com/pages/downloads/
FROM bellsoft/liberica-openjdk-debian:17.0.11-cds
#FROM bellsoft/liberica-openjdk-debian:21.0.3-cds
#FROM findepi/graalvm:java17-nativeLABEL maintainer="Gavino"RUN mkdir -p /gavino/system/logs \/gavino/system/temp \/gavino/skywalking/agentWORKDIR /gavino/systemENV SERVER_PORT=9201 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS=""EXPOSE ${SERVER_PORT}#復制依賴 jar
COPY ${OUT_DIRECTORY}/lib ./libADD ruoyi-system.jar ./app.jarENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} \#-Dskywalking.agent.service_name=ruoyi-system \#-javaagent:/gavino/skywalking/agent/skywalking-agent.jar \-XX:+HeapDumpOnOutOfMemoryError -XX:+UseZGC ${JAVA_OPTS} \-jar app.jar
項目運行時,會根據MANIFEST.MF中配置的路徑加載依賴包,所以只需要復制lib到相應目錄
第三步:編寫docker-compose,注意dockerfile的路徑以及網絡配置,以下是我的配置,酌情修改
version: '3'services:ruoyi-system:container_name:ruoyi-systembuild:context: /cloud-pck/ruoyi-cloud/systemdockerfile: Dockerfileenvironment:# 時區上海TZ: Asia/Shanghaivolumes:# 配置文件- /docker/ruoyi-system/logs/:/gavino/system/logs# skywalking 探針- /docker/skywalking/agent/:/gavino/skywalking/agentprivileged: truenetworks:- ruoyi-cloud-netnetworks:ruoyi-cloud-net:external: true