SpringBoot打包减少Jar大小

406 阅读1分钟

我正在参加「掘金·启航计划」

在使用MavenPackage打包时、在pom.xml中一般都是配置这

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

有配置

image.png

无配置

image.png

可以看出没有那段配置打包出来的要文件小很多、但是这个是使用java -jar like-web-1.0-SNAPSHOT.jar是启动不起来的、就是因为jar中没有携带其他引用的依赖导致项目启动不起来。

image.png

下面是为60M的文件包内容、里面是会包含其他引用的依赖如、Spring的Mysql的等等一些引入的依赖的jar都会在里面、这种包含在里面的就可以直接启动

image.png

如何做到项目jarlib分开呢?修改为下方pom.xml配置。

<build>
    <plugins>
        <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>
                        <outputDirectory>${project.build.directory}/lib</outputDirectory>
                        <excludeTransitive>false</excludeTransitive>
                        <stripVersion>false</stripVersion>
                        <includeScope>runtime</includeScope>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <fork>true</fork>
                <layout>ZIP</layout>
                <includes>
                    <include>
                        <!-- 排除所有Jar -->
                        <groupId>nothing</groupId>
                        <artifactId>nothing</artifactId>
                    </include>
                </includes>
            </configuration>
        </plugin>
    </plugins>
</build>

修改完成后再次进行打包会在target下的lib文件夹中就是所依赖的jar文件、而项目文件也就明显的减少的很多

image.png 注意:在使用启动命令时需要加上指定lib的文件位置、原来的是java -jar like-web-1.0-SNAPSHOT.jar现在改成java -jar -Dloader.path="./lib/" like-web-1.0-SNAPSHOT.jar

还有一点需要注意、就是注意lib文件里面的jar就是我们在本地这样跑是没有问题的、但是放在访问上跑就要注意lib的jar文件就比如我项目中这个项目中依赖的一个同级的子项目、我把子项目的代码改了之后在编译然后把项目jar放到服务器运行、后续会出现我们新编译的同级的子项目的jar没有在我们服务器指定的lib文件夹中更新掉、就会出现代码异常的情况。

或者在使用Dockerfile来构建的时候也要指定、注意的是这个是指定的是容器里面的路径、我是启动的时候我这边是docker run的时候指定的挂载路径。

COPY ./like-other*.jar /item/like-other.jar

CMD ["--spring.profiles.active=pro"]

EXPOSE 8089

ENTRYPOINT ["java","-jar","-Dloader.path=/item/lib/","/item/like-other.jar"]

每日一汤

什么是对、什么又是错、只不过是将你以为的以为讲给我听罢了。 什么是对、什么又是错、只不过是将你以为的以为讲给我听罢了。