【发布时间】:2017-01-05 12:56:30
【问题描述】:
A 有一个 Java 代码为:
public class Hello
{
public void print()
{
System.out.println("Hi");
}
}
我编译它并创建了一个 Hello.class。我将它添加到一个 Jar 文件 hello.jar 中:
$jar -cvf hello.jar Hello.class
我又写了一个程序:
class Test1
{
public static void main(String[] args)
{
new Hello().print();
System.out.println(Hello.class.getClassLoader());
}
}
并从当前目录中删除了Hello.class。
然后我将 hello.jar 复制到扩展类路径中。我的程序运行良好:
$sudo cp hello.jar /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext
$ java Test1
Hi
sun.misc.Launcher$ExtClassLoader@28d93b30
$
如果我从扩展类路径中删除 hello.jar 并将其复制到包含 rt.jar 的引导类路径 (usr/lib/jvm/java-8-openjdk-amd64/jre/lib/) 中,那么我的程序不工作。
$ java Test1
Exception in thread "main" java.lang.NoClassDefFoundError: Hello
at Test1.main(Test1.java:5)
Caused by: java.lang.ClassNotFoundException: Hello
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 1 more
据我所知,bootstrap 或扩展类加载器中的所有 jar 文件都可以在程序中使用。如果它是正确的,为什么 Java 会抛出该异常?如果我不正确,请指导我。
【问题讨论】:
标签: java jar jvm classloader