ClassNotFoundException但类在classpath和同一个jar中

时间:2013-05-23 14:37:52

标签: java classloader classnotfoundexception

问题

导致ClassNotFoundException的原因是什么?

详情

我在尝试加载一个我认为属于类路径的类时得到ClassNotFoundException - 该类为com.ldbc.driver.db.BasicDb,是com.ldbc.driver.db.Db的实现

当我尝试运行此命令时:

java -cp core/target/core-0.1.jar:distribution/target/ldbc-driver-0.1.tar.gz com.ldbc.driver.Client -db com.ldbc.driver.db.BasicDb

我收到错误:

java.lang.ClassNotFoundException: com.ldbc.driver.db.BasicDb
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
    at com.ldbc.driver.util.ClassLoaderHelper.loadClass(ClassLoaderHelper.java:163)
    at com.ldbc.driver.util.ClassLoaderHelper.loadDb(ClassLoaderHelper.java:29)
    at com.ldbc.driver.Client.start(Client.java:167)
    at com.ldbc.driver.Client.main(Client.java:80)

它出现在这一行:

Class<?> loadedClass = classLoader.loadClass( className );

要检查类是否在类路径中(在我的一个罐子中),我执行了以下操作:

grep "BasicDb" distribution/target/ldbc-driver-0.1.tar.gz

- &GT;返回 0 匹配

grep "BasicDb" core/target/core-0.1.jar

- &GT;返回 1 匹配:Binary file core/target/core-0.1.jar matches

如果我在编译时导入该类,它可以正常工作,即以下工作:

import com.ldbc.driver.db.basic.BasicDb;

虽然我的grep测试似乎表明类路径上的 类并且只有,但我想测试是否由于某种原因不同的类附加到不同的根类加载器。

但是当打印它们时,似乎在任何地方都使用相同的类加载器:

ClassLoaderHelper classloader = sun.misc.Launcher$AppClassLoader@489a44f1
Client classloader = sun.misc.Launcher$AppClassLoader@489a44f1

1 个答案:

答案 0 :(得分:3)

com.ldbc.driver.db.BasicDb与导入com.ldbc.driver.db.basic.BasicDb

中的内容相比

您使用错误的BasicDb包名称作为应用程序参数启动了应用程序。

java -cp core/target/core-0.1.jar:distribution/target/ldbc-driver-0.1.tar.gz com.ldbc.driver.Client -db com.ldbc.driver.db.BasicDb