问题
是什么原因造成的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 );
要检查该类是否在类路径中(在我的一个 jar 中),我执行了以下操作:
grep "BasicDb" distribution/target/ldbc-driver-0.1.tar.gz
-> 返回0个匹配项
grep "BasicDb" core/target/core-0.1.jar
-> 返回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