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 会抛出该异常?如果我不正确,请指导我。
最佳答案
Bootstrap 类 默认情况下是非常具体的,它们只包括 rt.jar
类和其他几个重要的 jar 文件,因为它是 protected ,并不意味着仅扩展 扩展类 旨在通过将 jar 文件添加到 jre/lib/ext/
来进行扩展。
但是,您可以修改定义 Open JDK 上的 Bootstrap 类的类路径,方法是如下启动 JVM:
java -Xbootclasspath/a:"/path/to/my/folder/classes" Test1
-Xbootclasspath/a:path
Specify a colon-separated path of directires, JAR archives, and ZIP archives to append to the default bootstrap class path.
-Xbootclasspath/p:path
Specify a colon-separated path of directires, JAR archives, and ZIP archives to prepend in front of the default bootstrap class path. Note: Applications that use this option for the purpose of overriding a class in rt.jar should not be deployed as doing so would contravene the Java 2 Runtime Environment binary code license.
这是一个具体的例子https://wiki.openjdk.java.net/display/mlvm/BootClassPath
关于java - 在引导类路径中复制 jar 文件不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39207173/