本文转载自:http://blog.csdn.net/qqhjqs/article/details/51491516

使用maven管理web项目中jar包之间的依赖,非常的方便好用,但是有时也会出现问题

项目里用net.sf.json
使用maven配置了以下jar包

jakarta commons-lang 2.5
jakarta commons-beanutils 1.8.0
jakarta commons-collections 3.2.1
jakarta commons-logging 1.1.1
ezmorph 1.0.6

如果将以上的jar包放在非maven管理的项目里的lib下,不会出现任何问题
但是在maven下,当代码跑到
JSONObject.from(str)的时候,控制台报错,错误内容如下:

java.lang.NoClassDefFoundError: org/apache/commons/lang/exception/NestableRuntimeException
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2496)
at org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:860)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1302)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1167)
at com.iquant.simulated.messaging.StrategyManageTopicListener.processMessage(StrategyManageTopicListener.java:13)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)

刚开始我以为是包没有下载成功,或者是版本不对,当时按着这个思路,搞了大半天,确定jar包都下载了,版本也都对。
突然想到,将字符串抽出来,在main方法里跑一下,看是否成功,结果和我想的一样,是成功的,那也就是说在web运行的过程中
"找不到相关的包"
按照这个思路走了下去各种百度各种查。

然后我去tomcate发布目录下将项目的web-inf里的lib打开
查看里面有没有包含找不到的包---没有
然后看了看pom.xml配置文件commons-lang的配置语句

<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
<scope>provided</scope>
</dependency></span>

<scope>provided</scope> 去掉之后成功!

总结了以下,关于maven下的项目,如果出现jar包的问题,应该这样查

是否下载完整---可以将该jar包坐在的文件,删除重新下载
是否版本一致---可以全局定义一个version,下载相关使用version
是否被打包---查看tomcat文件下对应项目中的webinf-lib下有没有对应的jar包,然后在看看pom.xml中是怎样配置的

maven对jar包使用的范围有一些规定

即在jar包配置的后面添加<scope>[compile ,provided,runtime,test,system ]</scope>

名称 解释
compile (编译范围) compile是默认的范围;如果没有提供一个范围,那该依赖的范围就是编译范围。
编译范围依赖在所有的classpath 中可用,同时它们也会被打包。
provided (已提供范围) provided 依赖只有在当JDK 或者一个容器已提供该依赖之后才使用。
例如, 如果你开发了一个web 应用,你可能在编译classpath 中需要
可用的Servlet API 来编译一个servlet,但是你不会想要在打包好的WAR 
中包含这个Servlet API;这个Servlet API JAR 由你的应用服务器或者servlet
 容器提供。已提供范围的依赖在编译classpath (不是运行时)可用。
它们不是传递性的,也不会被打包。
runtime (运行时范围) runtime 依赖在运行和测试系统的时候需要,但在编译的时候不需要。
比如,你可能在编译的时候只需要JDBC API JAR,而只有在运行的时候才需要JDBC驱动实现
test (测试范围) test范围依赖 在一般的编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用。
system (系统范围) system范围依赖与provided 类似,但是你必须显式的提供一个对于本地系统中
JAR 文件的路径。这么做是为了允许基于本地对象编译,而这些对象是系统类库
的一部分。这样的构件应该是一直可用的,Maven 也不会在仓库中去寻找它。
如果你将一个依赖范围设置成系统范围,你必须同时提供一个 systemPath 
元素。注意该范围是不推荐使用的(你应该一直尽量去从公共或定制的 Maven 仓库中引用依赖)。

