how classloading java jar jvm classloader

java - classloading - Copiar un archivo jar en la ruta de la clase bootstrap no funciona



classloading in java (3)

A tener un código de Java como:

public class Hello { public void print() { System.out.println("Hi"); } }

Lo compilé y creé un Hello.class. Lo agregué a un archivo jar hello.jar como:

$jar -cvf hello.jar Hello.class

Escribí un programa más como:

class Test1 { public static void main(String[] args) { new Hello().print(); System.out.println(Hello.class.getClassLoader()); } }

Y eliminado Hello.class del directorio actual.

Luego copié hello.jar en la ruta de la clase de extensión. Mi programa funciona bien como:

$sudo cp hello.jar /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext $ java Test1 Hi sun.misc.Launcher$ExtClassLoader@28d93b30 $

Si elimino hello.jar de la ruta de la clase de extensión y la copio en la ruta de la clase de la correa de arranque (usr / lib / jvm / java-8-openjdk-amd64 / jre / lib /) que también contiene rt.jar, entonces mi programa no está trabajando.

$ 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

Según mi conocimiento, todos los archivos jar en bootstrap o el cargador de clases de extensión se pueden usar en el programa. ¿Por qué Java lanza esa excepción si es correcta? Si no estoy en lo cierto, por favor guíame.


Cómo el lanzador de Java encuentra clases de arranque

Las clases de arranque son las clases que implementan la plataforma Java 2. Las clases de arranque están en el rt.jar y varios otros archivos jar en el directorio jre / lib. Estos archivos se especifican por el valor de la ruta de la clase bootstrap que se almacena en la propiedad del sistema sun.boot.class.path . Esta propiedad del sistema es solo para referencia y no debe modificarse directamente.

Es muy poco probable que tenga que redefinir la ruta de la clase bootstrap. La opción no estándar, -Xbootclasspath, le permite hacerlo en esas raras circunstancias en las que es necesario usar un conjunto diferente de clases principales.

Las declaraciones anteriores le darían respuestas a su pregunta.

[Compruebe Oracle Doc]

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


Estoy usando Java 7 no 8, espero que esto esté bien para todas las versiones de Java.

en java 7 si va a esta carpeta lib, puede ver un archivo llamado classlist , si lo abre, puede ver que todas las clases básicas están enumeradas allí (alrededor de 2202 clases). Estas clases se cargan desde todos los archivos jar dentro de la carpeta lib. Estas carpetas contienen solo las apis de JAVA. Así que para acceder a tu archivo jar debes incluirlo en el archivo de lista de clases .


Las clases de Bootstrap son muy específicas de manera predeterminada, solo incluyen clases de rt.jar y varios otros archivos jar importantes, ya que están protegidas y no están destinadas a extenderse, solo las clases de extensión deben extenderse agregando archivos jar en jre/lib/ext/ .

Sin embargo, puede modificar la ruta de clase que define las clases Bootstrap en Open JDK iniciando su JVM como sigue:

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

-Xbootclasspath / a: ruta

Especifique una ruta separada por dos puntos de directires, archivos JAR y archivos ZIP para adjuntar a la ruta de clase de rutina predeterminada.

-Xbootclasspath / p: ruta

Especifique una ruta separada por dos puntos de directires, archivos JAR y archivos ZIP para que aparezcan delante de la ruta de la clase bootstrap predeterminada. Nota: Las aplicaciones que utilizan esta opción con el fin de anular una clase en rt.jar no deben implementarse, ya que hacerlo infringiría la licencia del código binario de Java 2 Runtime Environment.

Aquí hay un ejemplo concreto https://wiki.openjdk.java.net/display/mlvm/BootClassPath