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

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