关于ClassNOtFoundException异常

在项目中,使用了一个JAR包,单独运行Jar包时(Java -jar jarname.jar),正常,但是将Jar包导入eclipse中,调用jar包就出现了各种错误,都是ClassNOtFoundException。开始手动将这些所引用的项目引入到项目buildpath中,后来烦的不行,因为导入一个项目,解决了一个问题。又有了一个新的类说找不到。后来回头一想,为什么CMD直接运行就可以呢?这是什么原因呢?难度是JAR包和普通的在eclipse中引用有什么不一样么?

百度了好久,最后发现了这个博客:
http://www.cnblogs.com/adolfmc/archive/2012/10/07/2713562.html

摘录一些要点:如下
我们这个项目需要引用其他第三方的jar包,在eclipse里面以项目jar包的形式引用了这个叫做some.jar的包,当时放在项目的lib子目录下,最后项目打包时把这个some.jar也打进来了,但是用java -jar执行这个test.jar的时候报找不到Class异常,原因就是jar引用不到放在自己内部的jar包。

那怎么办?
运行时将其加入classpath的方式行不行?就是在运行jar的同时加入classpath参数:

java -classpath some.jar -jar test.jar

这种方式是不行的,因为使用classpath指定的jar是由AppClassloader来加载,java 命令 加了-jar 参数以后,AppClassloader就只关注test.jar范围内的class了,classpath参数失效。

那该怎么引用其他的jar包呢?

方法一、使用Bootstrap Classloader来加载这些类
我们可以在运行时使用如下参数:

-Xbootclasspath:完全取代系统Java classpath.最好不用。
-Xbootclasspath/a: 在系统class加载后加载。一般用这个。
-Xbootclasspath/p: 在系统class加载前加载,注意使用,和系统类冲突就不好了.

win32 java -Xbootclasspath/a: some.jar;some2.jar; -jar test.jar

unix java -Xbootclasspath/a: some.jar:some2.jar: -jar test.jar

win32系统每个jar用分号隔开,unix系统下用冒号隔开

方法二、使用Extension Classloader来加载

你可以把需要加载的jar都扔到%JRE_HOME%/lib/ext下面,这个目录下的jar包会在Bootstrap Classloader工作完后由Extension Classloader来加载。非常方便,非常省心。

方法三、还是用AppClassloader来加载,不过不需要classpath参数了

我们在MANIFEST.MF中添加如下代码:

Class-Path: lib/some.jar

lib是和test.jar同目录的一个子目录,test.jar要引用的some.jar包就在这里面。

然后测试运行,一切正常!

如果有多个jar包需要引用的情况:

Class-Path: lib/some.jar lib/some2.jar

每个单独的jar用空格隔开就可以了。注意使用相对路径。

另:如果META-INF 下包含INDEX.LIST文件的话,可能会使Class-Path配置失效。INDEX.LIST是Jar打包工具打包时生成的索引文件,删除对运行不产生影响。

方法四、自定义Classloader来加载

这种方法是终极解决方案,基本上那些知名java应用都是那么干的,如tomcat、jboss等等。

这种方式有点复杂,需要专门开贴讨论。关于ClassLoader的原理和自定义ClassLoader可以参考这篇http://cuixiaodong214.blog.163.com/blog/static/951639820099135859761

总结:

以上四种方法都可以用,特别是程序运行在非常单纯的环境中时。但是,如果是运行在多任务,多应用的环境中时,最好每个应用都能相互独立,第一种和第二种方案都有可能对其他应用产生影响,因此最好就是选择第三种和第四种。

### 回答1: ClassNotFoundExceptionJava中的一种异常,表示在运行时找不到类。当Java虚拟机(JVM)尝试加载类时,如果找不到该类,则会抛出ClassNotFoundException异常。这通常发生在以下情况下: 1.类名拼写错误或类文件不存在。 2.类文件存在,但未在类路径中找到。 3.类文件存在,但缺少依赖项。 4.类文件存在,但不兼容当前JVM版本。 当出现ClassNotFoundException异常时,应检查类名拼写是否正确,类文件是否存在,类路径是否正确,以及是否缺少依赖项。 ### 回答2: ClassNotFoundExceptionJava中的一个运行时异常,表示试图加载某个类的时候,该类无法找到。通常情况下,当编写Java应用程序时,编译器会自动检查类的引用是否正确。但在运行时,如果程序试图使用某个类,而该类未被正确加载,就会抛出ClassNotFoundException异常。 通常情况下,ClassNotFoundException异常发生是由于以下原因导致的: 1. 类名拼写错误:输入类名错误时,编译器无法从类路径中找到该类。 2. 缺少依赖:如果程序中使用的类依赖于其他库,而这些库未在classpath中,就会导致该类无法找到。 3. 类被删除或移动:如果程序运行时,对应的类被删除或移动到其他位置,就会导致ClassNotFoundException异常。 4. Java虚拟机版本不匹配:如果程序是在一个高版本的Java虚拟机上编译,而在低版本的Java虚拟机上运行,就会发生ClassNotFoundException异常。 当出现ClassNotFoundException异常时,通常会在控制台打印异常信息,包括异常类型名称、“类名”和堆栈跟踪信息。要解决此类异常,需要仔细检查代码中是否存在类引用问题,以及类路径是否正确等。通常情况下,遵循最佳实践,使用适当的类路径和正确的类名,可以避免此类异常的发生。 ### 回答3: ClassNotFoundException是一种Java编程语言中的运行时异常。当尝试在程序中加载一个类时,如果Java虚拟机无法找到这个类或该类的实现文件,则会抛出ClassNotFoundException异常。它通常出现在以下三种情况: 1. 试图在代码中使用一个不存在的类,或者试图将类的实例化对象格外转型为一个不属于该类继承链上的类。 2. 在一个特定的类中,应用程序动态的加载一个类,但是加载的类不在类路径上。 3. 使用 MySQL 的 JDBC 驱动进行数据库操作时,可能会遇到 ClassNotFoundException 异常,原因是JDBC驱动没有在类路径中正确加载。 通常可以通过以下几种方式来解决 ClassNotFoundException 异常: 1. 检查代码是否存在语法错误,确保正确引用了所需的类。 2. 检查类路径是否正确,并且尝试将类路径添加到CLASSPATH环境变量中。 3. 确保所有所需的库已包含在运行时类路径中。 总之,ClassNotFoundException异常通常是由于编程时类的路径没有正确加载所致。解决方法包括添加正确的类路径,确保正确引用了所需的类等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值