2010-01-15 6 views
11

Wir haben eine Anwendung, die in einer JRE-Umgebung ausgeführt wird. Die Anwendung verwendet einige externe jars und wir haben sie in den Ordner JAVA_HOME/lib/ext gelegt. Das hat für uns seit Jahren funktioniert, aber vor kurzem hat sich ein neuer Programmierer unserem Team angeschlossen und scheint nachdrücklich zu betonen, dass dies eine schlechte Sache ist. Ich kann nicht verstehen warum und ich versuche etwas zu recherchieren, bevor ich weiter mit diesem Entwickler arbeite. Gibt es etwas, das mir hier fehlt?Ist das Einfügen von externen JARs in das JAVA_HOME/lib/ext-Verzeichnis eine schlechte Sache?

+11

Gib ihm eine Gehaltserhöhung oder zumindest einen Bonus. Nicht in deinen Händen, sprich mit den Managern. Ernst. –

Antwort

18

Ja - es ist eine schlechte Sache. Denken Sie darüber nach: Die Anwendung hängt von der JRE und einigen zusätzlichen Gläsern ab. Was passiert, wenn Sie die JRE aktualisieren? Dann müssen Sie daran denken, die Dateien in die neue JRE zu kopieren. Was ist, wenn Sie die Anwendung auf einem neuen System einrichten müssen? Sie müssen die Anwendung dorthin kopieren und dann auch daran denken, die externen JARs in die JRE auf diesem System zu kopieren.

Diese beiden Probleme wären überhaupt kein Problem, wenn Sie die Anwendung einfach zusammen mit den benötigten externen JARs packen. Wenn Sie das nicht sehen, ist es vielleicht gar kein Problem. Aber du solltest immer noch dankbar sein, dass der neue Typ seine Meinung teilt.

+2

Es hängt viel von Ihrer persönlichen/betrieblichen Nutzung ab. Für mich ist es normal, nach einem Update das ext-Verzeichnis zu untersuchen, um häufig genutzte Bibliotheken von hier nach dort zu verschieben, zum Beispiel itext (pdf-creation) oder eine Chart-Bibliothek. Wenn es einen Versionskonflikt gibt, möchten Sie es früh kennen und Sie müssen es in beiden Fällen wissen.Kleinere Updates in den Bibliotheken für Bugfixes sind jedoch einfacher zu handhaben, wenn Sie sie an einer Stelle und nicht an mehreren Stellen ausführen. Wenn es ein Programm gibt, das mit solch einer festen Bibliothek nicht umgehen kann, müssen Sie es sowieso individuell reparieren. –

+0

Völlig zustimmen, aber jetzt ist das Problem, was zu tun ist, wenn viele meiner Anwendungen auf die gleiche Bibliothek/Jar angewiesen sind. Ich möchte keine Kopie des Jars in jedes einlegen, denn wenn die Library aktualisiert wird, müsste ich das JAR für alle meine Anwendungen ändern. Ich möchte dieses Glas an einen Ort bringen, an dem alle meine Anwendungen darauf zugreifen können. Existiert ein solcher Ort? Oder muss ich Classpath verwenden (Problem gibt es, wenn ich beschließe, das Jar zu verschieben, muss ich Classpath für alle meine Anwendungen ändern ...)? – Benitok

10

Neben der Antwort von weiji (Verpackung und Upgrades auf neue JVM-Versionen) gibt es weitere Risiken.

Wenn Sie den Sicherheitsmanager in einer Ihrer Anwendungen verwenden, verfügen die Bibliotheken in ext oft über wesentlich mehr Funktionen - sie werden ähnlich wie die Systembibliotheken behandelt. Sie müssen sicherstellen, dass Sie diesen Klassen im Sinne der Durchsetzung von Sicherheitsregeln vertrauen können. Haben die Autoren darüber nachgedacht, was sie richtig belichtet haben? Wenn diese Klassen die Zugriffssteuerung nicht verwenden, um den Sicherheitskontext zu ändern, brauchen Sie sich darüber keine Gedanken zu machen. Wissen Sie, ob sie dies tun oder nicht (z. B. eine Methode, die Zugriff auf eine Datei gewährt und AccessController verwendet)? dass der Anrufer die richtigen Dateiberechtigungen hat?)

Können alle Ihre Anwendungen die exakt gleiche Version der Bibliothek verwenden? Was passiert, wenn Sie diese Bibliothek aktualisieren müssen (nicht nur die JVM)? Werden Sie irgendwelche Ihrer Anwendungen brechen? Sie müssen alles erneut testen. Die Bibliotheken in ext werden vom Erweiterungsklassenlader geladen, der aufgrund der übergeordneten Delegierung einen höheren Vorrang hat als der normale (dh CLASSPATH) Loader, sodass diese von Ihrer Anwendung garantiert verwendet werden und für eine einzelne Anwendung keine Möglichkeit besteht Überschreiben der Bibliothek in ext mit einer anderen Version.

Wenn Sie die Bibliotheken für Ihre Anwendungen freigeben möchten, stellen Sie statt dessen einen separaten Ordner mit allgemeinen Bibliotheken zur Verfügung, in dem Anwendungen individuell konfiguriert werden können (CLASSPATH), auf den verwiesen wird. Dann, wenn Sie Probleme mit einer Anwendung und einer Bibliothek haben, können Sie zu einer anderen Version der Bibliotheken wechseln oder nur für diese eine, früher in den CLASSPATH setzen (wenn das funktioniert, müssen Sie dies auch testen, da möglicherweise andere Abhängigkeiten bestehen Probleme). Dies ermöglicht Ihnen eine individuellere Kontrolle für jede Anwendung. Die Bündelung aller erforderlichen Bibliotheken mit Ihrer Anwendung ist jedoch am sichersten, da Sie Bibliotheksupgrades für einzelne Anwendungen erneut testen und ausrollen können.

1

Auch sieht es so aus, als ob JEP-220 dieses Verhalten scheinbar mit einigen willkürlichen Mitteln abtut, um es möglicherweise durch etwas anderes zu ersetzen.

+0

- halte nicht den Atem an! - –

+0

Tatsächlich wurden die Java SE-Aspekte für den Erweiterungsmechanismus in einer Wartungsversion von JSR 337 (dem JSR für Java SE 8) abgelehnt und dann in Java SE 9/JDK 9 entfernt. Die Befehlszeile '-XX: + CheckEndorsedAndExtDirs' Option ist eine nützliche Option, um zu prüfen, ob Anwendungen, die auf JDK 8 laufen, von dieser Funktion abhängig sind. –

Verwandte Themen