2016-08-29 16 views
18

A masz kodu Java jak:kopiowania pliku jar w ścieżce klasy bootstrap nie pracuje

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

Skompilowałem go i stworzył Hello.class. Dodałem go do słoika plików hello.jar jak:

$jar -cvf hello.jar Hello.class 

napisałem jeden program jako:

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

i usunięte Hello.class z bieżącego katalogu.

Następnie skopiowałem plik hello.jar w ścieżce rozszerzenia. działa mój program w porządku, jak:

$sudo cp hello.jar /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext 
$ java Test1 
Hi 
[email protected] 
$ 

Jeśli usunę hello.jar od klasy drogi rozbudowa i skopiować go do butów klasy pasek ścieżki (usr/lib/jvm/java-8-openjdk-amd64/jre/lib /), który zawiera także rt.jar, a następnie mój program nie działa.

$ 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 

Zgodnie z moją wiedzą wszystkie pliki jar w bootstrap lub ładowaczu klasy rozszerzeń mogą być używane w programie. Dlaczego Java rzuca ten wyjątek, jeśli jest poprawny? Jeśli nie mam racji, proszę, poprowadź mnie.

Odpowiedz

4

Jak Launcher Java Znajduje Bootstrap Klasy

klasy Bootstrap są klasy, które implementują Java 2 Platform. Klasy Bootstrap znajdują się w pliku rt.jar i kilku innych plikach jar w katalogu jre/lib. Te archiwa są określane przez wartość ścieżki klasy bootstrap, która jest przechowywana we właściwości systemowej sun.boot.class.path. Ta właściwość systemowa służy wyłącznie jako odniesienie i nie należy jej bezpośrednio modyfikować.

Jest bardzo mało prawdopodobne, że trzeba będzie ponownie zdefiniować ścieżkę klasy bootstrap. Opcja niestandardowa, -Xbootclasspath, pozwala to zrobić w tych rzadkich okolicznościach, w których konieczne jest użycie innego zestawu klas podstawowych.

Powyższe stwierdzenia dostarczą odpowiedzi na twoje pytanie.

[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

używam Java 7 nie 8, mam nadzieję, że to jest dobre dla wszystkich wersji java.

w Java 7, jeśli przejdziesz do tego folderu lib można zobaczyć plik o nazwie classlist, jeśli go otworzyć, można zobaczyć wszystkie podstawowe klasy są wymienione tam (około 2202 klas). Te klasy są ładowane ze wszystkich plików JAR wewnątrz folderu lib. Te foldery zawierają tylko api JAVA. Tak więc w celu uzyskania dostępu do słoika należy uwzględnić, że w classlist pliku

6

W klasy Bootstrap są bardzo specyficzne domyślnie obejmują one tylko klas rt.jar i kilku innych ważnych plików jar, jak to jest chronione i nie przeznaczone do rozszerzania tylko Rozszerzenia klasy mają być rozszerzone poprzez dodanie plików JAR do jre/lib/ext/.

jednak można zmodyfikować ścieżkę klasy określającej klasy Bootstrap na Open JDK uruchamiając swój JVM jak obok:

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

-Xbootclasspath/a: ścieżka

Określ dwukropek -oddzielona ścieżka katalogów, archiwów JAR i archiwów ZIP , aby dołączyć do domyślnej ścieżki klasy bootstrap.

-Xbootclasspath/p: ścieżka

określić drogę okrężnicy oddzielonych directires, archiwalnych JAR i ZIP do PREPEND przed domyślnej ścieżce klasy startowej. Uwaga: Aplikacje korzystające z tej opcji w celu nadpisania klasy w pliku rt.jar nie powinny być wdrażane , ponieważ mogłoby to naruszyć binarną licencję kodu Java 2 Runtime Environment .

Oto konkretny przykład https://wiki.openjdk.java.net/display/mlvm/BootClassPath

Powiązane problemy