Maven下java.lang.NoClassDefFoundError的更多相关文章

  1. Maven项目java.lang.NoClassDefFoundError: Lorg/apache/log4j/Logger报错

    本文转载自:http://www.javaweb1024.com/info/894.jspx maven管理的项目,里面已经引入了log4j的包 maven引入如下: <dependency&g ...

  2. Android 编程下 java.lang.NoClassDefFoundError: cn.jpush.android.api.JPushInterface 报错

    使用了极光推送的 jar 包项目在从 SVN 中检出后,假设不又一次对 jar 包和 Bulid Path 进行配置就会抛出 java.lang.NoClassDefFoundError: cn.jp ...

  3. Eclipse下执行main函数报java.lang.NoClassDefFoundError的解决

    今天执行eclipse下的一个java类,无论run还是debug,都报java.lang.NoClassDefFoundError.而且把main中函数都注释掉,执行还是报一样的错. 检查了一下这个 ...

  4. idea创建maven项目报错,Error initializing: org.codehaus.plexus.velocity.DefaultVelocityComponent@56da52a7 java.lang.NoClassDefFoundError: org/apache/commons/lang/StringUtils

    学着使用idea,想创建个maven项目,但是出师不利,立马报错,贼尴尬,错误信息如下: D:\Develop\JDK\bin\java.exe -Dmaven.multiModuleProjectD ...

  5. 报错:maven:java.lang.NoClassDefFoundError: org/apache/commons/io/Charsets

    运行报错: maven:java.lang.NoClassDefFoundError: org/apache/commons/io/Charsets 找不到Charsets这个类 上网查了以后,是因为 ...

  6. maven命令行创建web项目报错:java.lang.NoClassDefFoundError: org/apache/commons/lang/StringUtils

    早上一上班就想新建一个web项目玩玩,没想到一敲命令创建就失败了,真是出师不利.各种折腾无果,当然我也可以用eclipse直接创建的,就是不甘心被这破问题给耍了.刚刚才发现问题原因,这个结果我也是醉了 ...

  7. maven的坑: Exception in thread "pool-1-thread-1" java.lang.NoClassDefFoundError: org/eclipse/aether/spi/connector/Transfer$State

    搭建ReboletricSample的环境: 搭建完成,执行的时候报错: Exception in thread "main" java.lang.NoClassDefFoundE ...

  8. 解决maven install报错:java.lang.NoClassDefFoundError: org/codehaus/plexus/compiler/util/scan/InclusionScanException

    问题:maven install时,报错:java.lang.NoClassDefFoundError: org/codehaus/plexus/compiler/util/scan/Inclusio ...

  9. 使用JSONObject遇到的问题,java.lang.NoClassDefFoundError: net/sf/json/JSONObject

    先是报 java.lang.NoClassDefFoundError: net/sf/json/JSONObject 这个错误, 打开项目属性找到java build path中的libaries,找 ...

随机推荐

  1. Bat文件, Services

    创建Bat文件自启动Windows Service; Services: sc stop/delete/query/find "service name"; Service Fol ...

  2. How can i use iptables save on centos 7?

    I installed CentOS 7 with minimal configuration (os + dev tools). I am trying to open 80 port for ht ...

  3. HDU 1710

    http://acm.hdu.edu.cn/showproblem.php?pid=1710 题意:给二叉树的先序遍历和中序遍历,确定后序遍历 解法:复习专业课找的一题,根据先序遍历和中序遍历建树,再 ...

  4. 字符串反转C#的实现

    字符串反转是面试过程中出现频率较高的算法题,今天一个牛同事让我用C#帮他实现这个算法,前提当然是不能使用类库. 例如: how are you 的反转结果为 you are how. 算法1: 是我当 ...

  5. 你必须牢记的*.Config-配置文件

    在我们第一次写web应用程序的时候,我们很快会接触到一个文件,那就是配置文件——web.config.我们的第一个比较深刻 的使用就是我们不需要把我们的数据库链接零散的写在我们的代码中了,我们只需要在 ...

  6. webclient的简单实用

    这是我在项目中调用别人写好的接口口是使用的1.简单的url传参 List<ArticleModel> result = new List<ArticleModel>(); st ...

  7. C++模板实例化

    深入理解C++中第七章提到模板实例化参数的选择:函数的决议结果只和函数参数有关和返回值无关.记录一下. 测试程序如下: #include <iostream> using namespac ...

  8. Android之QQ新用户注册界面1

    还没到睡觉时间所以再加了一个界面... 问题: 1.下拉列表(因为还没看到这里...) 2.标题栏显示问题 3.按钮的 Enable 设置 .......... 以下是代码: 布局 fragment_ ...

  9. 3-Spark高级数据分析-第三章 音乐推荐和Audioscrobbler数据集

    偏好是无法度量的. 相比其他的机器学习算法,推荐引擎的输出更直观,更容易理解. 接下来三章主要讲述Spark中主要的机器学习算法.其中一章围绕推荐引擎展开,主要介绍音乐推荐.在随后的章节中我们先介绍S ...

  10. laypage

    <%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%> < ...