my *_*YAN 19 java jvm jar classloader
A有一个Java代码:
public class Hello
{
public void print()
{
System.out.println("Hi");
}
}
Run Code Online (Sandbox Code Playgroud)
我编译了它并创建了一个Hello.class.我将它添加到Jar文件hello.jar中:
$jar -cvf hello.jar Hello.class
Run Code Online (Sandbox Code Playgroud)
我又写了一个程序:
class Test1
{
public static void main(String[] args)
{
new Hello().print();
System.out.println(Hello.class.getClassLoader());
}
}
Run Code Online (Sandbox Code Playgroud)
并从当前目录中删除了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
$
Run Code Online (Sandbox Code Playgroud)
如果我从扩展类路径中删除hello.jar并将其复制到包含rt.jar的boot strap类路径(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
Run Code Online (Sandbox Code Playgroud)
根据我的知识,bootstrap或扩展类加载器中的所有jar文件都可以在程序中使用.为什么Java会抛出异常,如果它是正确的?如果我不对,请指导我.
该自举类在默认情况非常特殊,他们只包括类rt.jar等几个重要的jar文件,因为它是受保护的,并不意味着扩展只扩展类是指通过添加jar文件到扩展jre/lib/ext/.
但是,您可以通过下一步启动JVM 来修改在Open JDK上定义Bootstrap类的类路径:
java -Xbootclasspath/a:"/path/to/my/folder/classes" Test1
Run Code Online (Sandbox Code Playgroud)
-Xbootclasspath /一个:路径
指定以冒号分隔的directires,JAR存档和ZIP存档路径,以附加到默认引导类路径.
-Xbootclasspath/P:路径
指定以冒号分隔的directires,JAR存档和ZIP存档路径,以在缺省引导类路径前面添加前缀.注意:不应部署使用此选项来覆盖rt.jar中的类的应用程序,因为这样做会违反Java 2 Runtime Environment二进制代码许可证.
这是一个具体的例子https://wiki.openjdk.java.net/display/mlvm/BootClassPath
Java 启动器如何查找引导类
Bootstrap 类是实现 Java 2 平台的类。Bootstrap 类位于 jre/lib 目录中的 rt.jar 和其他几个 jar 文件中。这些存档由存储在sun.boot.class.path系统属性中的引导类路径的值指定。该系统属性仅供参考,请勿直接修改。
您不太可能需要重新定义引导类路径。非标准选项 -Xbootclasspath 允许您在极少数需要使用一组不同的核心类的情况下执行此操作。
以上陈述将为您的问题提供答案。
System.out.println(System.getProperty("sun.boot.class.path"));
C:\Program Files\Java\jdk1.8.0_74\jre\lib\resources.jar;
C:\Program Files\Java\jdk1.8.0_74\jre\lib\rt.jar;
C:\Program Files\Java\jdk1.8.0_74\jre\lib\sunrsasign.jar;
C:\Program Files\Java\jdk1.8.0_74\jre\lib\jsse.jar;
C:\Program Files\Java\jdk1.8.0_74\jre\lib\jce.jar;
C:\Program Files\Java\jdk1.8.0_74\jre\lib\charsets.jar;
C:\Program Files\Java\jdk1.8.0_74\jre\lib\jfr.jar;
C:\Program Files\Java\jdk1.8.0_74\jre\classes
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1903 次 |
| 最近记录: |