2010-06-22 13 views
9

Und was sind die Vorteile des Profis?Was ist der Unterschied zwischen Kompilierzeitbibliotheken und Laufzeitbibliotheken in Java?

Ich sah es tatsächlich in Netbeans unter Projekteigenschaften> Bibliotheken für Java-Anwendungen. Wir haben zwei Registerkarten, eine für Kompilierung Bibliotheken und Laufzeit-Bibliotheken, und es sieht aus wie wir eine Bibliothek entweder hinzufügen können unabhängig voneinander

+1

Wer hat Ihnen gesagt, Sie haben eine solche Wahl in Java? –

+0

Vielleicht sind Sie verwirrt durch die Unterscheidung zwischen Compiletime und Runtime Classpaths? – akf

+0

@ Nikita/akf Ich habe es tatsächlich in Netbeans unter Projekteigenschaften> Bibliotheken für Java-Anwendungen gesehen. Wir haben zwei Registerkarten, eine für Kompilierzeitbibliotheken und Laufzeitbibliotheken, und es sieht so aus, als könnten wir eine Bibliothek hinzufügen, die entweder unabhängig voneinander ist – jonasespelita

Antwort

7

Die Benutzeroberfläche und die Terminologie des Dialogfelds Eigenschaften von Bibliotheken ist ziemlich verwirrend.

Die Hilfe-Schaltfläche in diesem Dialogfeld gibt Ihnen ein gutes Stück Informationen.

Die Liste der Kompilierzeitbibliothek kann eine Untergruppe der Liste der Laufzeitbibliothek sein.

diese Situation Betrachten ...

Sie Quellcode haben, die Klassen von auf einer Bibliothek ‚widgets.jar‘ importiert. Die Klassendateien in den Widgets.jar-Referenzsymbolen aus der JAR-Datei 'xml.jar'. Wenn Ihr Quellcode keine Klassen aus der Datei xml.jar importiert, können Sie die Liste Kompilierzeitbibliotheken so definieren, dass sie nur widgets.jar enthält.

Wenn Sie versuchen, Ihr Projekt auszuführen, müssen Sie wahrscheinlich xml.jar in die Liste der Laufzeitbibliotheken aufnehmen, um ClassNotFoundException zu verhindern.

+0

Das war, was ich gesucht habe. Vielen Dank! – jonasespelita

+0

@Alpine: manchmal. Das Einbetten einer Frage in die Kommentare zu StackOverflow vereitelt den Zweck von StackOverflow. Wenn Sie http://stackoverflow.com/questions/ask verwenden, um eine Frage zu stellen, erhalten Sie wahrscheinlich eine bessere Antwort von einer größeren Anzahl von Beantwortern. – vkraemer

11

Es gibt nicht so etwas wie Kompilierung Bibliotheken vs. Laufzeit Bibliotheken

Vielleicht mischen Sie einige Konzepte.

In Java werden die zu verwendenden Bibliotheken zur Kompilierzeit statisch validiert und zur Laufzeit validiert.

Zum Beispiel, wenn Sie IterableMap in der Apache Collections Bibliothek angegeben verwenden möchten. Der Compiler überprüft "zur Kompilierzeit", dass Sie eine Methode aufrufen, die in dieser Klasse existiert.

Aber der Compiler verbindet oder macht nicht viel mit dieser Bibliothek, Sie brauchen es zur Laufzeit noch. Wenn Ihr Code ausgeführt wird, sucht die Java-Laufzeitumgebung also erneut nach dieser Klasse und ruft die Methode auf, für die der Compiler verifiziert wurde.

Und das was es gibt.

+0

Danke für die Info. Aber was für Reflexionen? Wenn wir versuchen, eine Klasse mit Reflektion zu verwenden, wird sich der Compiler nicht beschweren, oder? Etwas wie [dies] (http://www.java-tips.org/java-setips/java.lang.reflect/invoke-method-using-reflection.html) – bdhar

+3

@bdhar - Reflexion ist nur ein anderer Weg Dinge zu tun, die die Validierung sogar später als das Laden von Klassen verschiebt. Der Compiler weiß nichts über die Typisierung der Methoden, die auf diese Weise aufgerufen werden, aber das Laufzeitsystem (speziell die Reflektions-APIs) stellt sicher, dass nichts Unsicheres passiert. –

+0

Danke Stephen .. – bdhar

0

Wie andere gesagt haben, verwirren Sie Konzepte. Ich denke, was Sie wirklich versuchen zu verstehen ist, was Maven als dependency scope bezeichnet. Manchmal benötigen Sie zum Zeitpunkt der Kompilierung nur eine Abhängigkeit, da Sie erwarten, dass sie zur Laufzeit bereitgestellt wird, und manchmal benötigen Sie sie zur Laufzeit, aber nicht zur Kompilierzeit.

1

Vielleicht kommt dies ins Spiel, wenn Sie eine Bibliothek dynamisch laden oder nach einer Existenz der Bibliothek suchen und dann den Code ausführen möchten.

Während der Kompilierung muss der Compiler wissen, was die Signaturen der Methoden, Klassen usw. wissen, wenn Sie Code richtig sind. Daher fügen Sie die Kompilierzeitbibliothek hinzu.

Während der Laufzeit benötigt JVM weiterhin die Bibliothek, um diesen spezifischen Code auszuführen. Sie können jedoch eine Logik einfügen, um diesen Code zu vermeiden, indem Sie prüfen, ob die Bibliothek existiert, beispielsweise indem Sie die Methode Class.for() ausführen. Einige Bibliotheken sind möglicherweise bereits im System vorhanden (z. B. qt.jar) oder nicht, und Sie können Ihren Code entsprechend prüfen und ausführen.

Bitte korrigieren Sie mich, wenn ich falsch liege.

Verwandte Themen