2016-08-29 2 views
18

А есть код Java, как:копирования файла банка в загрузочном пути к классам не работает

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

Я скомпилировал и создал Hello.class. Я добавил его в файл hello.jar 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/Библиотека/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 бросает это Исключение, если оно правильно? Если я не прав, пожалуйста, направляйте меня.

ответ

4

Как Java Launcher Находит Загрузочные классы

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

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

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

[Check 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 
4

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

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

6

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

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

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

-Xbootclasspath/а: путь

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

-Xbootclasspath/р: путь

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

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

Смежные вопросы