当前位置: 首页 > 知识库问答 >
问题:

复制bootstrap类路径中的jar文件不起作用

梁丘琛
2023-03-14

一个Java代码如下:

public class Hello
{
        public void print()
        {
                System.out.println("Hi");
        }
}
$jar -cvf hello.jar Hello.class
class Test1
{
        public static void main(String[] args)
        {
                new Hello().print();
                System.out.println(Hello.class.getClassLoader());
        }
}
$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

据我所知,引导程序或扩展类加载程序中的所有jar文件都可以在程序中使用。如果这个异常是正确的,为什么Java会抛出这个异常?如果我不正确,请指导我。

共有1个答案

壤驷鸿
2023-03-14

Bootstrap类在默认情况下是非常特定的,它们只包括rt.jar和其他几个重要的jar文件的类,因为它是受保护的,而不是要扩展的,只有扩展类才能通过将jar文件添加到jre/lib/ext/中来扩展。

但是,您可以修改类路径,在Open JDK上定义引导类,方法是启动JVM,如下所示:

java -Xbootclasspath/a:"/path/to/my/folder/classes" Test1

-xbootclasspath/a:path

指定一个以冒号分隔的directires、JAR归档和ZIP归档的路径,以预置在默认引导类路径的前面。注意:不应该部署使用此选项在rt.jar中重写类的应用程序,因为这样做会违反Java2Runtime Environment二进制代码许可证。

下面是一个具体的示例https://wiki.openjdk.java.net/display/mlvm/bootclasspath

 类似资料:
  • 我试图合并2个简单的程序。我想制作成一个。jar文件,这是我编写的代码:(Project1.jar和Project2.exe都打包到这个。jar中) 当我在eclipse中运行项目时,一切都很好(两个文件都像我想要的那样被执行)。但是当我将这个项目导出到。jar并运行它时,什么也没有发生。我认为它与文件路径有关,因为它在Eclipse中运行时工作得很好。怎么解决这个?

  • 我有一个简单的JavaFX项目。它包括: src/app/main.java src/app/controller/maincontroller.java src/app/controller/secondarywindowcontroller.java src/app/view/main.fxml src/app/view/secondarywindow.fxml 控制器MainControll

  • 我正在使用maven构建工具。我的意图是将单独的绝对文件夹[例如:C:\test1.jar,C:\test2.jar]中可用的jar文件添加到类路径中。 我可以看到JAR被添加到war中可用的Manifest.mf文件的类路径中,但当war部署时,它由于“java.lang.ClassNotFoundException”[与test1.jar或test2.jar相关]而失败。 这是否意味着在man

  • 我下载了当前版本的Android Studio(最新截至2013年7月4日)我还下载了JDK版本7u25。 但是,启动后会显示错误:请确保JAVA_HOME指向JDK而不是JRE。 我不知道如何解决这个问题,这让我无法运行IDE。我将非常感谢您的帮助。

  • 问题内容: 任何人都知道为什么该命令在Windows中可以正常工作,但是在Linux中,我得到了ClassNotFoundException game.ui.Main 我的文件夹结构如下:lib /-Jars游戏/-类文件 这是最新的Java 6。 问题答案: 类路径语法与操作系统有关。来自维基百科: 命令行Classpath语法与文件系统密切相关,取决于操作系统。例如: 在所有类似Unix的操作

  • 我希望title本身是描述性的,但要明确的是,我试图在greeting-service.jar中包含(即,error-handling-service.jar)。在构建之后,我在新项目(即TestApplication)中包含了greeting-service.jar,但在执行我得到的TestApplication时(顺便说一句,TestApplication不是一个gradle项目) BaseE