Maven 打包踩坑之ClassNotFoundException 与 NoClassDefFoundError

Maven 打包踩坑之ClassNotFoundException 与 NoClassDefFoundError 

 

问题:

spark streaming程序在本地运行正常,上传至服务器运行时出现如下错误:

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

其中AAA为ClassLoader找不到的jar包名称,BBB为具体调用AAAjar包的项目文件。

 

分析:

对应依赖未打入项目jar包中,经过检查发现和maven 打包插件有关系,自己平常打包会用到两种插件:

maven-jar-plugin

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
            </plugin>

maven-jar-plugin会生成如下形式的两种jar包:

origin为原始jar包,不含其他依赖,下面的为包含pom中依赖的jar包,如果运行环境中未提供自己pom中的其他依赖,使用original

 

maven-assembly-plugin

            <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包后,程序正常运行

回答: java.lang.ClassNotFoundException是一个常见的错误,通常有几个可能的原因。首先,可能是项目中没有引入该类所属的jar包的坐标。你可以查看项目的pom文件,确认是否引入了该jar包的坐标,或者检查项目Maven dependencies下是否有该class的jar包。\[1\]其次,可能是项目中多个maven坐标引入的jar包所依赖有所重叠,导致版本不一致产生冲突。你可以检查刚刚加入的maven坐标所依赖的jar包,项目中其他maven坐标引入的jar包所依赖的jar包是否相同。\[1\]简单的解决办法是,将刚刚引入的jar包注释掉,然后复制Maven dependencies下所有的jar包名称到记事本文件中,再将刚刚引入的jar包解注释,再次复制所有的jar包名称到记事本文件中,最后使用代码比对工具比对两者所引入的jar包的区别,以查看是否有jar包依赖的冲突。\[1\]另外,有时候该错误可能是因为在部署路径下的lib文件夹中缺少相应的jar包。你可以进入到tomcat的部署路径下的lib文件夹,检查是否缺少相应的jar包。\[2\]最后,需要注意的是,该错误通常是在程序运行时找不到类,而不是在编译时找不到类。因此,即使在IDEA编译时没有错,但在运行时仍然可能找不到对应的类。\[3\]希望这些解释能帮助你解决java.lang.ClassNotFoundException的问题。 #### 引用[.reference_title] - *1* [maven工程下 java.lang.ClassNotFoundException原因浅析](https://blog.csdn.net/farYang/article/details/53168233)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Maven项目下java.lang.ClassNotFoundException的解决方法](https://blog.csdn.net/zym2895756/article/details/78233688)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [maven依赖统导致的 java.lang.NoClassDefFoundErrorClassNotFoundException产生原因以及解决方法](https://blog.csdn.net/qq_45171957/article/details/126899231)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BIT_666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值