Подтвердить что ты не робот

Копирование файла jar в пути класса bootstrap не работает

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
[email protected]
$ 

Если я удалю hello.jar из пути класса расширения и скопирую его в путь класса загрузки (usr/lib/jvm/java-8-openjdk-amd64/jre/lib/), который также содержит rt.jar, тогда мой программа не работает.

$ 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 выбрасывает это Исключение, если оно правильно? Если я не прав, пожалуйста, направляйте меня.

4b9b3361

Ответ 1

Классы Bootstrap очень специфичны по умолчанию, они включают только классы rt.jar и несколько других важных файлов jar, поскольку они защищены и не предназначены для расширения только Классы расширения должны быть расширены путем добавления файлов jar в jre/lib/ext/.

Однако вы можете изменить путь к классам, определяющий классы Bootstrap в Open JDK, запустив JVM следующим образом:

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

-Xbootclasspath/а: путь

Укажите путь разделенных двоеточиями директив, архивов JAR и ZIP архивы для добавления к пути класса bootstrap по умолчанию.

-Xbootclasspath/p: путь

Укажите путь, разделенный двоеточиями, директив, архивов JAR и архивов ZIP для добавления перед путь по умолчанию bootstrap. Примечание. Приложения, которые используют эту опцию с целью переопределения класса в rt.jar не следует развертывать так как это нарушит двоичную среду среды Java 2 Runtime Environment код.

Вот конкретный пример https://wiki.openjdk.java.net/display/mlvm/BootClassPath

Ответ 2

Как Java Launcher находит классы начальной загрузки

классы Bootstrap - это классы, реализующие платформу Java 2. Классы Bootstrap находятся в файле rt.jar и нескольких других jar файлах в каталоге jre/lib. Эти архивы задаются значением пути класса bootstrap, которое хранится в системном свойстве sun.boot.class.path. Это системное свойство только для справки и не должно быть напрямую изменено.

Очень маловероятно, что вам нужно будет переопределить путь класса bootstrap. Нестандартная опция -Xbootclasspath позволяет сделать это в тех редких случаях, когда необходимо использовать другой набор основных классов.

Вышеуказанные утверждения предоставят вам ответы на ваш вопрос.

[Проверить документ Oracle

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

Ответ 3

Я использую java 7 not 8, я надеюсь, что это хорошо для всех версий java.

в java 7, если вы перейдете в эту папку lib, вы увидите файл с именем classlist, если вы его откроете, вы увидите, что там перечислены основные классы (около 2202 класса). Эти классы загружаются из всех файлов jar внутри папки lib. Эти папки содержат только JAVA-apis. Поэтому, чтобы получить доступ к вашей банке, вы должны включить это в файл classlist