java - 在引导类路径中复制 jar 文件不起作用

标签 java jar jvm classloader

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/

相关文章:

java - 为什么我无法查询 SolrJ 的 URL?

java - Android - 在应用程序和 Jar 的 HashMap 中动态添加函数

java - Maven 程序集插件 NoClassDefFoundError

java - CONSTANT_MethodHandle_info 和 CONSTANT_MethodType_info

java - Java 8 中 lambda 函数的行为

java - Apache Spark 使用java(分区)

java - 显示 java GUI 时出现问题。它不会显示。我还是个新人,也许包类有问题或者其他什么问题

java - YouTube Android Player API-修改jar源

java - Spring boot 2 + AWS Beanstalk 设置堆大小

java - 一个好的 Java VM 中方法调用的开销是多少?