Maven 打包踩坑之ClassNotFoundException 与 NoClassDefFoundError
Maven 打包踩坑之ClassNotFoundException 与 NoClassDefFoundError问题:spark streaming程序在本地运行正常,上传至服务器运行时出现如下错误:Caused by: java.lang.ClassNotFoundException: AAACaused by: java.lang.NoClassDefFoundError: AAACaused
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包后,程序正常运行
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)