2010-08-24 2 views
5

Gibt es Nachteile bei der Verwendung von Java 6 Wildcards in meinem classpath? z.B.Warum sollte ich keinen Platzhalter in meinem Klassenpfad verwenden?

C:> set CLASSPATH=.\lib\* 

Ich kann sehen, dass, wo es zwei Gläser, die sowohl eine Klasse mit dem gleichen Pfad enthalten dann eine Wildcard zu Ergebnissen führen, die auf die Spur hart sind.

Aber abgesehen davon, gibt es noch etwas anderes zu beachten?

+0

fwiw, mein lib-Ordner wird von meinem Maven Build aus meinen Abhängigkeiten mit dem Appassembler-Plugin als Teil der Verpackungsphase neu erstellt. Mein POM ist das letzte Dokument zum Definieren des Klassenpfads. –

Antwort

2

Wenn es das ist, was Sie tun möchten, tun Sie es. Solange Sie sich der Konsequenzen bewusst sind. Denken Sie daran, dass, wenn jemand anderes das Projekt verwalten muss, sie eine Reihe von Gläsern in diesen Ordner kopieren können, ohne zu merken, dass sie standardmäßig verlinkt sind. Es sollte jedoch nicht zu lange dauern, um zu sehen, was vor sich geht.

Ich versuche generell, die Anzahl der JAR-Dateien, die ich verwende, zu minimieren und alle manuell zu verknüpfen. Ich erkenne, dass dies eine persönliche Präferenz ist.

0

Sie geben der JVM möglicherweise viele Orte zum Suchen, dies könnte zu einem Overhead führen, wenn Klassen geladen werden - ich schätze, eine clevere JVM wird dies effizient tun.

1

Sie könnten dadurch unerwünschte Klassen laden, und wenn es zwei Versionen derselben Bibliothek gibt; Nun, Kaboom.

1

Ein expliziter Classpath kann Server als eine Dokumentation dessen, von welchen Bibliotheken (und vielleicht welche Versionen davon!) Die Anwendung abhängt.

Sie verlieren dies, wenn Sie Platzhalter verwenden - wenn es nicht an anderer Stelle dokumentiert ist, wenn jemand eine Kopie der App ohne den Ordner lib bekommt (oder Sie versehentlich löschen), wird es sehr schwer sein, alle aufzuspüren die Abhängigkeiten durch wiederholtes Ausführen der App, Blick auf ClassNotFoundError s und hoffe, dass alle Bibliotheken sinnvolle Paketnamen verwendet.

0

Mein erster Reflex war nicht verwenden env.CLASSPATH, aber auf den zweiten Gedanken und beim Nachdenken über warum sollte man es nicht Ich begann die Idee likeing, zumindest für eine lokale Entwicklungs- und Testumgebung (und zumindest für eine Weile)

der Vorteil dieses Ansatzes ist, dass Sie einen lokalen Ordner mit allen gemeinsamen Bibliotheken halten können (log4j, dom4j, joda Zeit, google Sammlungen, die apache commons Zoo, .. .). So können Sie alle Ihre Anwendungen von der Shell aus kompilieren und ausführen, ohne lange Zeit damit zu verschwenden, lange Klassenpfadargumente einzugeben.

Und Ihr noch frei, ein -cp Argument zu verwenden, weil es die globale CLASSPATH Einstellung ersetzt.

Ich würde es nie auf einem Produktionssystem verwenden. Das Risiko ist einfach zu hoch, dass jemand den Inhalt dieses Ordners oder die CLASSPATH Variable ändert und meine Anwendung nicht mehr funktioniert.

Also für die Produktion, keine globale 'CLASSPATH' und keine Platzhalter in der Klassenpfadzeichenfolge.

Ein Nachteil der Wildcard-Pfad in einer Umgebung wie oben verwenden: Nach einer Weile zu viele Projekte hängen von dem einzelnen Bibliotheksordner ab. Sie kennen die Nebeneffekte des Aktualisierens einer Bibliothek oder des Löschens einer alten Bibliothek nicht. Und für große Anwendungen kann es schwierig sein herauszufinden, welche Bibliotheken aus dem Pool wirklich benötigt werden.Sie könnten am Ende unbenutzte libs zum Produkt hinzufügen, nur weil Sie nicht sicher sind, ob die Anwendung ohne diese lib ausgeführt wird.

Also meine Schlussfolgerung - eine nette Abkürzung für Entwicklung, Tests, Prototyping, aber riskant für die Produktion. Für die Produktion würde ich (automatisch generierte) Klassenpfadzeichenfolgen ohne Platzhalter bevorzugen.

+0

Ich habe nicht nach $ CLASSPATH vs -cp gefragt. Ich würde niemals $ CLASSPATH in einer Produktionsumgebung verwenden. Ich habe nur versucht, die Frage so klar wie möglich zu stellen. –

+0

Ich weiß, dass die Frage nur die Wildcard war, die Antwort ist irgendwie * erweitert *;) –