IDEA构建Maven项目报错:Exception in thread "main" java.lang.NoClassDefFoundError

内容简介

    • 一、异常详情
    • 二、产生的原因
    • 三、解决办法

一、异常详情

    Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/conf/Configuration
  	at com.hadoop.friend.MainAppStepOne.main(MainAppStepOne.java:19)
  Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.conf.Configuration
  	at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
  	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
  	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
  	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
  	... 1 more

这个错误是指特定的类在类路径中找不到,但是Maven依赖已经导入,并且通过了编译,却被告知该类不在classpath下,这是不正常的。

二、产生的原因

查看你的pom.xml文件,查看一下是不是在scope标签里打上了provided:
IDEA构建Maven项目报错:Exception in thread
如果存在,那把scope标签去掉即可。这是IDEA的构建Maven工程的Bug,因为根据Maven官方文档scope标签中的provided 作用如下:
provided 依赖只有在当JDK 或者一个容器已提供该依赖之后才使用。例如, 如果你开发了一个web 应用,你可能在编译 classpath 中需要可用的Servlet API 来编译一个servlet,但是你不会想要在打包好的WAR 中包含这个Servlet API;这个Servlet API JAR 由你的应用服务器或者servlet 容器提供。已提供范围的依赖在编译classpath (不是运行时)可用。它们不是传递性的,也不会被打包。
provided 作用简单的讲就是在打依赖jar包的时候,将provided 标签的jar包排除在外,不打进依赖包中,但是在本地测试时是可以使用provided标签的jar包的,但是IDEA存在一个Bug,不会将provided标签的jar包加入到classpath下,所以会报那个错误。

三、解决办法

将pom.xml文件中的< scope>provided< /scope>标签注释掉即可。如果打依赖包时需要去掉该jar,再加上provided标签就可以了。

你可能感兴趣的:(异常解决)