SpringBoot Maven 项目打包的艺术--主清单属性缺失与NoClassDefFoundError的优雅解决方案

Maven项目的Jar包打包问题-没有主清单属性&&ClassNotFoundException 与 NoClassDefFoundError

文章目录

这两个问题的出现场景是,你打包完一个SpringBoot、Maven项目,上传Jar包到服务器运行的时候遇到的。也算是比较经典的两个问题了,如果你在打包项目的时候,很容易遇到,这篇文章就是用来一劳永逸地解决它们。

1、问题出现

1.1、Jar包运行:没有主清单属性

解决方案

其实这个问题主要是在IDEA打包环节出现了问题,当我们对打包好的jar包进行解压以后会发现有一个MANIFEST.MF 文件,此文件就是jar运行时要查找的清单目录。

主清单数据,就是我们要运行的主类即程序入口,缺少主清单属性,就不知道从哪开始运行。

因此我们需要对项目进行配置,指定程序入口。

我们需要在POM文件中引入:

xml 复制代码
<plugin>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

spring-boot-maven-plugin是一个Spring Boot插件,用于简化Spring Boot项目的构建和打包。它可以自动化地创建可执行的JAR文件,包括一个嵌入式的Tomcat服务器,这样你就可以直接运行你的应用程序,而不需要先安装Java或Tomcat。

1.2、Springboot打包 Jar 出现 java.lang.NoClassDefFoundError 的问题

Caused by: java.lang.ClassNotFoundException: AAA

Caused by: java.lang.NoClassDefFoundError: AAA

Caused by: java.lang.reflect.InvocationTargetException

java.lang.IllegalArgumentException: Unable to create serializer "com.esotericsoftware.kryo.serializers.FieldSerializer" for class:com.xxx.yyy.BBB

这个问题的出现其实还是跟打包插件有关系 ,我不赞同这篇文章的说法 《【Springboot】打包 Jar 出现 java.lang.NoClassDefFoundError 的问题》

,这篇文章说和引入依赖本身有问题。大家可以试试这个文章的解决方案。

解决方案

谈到maven的打包,我们需要知道我们平时打包的插件有两种:

  • maven-jar-plugin
xml 复制代码
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
            </plugin>
  • maven-assembly-plugin[推荐!]

这个插件的主要作用是帮助你构建一个包含所有依赖的JAR文件。

xml 复制代码
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <appendAssemblyId>true</appendAssemblyId>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>

前者为原始jar包,类似于maven-jar打包里面的origin-jar,后者with-dependencies为包含pom中费provided依赖的jar包,如果线上环境未提供这些依赖,就得使用with-dependencies的jar包。

解决:

使用 maven-assembly-plugin 上传了原始jar包,而生产环境中没有AAA,所以BBB中调用显示no class found,改为上传with-dependicies包后,程序正常运行.

我在打包好jar包以后,上传了服务器,在服务器运行jar包的时候同时遇到了上面两个问题,最后我的pom文件是这么写的:

xml 复制代码
 <build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <appendAssemblyId>true</appendAssemblyId>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

其实就是综合了SpringBoot运行的插件spring-boot-maven-plugin和maven打包插件maven-assembly-plugin两种方式结合使用,大家可以直接复制!

2、参考文献

相关推荐
Amo Xiang7 分钟前
《100天精通Python——基础篇 2025 第5天:巩固核心知识,选择题实战演练基础语法》
python·选择题·基础语法
江梦寻17 分钟前
MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
开发语言·后端·python·macos·架构·策略模式
霖檬ing19 分钟前
Python——MySQL远程控制
开发语言·python·mysql
miniwa23 分钟前
Python编程精进:CSV 模块
python
风象南24 分钟前
SpringBoot的4种死信队列处理方式
java·spring boot·后端
coderSong25687 小时前
Java高级 |【实验八】springboot 使用Websocket
java·spring boot·后端·websocket
老胖闲聊7 小时前
Python Copilot【代码辅助工具】 简介
开发语言·python·copilot
Blossom.1187 小时前
使用Python和Scikit-Learn实现机器学习模型调优
开发语言·人工智能·python·深度学习·目标检测·机器学习·scikit-learn
Mr_Air_Boy8 小时前
SpringBoot使用dynamic配置多数据源时使用@Transactional事务在非primary的数据源上遇到的问题
java·spring boot·后端
曹勖之8 小时前
基于ROS2,撰写python脚本,根据给定的舵-桨动力学模型实现动力学更新
开发语言·python·机器人·ros2