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

这篇具有很好参考价值的文章主要介绍了SpringBoot Maven 项目打包的艺术--主清单属性缺失与NoClassDefFoundError的优雅解决方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

1、问题出现

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

maven打包没有主清单属性,《SpringBoot应用与实战》系列,Spring,《Bug解决与总结》系列,spring boot,maven,python

解决方案

其实这个问题主要是在IDEA打包环节出现了问题,当我们对打包好的jar包进行解压以后会发现有一个MANIFEST.MF文件,此文件就是jar运行时要查找的清单目录。
主清单数据,就是我们要运行的主类即程序入口,缺少主清单属性,就不知道从哪开始运行。
因此我们需要对项目进行配置,指定程序入口。

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

<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
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
            </plugin>
  • maven-assembly-plugin[推荐!]

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

            <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文件是这么写的:

 <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两种方式结合使用,大家可以直接复制!文章来源地址https://www.toymoban.com/news/detail-851188.html

2、参考文献

  • 《【Springboot】打包 Jar 出现 java.lang.NoClassDefFoundError 的问题》

到了这里,关于SpringBoot Maven 项目打包的艺术--主清单属性缺失与NoClassDefFoundError的优雅解决方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Maven高级---聚合(如何将SpringBoot项目打包上线)

    目录 Maven集合要解决的问题 解决办法-Maven聚合 总结 情景:项目已经开发完毕,要将该management工程打包上线. 此时我们点击Maven的打包按钮 但结果是构建失败,提示如下 原因:执行打包时他会在本地仓库中寻找模块,然而Maven本地仓库中并没有这两个模块的jar包,因此就失败了. 此时

    2024年02月07日
    浏览(40)
  • 【Maven】SpringBoot项目使用maven-assembly-plugin插件多环境打包

    1.创建SpringBoot项目并在pom.xml文件中添加maven-assembly-plugin配置 2.创建 在src/main/assembly目录下创建assembly.xml文件 3.在src/main/bin创建在linux环境启动jar包的脚本 4.配置application.yml文件 5.启动项目 6.打包 7.打包后的目录结构 8.上传到linux服务器并启动jar包 9.调用接口测试 10.源码地址

    2024年02月12日
    浏览(43)
  • SpringBoot学习——追根溯源servlet是啥,tomcat是啥,maven是啥 & springBoot项目初步,maven构建,打包 & 测试

    1.追根溯源,servlet是啥,tomcat是啥,maven是啥; 2.前后端开发模式,mvc,mvvc,service层的事务; 3.maven对项目全生命周期的管理,打包jar包和运行; 4.springBoot项目的搭建,pom文件,项目结构,项目环境; 5.Druid连接数据库,管理连接,springBootApplication的exclude; 6.banner.text的使用

    2024年02月13日
    浏览(49)
  • SpringBoot 时 jar 报错 没有主清单属性

    使用阿里版 Spring Initializr 创建的项目。 springboot 2.6.13 JDK 1.8 这里自动开了 skip 。 注释后打的 jar 包就可以运行了。 关键点就是这里注释掉的 !-- skiptrue/skip-- SpringBoot 应用脚手架 Spring Initializr

    2024年02月07日
    浏览(42)
  • SpringBoot学习——项目用maven打包成jar包 & windows + Linux平台运行 & Linux安装java & 遇到的问题

    1.maven打包springboot项目,jar包; 2.windows安装java环境,以及运行jar包; 3.Linux安装java环境,以及运行jar包; 4.运行jar包template might not exist报错及解决; Maven 构建生命周期定义了一个项目构建跟发布的过程。 一个典型的 Maven 构建(build)生命周期是由以下几个阶段的序列组成的

    2024年02月16日
    浏览(74)
  • 开箱即用之 解决 SpringBoot java -jar 没有主清单属性

    如果你的项目是SpringBoot项目是多模块的,比如我的,在最外层使用pom作为整个项目的父项目,后面添加的模块是maven模块,然后选择其中一个作为主启动模块,将springboot相关的启动类和yml文件放进来,后面这个就是项目的启动入口。 遇到的问题: 将项目打包完之后,只有几

    2024年01月21日
    浏览(38)
  • maven环境搭建(打包项目)

    Maven:直观来讲就是打包写好的代码封装 Apahche 软件基金会(非营业的组织,把一些开源软件维护管理起来) maven apahce的一个开宇拿项目,是一个优秀的项目构建(管理工具) maven 管理项目的jar 以及jar与jar之间的依赖 maven 可以完成项目的编译,测试打包 等功能 maven可以完成

    2024年01月18日
    浏览(34)
  • 报错:springboot项目启动,Exception in thread “main“ java.lang.NoClassDefFoundError: org/springframework/com

     异常处理:当启动springboot项目时,报错Exception in thread \\\"main\\\" java.lang.NoClassDefFoundError: org/springframework/core/metrics/ApplicationStartup 报错截图: 解决措施:找到pom.xml,将其 这个部分替换为可运行的springboot项目的(一般为版本问题) 。

    2024年02月16日
    浏览(57)
  • 微服务项目(maven父子级项目)怎么打包

    本篇当中重点记录微服务项目(maven父子级项目)打包插件,文章没有一句废话, 就是直接复制粘贴到自己项目就可以用,亲测有效! 这是最近做的微服务练习,项目是一个典型的聚合工程,mscloud的依赖就是用来管理版本号的,所有微服务有一个公共的依赖模块,就是专门存放

    2023年04月12日
    浏览(33)
  • IDEA中Maven项目打包方式

    方式一: 直接打包,不打包依赖包,仅打包出项目中的代码到JAR包中,可称为架包。在其他应用中运行时,必须保证其上面有相应的依赖包,才能运行。 maven——》Lifecyle——》Clean——》Package 打包成功后就会出现target文件夹 方式二: 打包两个jar包: 一个是架包(只包含程

    2024年02月16日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包